diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 0000000..c4cfc81 --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,61979 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 0000000..b7595ed --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,265 @@ +{"/workspaces/CurrentDao-backend/src/api-health.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/api-health.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":18}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":31}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":24}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":42}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":31}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":23}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":57}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":6}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":15}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":12}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":22}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":42}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":15}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":6}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":28,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":28,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":28,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":28,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/app.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/app.controller.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":43}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":56}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":15}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":13}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":28}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":57}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":49}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":71}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":38}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":53}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":12}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":42}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":31}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":57}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":58}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":6}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":1},"branchMap":{"0":{"type":"branch","line":8,"loc":{"start":{"line":8,"column":2},"end":{"line":8,"column":57}},"locations":[{"start":{"line":8,"column":2},"end":{"line":8,"column":57}}]},"1":{"type":"branch","line":12,"loc":{"start":{"line":12,"column":2},"end":{"line":14,"column":3}},"locations":[{"start":{"line":12,"column":2},"end":{"line":14,"column":3}}]}},"b":{"0":[1],"1":[1]},"fnMap":{"0":{"name":"AppController","decl":{"start":{"line":8,"column":2},"end":{"line":8,"column":57}},"loc":{"start":{"line":8,"column":2},"end":{"line":8,"column":57}},"line":8},"1":{"name":"getHello","decl":{"start":{"line":12,"column":2},"end":{"line":14,"column":3}},"loc":{"start":{"line":12,"column":2},"end":{"line":14,"column":3}},"line":12},"2":{"name":"getHealth","decl":{"start":{"line":18,"column":2},"end":{"line":26,"column":3}},"loc":{"start":{"line":18,"column":2},"end":{"line":26,"column":3}},"line":18}},"f":{"0":1,"1":1,"2":0}} +,"/workspaces/CurrentDao-backend/src/app.module.ts": {"path":"/workspaces/CurrentDao-backend/src/app.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":40}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":58}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":48}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":50}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":54}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":49}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":55}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":43}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":82}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":69}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":71}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":60}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":45}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":57}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":69}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":63}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":64}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":66}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":81}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":77}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":70}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":48}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":57}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":60}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":9}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":12}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":21}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":44}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":7}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":19}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":18}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":49}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":68}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":2}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":25}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":53,"column":25}},"locations":[{"start":{"line":1,"column":0},"end":{"line":53,"column":25}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":53,"column":25}},"loc":{"start":{"line":1,"column":0},"end":{"line":53,"column":25}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/app.service.ts": {"path":"/workspaces/CurrentDao-backend/src/app.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":71}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":30}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":42}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":6}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"branchMap":{"0":{"type":"branch","line":5,"loc":{"start":{"line":5,"column":2},"end":{"line":11,"column":3}},"locations":[{"start":{"line":5,"column":2},"end":{"line":11,"column":3}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"getHello","decl":{"start":{"line":5,"column":2},"end":{"line":11,"column":3}},"loc":{"start":{"line":5,"column":2},"end":{"line":11,"column":3}},"line":5}},"f":{"0":1}} +,"/workspaces/CurrentDao-backend/src/health.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/health.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":40}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":63}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":31}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":67}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":53}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":66}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":68}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":43}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":9}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":69}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":26}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":44}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":25}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":59}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":52}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":62}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":28}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":44}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":29}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":9}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":56}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":64}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":68}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":46}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":9}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":69}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":24}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":44}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":32}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":29}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":38}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":10}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":8}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":51}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":62}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":28}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":44}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":29}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":9}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":5}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":62,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":62,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":62,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":62,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/main.ts": {"path":"/workspaces/CurrentDao-backend/src/main.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":41}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":43}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":65}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":41}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":85}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":81}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":77}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":28}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":32}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":50}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":43}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":65}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":56}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":64}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":24}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":33}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":7}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":4}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":48}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":47}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":35}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":58}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":31}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":53}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":47}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":46}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":30}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":22}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":26}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":46}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":40}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":41}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":72}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":24}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":28}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":20}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":23}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":63}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":51}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":40}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":25}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":60}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":68}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":69}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":59}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":1}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":12}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":79,"column":12}},"locations":[{"start":{"line":1,"column":0},"end":{"line":79,"column":12}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":79,"column":12}},"loc":{"start":{"line":1,"column":0},"end":{"line":79,"column":12}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/ab-testing.service.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/ab-testing.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":31}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":53}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":59}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":64}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":65}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":39}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":19}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":29}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":63}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":73}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":58}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":64}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":43}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":12}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":25}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":62}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":23}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":6}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":62}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":60}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":42,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":42,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":42,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":42,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/ai-recommendations.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/ai-recommendations.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":69}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":78}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":56}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":30}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":33}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":42}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":71}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":52}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":62}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":53}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":6}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":8}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":73}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":54}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":4}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":36}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":35}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":76}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":58}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":77}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":72}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":64}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":35}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":55}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":71}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":29}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":56}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":20}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":38}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":36}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":60}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":63}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":56}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":29}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":62}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":23}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":26}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":25}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":6}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":27}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":64}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":16}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":16}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":54}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":4}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":45}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":53}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":54}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":64}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":64}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":55}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":34}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":52}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":73}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":73}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":57}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":84,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":84,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":84,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":84,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/ai-recommendations.module.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/ai-recommendations.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":66}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":64}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":78}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":56}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":78}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":56}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":45}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":24}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":39}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":39}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":39}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":39}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":39}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/market-pattern.service.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/market-pattern.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":32}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":15}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":47}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":20}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":1}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":35}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":66}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":71}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":68}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":41}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":34}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":29}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":57}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":40}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":75}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":42}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":22}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":73}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":37}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":23}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":49}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":60}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":39}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":41}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":39}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":13}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":60}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":60}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":21}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":24}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":59}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":68}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":43}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":49}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":43}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":24}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":31}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":47}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":12}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":7}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":29}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":24}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":37}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":8}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":6}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":31}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":67}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":12}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":7}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":35}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":22}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":29}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":25}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":24}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":40}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":8}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":6}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":38}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":24}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":12}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":7}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":29}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":24}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":38}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":8}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":6}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":3}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":111,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":111,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":111,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":111,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/ml-model.service.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/ml-model.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":57}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":34}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":20}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":1}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":29}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":60}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":83}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":16}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":38}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":36}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":31}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":48}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":26}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":42}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":6}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":42}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":57}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":56}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":41}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":40}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":27}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":19}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":19}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":44}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":63}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":52}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":54}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":3}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":26}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":38}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":36}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":10}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":47}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":48}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":48}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":69}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":67}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":59}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":47}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":6}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":71}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":40}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":65}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":53}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":73}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":10}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":41}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":70}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":42}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":25}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":75}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":73}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":45}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":71}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":42}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":63}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":32}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":70}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":49}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":46}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":53}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":12}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":13}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":33}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":32}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":6}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":3}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":21}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":22}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":39}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":12}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":37}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":22}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":6}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":126,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":126,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":126,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":126,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/recommendation-engine.service.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/recommendation-engine.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":64}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":17}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":18}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":43}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":42}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":73}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":62}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":64}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":52}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":6}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":32}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":25}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":41}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":69}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":65}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":38}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":67}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":44}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":30}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":55}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":18}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":6}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":45}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":42}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":66}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":36}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":26}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":25}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":61}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":59}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":21}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":23}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":8}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":46}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":53}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":60}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":57}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":61}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":25}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":20}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":10}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":64}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":7}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":25}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":31}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":20}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":22}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":71}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":77}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":12}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":13}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":11}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":88}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":66}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":45}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":22}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":42}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":67}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":63}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":50}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":40}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":44}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":32}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":8}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":6}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":3}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":77}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":17}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":38}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":18}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":39}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":14}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":39}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":5}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":3}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":69}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":60}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":56}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":57}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":54}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":36}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":73}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":21}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":91}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":65}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":64}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":64}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":6}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":30}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":58}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":12}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":7}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":31}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":22}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":38}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":25}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":8}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":6}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":3}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":65}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":55}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":152,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":152,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":152,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":152,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/user-behavior.service.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/user-behavior.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":17}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":38}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":31}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":46}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":28}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":59}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":30}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":29}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":13}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":34}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":65}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":14}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":37}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":68}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":6}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":75}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":61}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":64}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":68}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":12}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":65}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":71}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":63}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":67}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":61}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":63}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":61}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":58}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":55}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":12}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":31}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":44}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":60}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":57}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":35}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":29}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":47}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":20}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":66}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":38}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":7}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":39}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":54}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":57}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":22}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":77}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":8}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":71}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":49}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":65}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":60}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":96}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":30}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":36}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":26}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":32}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":81}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":41}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":45}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":18}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":3}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":63}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":44}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":46}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":55}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":19}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":8}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":35}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":6}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":38}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":34}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":18}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":31}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":68}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":46}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":44}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":39}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":8}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":6}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":45}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":63}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":48}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":79}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":52}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":32}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":49}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":66}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":64}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":59}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":24}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":3}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":56}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":26}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":5}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":60}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":50}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":35}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":54}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":39}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":12}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":58}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":57}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":6}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":3}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":160,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":160,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":160,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":160,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/dto/recommendation.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/dto/recommendation.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":11}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":9}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":71}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":38}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":42}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":17}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":64}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":54}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":29}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":64}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":13}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":61}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":15}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":13}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":38}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":11}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":27}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":52}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":42}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":54}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":27}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":46}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":22}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":44}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":51}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":26}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":64}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":23}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":64}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":23}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":45}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":69,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/ai/recommendations/entities/recommendation.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/ai/recommendations/entities/recommendation.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":32}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":14}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":16}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":1}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":29}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":24}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":14}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":26}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":26}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":29}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":33}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":13}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":17}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":10}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":53}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":22}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":11}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":36}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":35}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":16}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":10}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":23}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":29}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":23}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":29}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":20}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":29}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":20}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":29}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":46}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":29}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":24}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":21}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":18}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":28}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":20}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":65}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":69}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":37}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":40}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":6}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":90,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/analytics/analytics.module.ts": {"path":"/workspaces/CurrentDao-backend/src/analytics/analytics.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":55}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":65}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":70}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":66}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":74}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":76}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":55}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":14}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":4}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":30}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":2}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":31}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":21,"column":31}},"locations":[{"start":{"line":1,"column":0},"end":{"line":21,"column":31}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":21,"column":31}},"loc":{"start":{"line":1,"column":0},"end":{"line":21,"column":31}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/analytics/analytics.service.ts": {"path":"/workspaces/CurrentDao-backend/src/analytics/analytics.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":46}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":42}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":79}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":70}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":66}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":74}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":76}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":36}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":59}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":53}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":49}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":57}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":59}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":6}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":35}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":5}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":62}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":59}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":33}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":60}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":57}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":37}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":64}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":61}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":38}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":5}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":65}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":62}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":36}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":58}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":52}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":73}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":31}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":25}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":21}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":36}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":8}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":16}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":22}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":29}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":24}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":37}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":33}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":8}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":33}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":74}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":60}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":58}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":72}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":62}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":38}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":41}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":68}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":18}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":16}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":8}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":78}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":5}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":28}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":41}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":70}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":18}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":16}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":8}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":70}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":31}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":44}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":70}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":18}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":16}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":8}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":25}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":80}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":24}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":74}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":25}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":27}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":33}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":29}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":64}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":56}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":3}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":42}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":5}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":25}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":24}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":30}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":20}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":24}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":21}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":31}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":49}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":38}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":48}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":58}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":31}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":28}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":62}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":9}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":20}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":18}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":10}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":8}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":5}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":17}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":70}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":67}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":19}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":9}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":18}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":73}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":5}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":56}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":34}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":3}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":5}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":39}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":5}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":21}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":20}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":35}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":31}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":21}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":18}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":51}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":17}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":45}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":17}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":45}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":14}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":71}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":3}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":5}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":41}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":5}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":23}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":30}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":40}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":25}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":28}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":20}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":64}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":53}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":78}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":56}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":35}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":3}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":66}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":49}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":38}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":52}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":59}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":60}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":63}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":78}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":72}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":8}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":19}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":0}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":56}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":56}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":68}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":60}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":6}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":3}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":75}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":53}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":38}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":52}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":78}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":72}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":18}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":16}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":9}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":57}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":38}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":56}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":80}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":72}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":18}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":16}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":9}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":74}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":35}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":39}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":7}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":72}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":37}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":52}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":6}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":12}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":18}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":22}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":78}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":6}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":3}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":76}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":49}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":38}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":70}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":40}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":46}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":8}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":72}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":18}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":16}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":8}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":19}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":12}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":57}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":6}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":3}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":72}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":35}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":38}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":45}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":50}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":54}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":78}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":72}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":18}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":16}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":8}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":48}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":35}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":46}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":16}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":20}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":3}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":33}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":18}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":18}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":5}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":35}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":38}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":43}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":73}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":53}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":80}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":72}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":18}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":16}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":8}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":47}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":34}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":60}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":19}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":20}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":65}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":53}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":38}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":49}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":53}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":45}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":75}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":47}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":41}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":8}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":72}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":18}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":16}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":8}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":44}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":33}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":20}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":38}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":32}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":43}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":43}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":8}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":3}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":0}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":43}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":92}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":48}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":49}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":35}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":3}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":43}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":88}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":50}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":41}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":3}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":367,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":367,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":367,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":367,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/analytics/dto/report-params.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/analytics/dto/report-params.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":9}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":11}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":6}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":6}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":41}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":54}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":43}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":16}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":14}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":30}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":44}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":15}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":24}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":24}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":51}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":28}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":4}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":28}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":52}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":15}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":11}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":19}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":50}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":26}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":4}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":19}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":17}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":24}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":60}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":24}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":65}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":24}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":13}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":42}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":29}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":15}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":13}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":24}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":40}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":23}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":31}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":15}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":23}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":44}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":24}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":71}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":4}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":15}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":46}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":24}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":48}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":4}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":15}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":46}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":71}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":15}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":4}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":15}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":21}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":13}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":11}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":35}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":24}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":49}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":19}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":4}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":15}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":29}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":1}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":34}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":24}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":64}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":16}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":15}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":18}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":4}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":15}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":13}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":9}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":12}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":32}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":24}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":48}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":4}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":15}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":46}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":52}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":18}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":4}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":43}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":24}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":56}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":4}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":15}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":43}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":162,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":162,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":162,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":162,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/analytics/entities/analytics-data.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/analytics/entities/analytics-data.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":27}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":36}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":30}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":40}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":42}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":40}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":31}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":26}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":39}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":33}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":11}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":17}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":4}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":11}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":28}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":4}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":28}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":32}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":18}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":29}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":19}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":27}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":28}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":71}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":71}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":24}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":46}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":17}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":70}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":22}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":43}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":14}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":20}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":23}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":22}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":18}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":21}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":88,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":88,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":88,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":88,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/analytics/reports/market-efficiency.report.ts": {"path":"/workspaces/CurrentDao-backend/src/analytics/reports/market-efficiency.report.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":42}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":21}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":37}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":29}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":41}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":11}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":14}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":35}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":12}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":30}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":34}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":37}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":33}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":37}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":26}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":28}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":19}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":23}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":22}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":28}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":23}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":6}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":1}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":13}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":37}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":36}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":59}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":23}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":38}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":21}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":89}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":49}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":60}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":35}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":57}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":14}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":13}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":13}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":35}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":51}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":45}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":66}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":70}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":18}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":30}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":57}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":16}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":14}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":13}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":6}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":31}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":66}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":12}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":15}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":25}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":28}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":8}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":14}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":14}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":27}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":19}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":22}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":6}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":3}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":42}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":20}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":18}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":30}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":28}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":41}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":49}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":38}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":40}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":46}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":8}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":57}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":72}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":18}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":16}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":9}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":67}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":38}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":9}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":25}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":61}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":32}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":9}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":55}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":55}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":40}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":46}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":14}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":34}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":69}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":71}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":65}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":63}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":67}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":75}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":75}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":75}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":39}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":51}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":10}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":8}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":7}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":64}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":31}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":14}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":25}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":29}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":28}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":33}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":36}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":32}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":8}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":5}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":25}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":75}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":29}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":73}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":28}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":72}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":34}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":78}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":48}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":90}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":101}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":94}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":62}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":33}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":79}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":8}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":78}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":36}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":54}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":58}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":77}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":20}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":24}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":23}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":28}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":31}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":27}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":6}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":3}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":44}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":39}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":13}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":37}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":70}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":28}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":46}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":59}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":64}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":81}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":79}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":58}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":5}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":58}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":3}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":40}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":18}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":28}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":5}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":49}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":38}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":45}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":66}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":68}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":66}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":78}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":40}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":46}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":8}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":72}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":18}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":16}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":8}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":48}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":36}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":28}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":67}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":38}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":9}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":5}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":52}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":36}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":54}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":62}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":60}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":72}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":51}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":59}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":66}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":59}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":57}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":29}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":22}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":27}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":26}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":33}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":10}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":14}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":32}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":24}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":15}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":18}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":8}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":7}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":3}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":37}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":20}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":18}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":28}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":5}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":37}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":49}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":38}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":63}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":78}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":68}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":50}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":40}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":46}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":8}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":72}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":18}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":16}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":8}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":56}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":30}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":28}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":67}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":38}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":9}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":25}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":61}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":32}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":9}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":52}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":37}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":34}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":71}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":45}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":55}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":8}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":3}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":59}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":41}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":0}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":39}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":27}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":102}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":8}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":5}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":42}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":27}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":111}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":8}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":5}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":39}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":27}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":100}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":8}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":5}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":45}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":27}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":115}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":8}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":5}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":48}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":27}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":107}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":8}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":5}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":44}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":27}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":114}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":8}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":5}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":39}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":27}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":104}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":8}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":5}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":27}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":3}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":32}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":24}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":21}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":39}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":49}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":38}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":40}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":46}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":8}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":47}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":41}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":8}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":45}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":16}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":21}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":67}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":19}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":9}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":5}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":0}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":18}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":73}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":5}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":0}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":51}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":0}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":22}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":52}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":29}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":14}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":23}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":27}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":27}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":25}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":23}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":26}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":30}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":39}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":29}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":32}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":8}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":5}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":50}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":12}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":38}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":67}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":69}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":63}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":61}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":65}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":73}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":73}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":73}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":79}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":6}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":3}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":438,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":438,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":438,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":438,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/analytics/reports/price-trends.report.ts": {"path":"/workspaces/CurrentDao-backend/src/analytics/reports/price-trends.report.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":33}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":17}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":16}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":37}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":15}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":39}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":36}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":11}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":35}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":12}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":24}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":31}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":23}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":25}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":25}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":46}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":25}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":45}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":19}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":24}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":6}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":13}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":36}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":59}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":6}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":77}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":89}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":49}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":60}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":48}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":16}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":14}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":13}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":35}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":53}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":49}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":65}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":51}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":18}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":44}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":65}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":77}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":18}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":12}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":15}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":25}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":21}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":28}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":8}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":14}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":22}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":26}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":6}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":31}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":20}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":30}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":28}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":32}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":49}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":38}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":75}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":57}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":72}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":18}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":16}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":24}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":59}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":30}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":9}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":5}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":28}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":67}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":38}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":25}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":61}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":32}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":9}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":55}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":55}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":40}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":41}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":14}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":34}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":50}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":52}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":48}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":46}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":48}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":50}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":8}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":7}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":52}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":28}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":14}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":24}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":30}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":22}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":24}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":24}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":23}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":35}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":8}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":5}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":53}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":36}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":50}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":30}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":60}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":44}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":24}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":68}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":45}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":44}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":59}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":23}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":45}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":30}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":66}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":7}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":5}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":22}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":78}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":22}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":63}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":50}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":56}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":12}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":18}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":25}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":17}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":19}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":19}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":18}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":6}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":3}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":38}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":27}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":27}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":48}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":44}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":46}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":48}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":21}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":21}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":54}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":7}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":51}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":48}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":21}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":21}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":54}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":7}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":48}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":46}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":21}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":18}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":44}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":7}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":11}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":44}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":21}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":19}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":28}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":46}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":7}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":22}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":3}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":68}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":29}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":54}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":24}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":37}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":36}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":29}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":5}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":15}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":3}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":68}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":29}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":40}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":21}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":76}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":18}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":50}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":24}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":77}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":27}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":5}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":15}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":3}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":68}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":29}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":31}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":32}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":45}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":47}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":42}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":53}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":5}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":53}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":21}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":79}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":21}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":80}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":57}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":37}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":5}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":15}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":3}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":44}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":23}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":25}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":24}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":5}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":48}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":48}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":0}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":32}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":31}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":65}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":6}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":46}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":54}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":0}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":42}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":35}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":17}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":75}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":6}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":0}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":47}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":3}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":29}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":21}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":18}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":34}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":52}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":42}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":58}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":40}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":28}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":47}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":29}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":14}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":29}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":7}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":5}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":19}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":3}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":29}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":21}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":18}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":34}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":48}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":3}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":74}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":31}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":35}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":36}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":20}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":7}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":3}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":0}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":37}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":23}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":25}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":24}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":35}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":52}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":77}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":0}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":41}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":50}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":28}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":57}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":29}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":14}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":29}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":7}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":5}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":0}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":19}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":3}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":0}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":39}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":20}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":18}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":30}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":28}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":5}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":49}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":38}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":44}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":63}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":75}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":57}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":72}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":18}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":16}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":8}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":48}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":36}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":24}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":59}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":30}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":9}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":5}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":0}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":52}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":37}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":28}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":59}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":60}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":59}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":8}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":3}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":64}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":79}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":80}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":20}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":78}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":31}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":3}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":418,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":418,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":418,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":418,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/analytics/reports/trading-volume.report.ts": {"path":"/workspaces/CurrentDao-backend/src/analytics/reports/trading-volume.report.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":46}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":36}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":17}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":28}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":38}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":11}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":35}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":4}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":12}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":24}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":30}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":35}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":25}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":23}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":28}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":18}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":6}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":30}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":24}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":23}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":1}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":34}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":14}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":36}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":59}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":79}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":21}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":89}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":49}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":60}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":32}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":57}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":16}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":13}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":13}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":6}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":35}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":54}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":44}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":65}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":69}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":18}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":37}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":76}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":15}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":25}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":28}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":8}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":14}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":23}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":26}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":31}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":6}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":39}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":20}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":18}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":30}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":28}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":35}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":49}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":38}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":78}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":57}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":72}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":18}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":16}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":9}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":24}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":59}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":30}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":67}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":38}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":9}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":61}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":32}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":9}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":55}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":55}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":41}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":32}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":30}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":60}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":36}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":79}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":26}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":8}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":3}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":55}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":28}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":23}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":22}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":29}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":34}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":22}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":35}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":22}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":8}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":73}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":71}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":45}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":8}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":6}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":34}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":65}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":23}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":33}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":61}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":14}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":63}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":22}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":21}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":78}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":13}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":12}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":12}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":17}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":24}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":29}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":34}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":41}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":17}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":6}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":39}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":20}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":18}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":28}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":49}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":38}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":45}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":50}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":54}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":78}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":72}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":18}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":16}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":8}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":48}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":35}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":47}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":24}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":59}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":30}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":9}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":5}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":52}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":39}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":58}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":8}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":6}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":35}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":28}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":45}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":43}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":17}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":23}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":64}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":14}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":8}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":44}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":20}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":18}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":28}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":5}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":31}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":53}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":38}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":52}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":78}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":72}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":18}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":16}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":9}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":24}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":63}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":30}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":9}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":5}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":65}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":74}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":34}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":57}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":38}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":56}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":80}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":72}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":18}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":16}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":9}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":24}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":67}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":30}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":9}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":5}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":73}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":39}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":52}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":6}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":12}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":22}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":18}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":78}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":6}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":3}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":0}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":29}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":28}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":35}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":32}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":16}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":39}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":7}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":28}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":28}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":35}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":32}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":16}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":38}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":7}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":3}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":29}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":28}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":35}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":32}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":16}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":39}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":7}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":3}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":0}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":30}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":28}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":35}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":32}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":16}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":40}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":7}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":3}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":321,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":321,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":321,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":321,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/analytics/reports/user-performance.report.ts": {"path":"/workspaces/CurrentDao-backend/src/analytics/reports/user-performance.report.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":41}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":22}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":22}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":21}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":21}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":28}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":27}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":32}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":29}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":36}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":40}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":11}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":16}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":14}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":35}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":38}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":19}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":23}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":6}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":17}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":23}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":21}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":23}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":25}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":25}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":22}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":8}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":18}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":27}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":27}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":8}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":27}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":27}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":27}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":6}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":28}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":13}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":36}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":14}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":36}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":59}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":37}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":25}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":73}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":89}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":49}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":60}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":34}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":56}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":20}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":14}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":13}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":6}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":38}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":63}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":16}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":14}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":13}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":6}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":44}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":58}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":14}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":6}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":32}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":68}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":16}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":14}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":6}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":31}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":70}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":12}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":15}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":8}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":21}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":18}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":27}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":22}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":6}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":37}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":20}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":18}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":28}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":38}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":54}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":38}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":51}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":55}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":59}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":67}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":80}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":57}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":72}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":18}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":16}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":8}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":19}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":27}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":57}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":38}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":70}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":81}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":7}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":80}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":57}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":72}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":18}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":16}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":8}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":32}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":56}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":38}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":56}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":80}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":57}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":72}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":16}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":8}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":19}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":66}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":68}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":66}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":78}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":79}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":73}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":76}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":29}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":64}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":78}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":33}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":58}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":37}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":66}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":29}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":56}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":13}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":16}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":14}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":6}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":60}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":18}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":14}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":12}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":13}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":18}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":18}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":17}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":34}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":24}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":14}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":23}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":28}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":57}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":43}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":43}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":45}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":32}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":6}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":3}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":37}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":19}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":20}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":18}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":14}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":31}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":24}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":24}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":6}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":46}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":55}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":38}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":62}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":80}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":57}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":72}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":18}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":16}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":8}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":44}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":20}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":32}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":51}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":32}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":31}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":71}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":5}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":29}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":79}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":20}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":72}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":21}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":50}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":23}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":65}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":33}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":24}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":17}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":29}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":39}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":37}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":46}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":47}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":52}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":5}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":40}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":41}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":30}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":66}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":12}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":25}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":18}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":18}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":6}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":3}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":36}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":24}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":20}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":18}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":13}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":27}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":72}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":6}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":45}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":3}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":41}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":19}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":18}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":30}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":5}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":35}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":38}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":49}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":63}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":73}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":49}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":80}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":57}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":57}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":72}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":18}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":16}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":8}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":44}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":20}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":39}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":19}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":20}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":18}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":13}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":72}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":5}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":35}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":57}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":38}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":70}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":80}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":57}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":72}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":18}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":16}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":8}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":19}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":70}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":42}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":54}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":38}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":43}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":73}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":80}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":72}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":18}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":16}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":8}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":34}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":60}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":20}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":42}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":77}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":22}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":68}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":44}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":3}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":0}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":40}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":19}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":20}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":18}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":5}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":31}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":53}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":38}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":47}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":59}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":68}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":53}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":17}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":86}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":18}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":7}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":80}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":57}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":72}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":18}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":16}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":8}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":51}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":67}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":20}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":33}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":54}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":38}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":51}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":73}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":80}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":57}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":72}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":18}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":16}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":8}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":19}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":0}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":58}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":38}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":55}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":77}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":80}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":57}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":72}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":18}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":16}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":8}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":19}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":60}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":72}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":43}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":12}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":45}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":28}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":45}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":55}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":53}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":55}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":10}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":21}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":20}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":78}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":32}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":64}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":10}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":23}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":21}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":61}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":68}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":35}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":67}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":10}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":8}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":6}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":3}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":0}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":78}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":41}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":0}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":31}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":27}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":113}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":8}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":5}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":0}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":34}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":27}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":122}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":8}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":5}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":0}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":35}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":27}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":99}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":8}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":5}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":0}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":49}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":27}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":137}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":8}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":5}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":0}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":40}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":27}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":118}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":8}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":5}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":40}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":27}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":116}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":8}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":5}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":0}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":39}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":27}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":101}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":8}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":5}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":0}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":27}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":3}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":500,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":500,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":500,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":500,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/apm/apm.module.ts": {"path":"/workspaces/CurrentDao-backend/src/apm/apm.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":78}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":65}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":54}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":88}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":74}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":14}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":28}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":17}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":32}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":4}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":12}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":28}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":32}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":4}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":2}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":25}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":25,"column":25}},"locations":[{"start":{"line":1,"column":0},"end":{"line":25,"column":25}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":25,"column":25}},"loc":{"start":{"line":1,"column":0},"end":{"line":25,"column":25}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/apm/alerts/alert-service.ts": {"path":"/workspaces/CurrentDao-backend/src/apm/alerts/alert-service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":25}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":51}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":58}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":50}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":55}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":32}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":3}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":34}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":59}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":43}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":31}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":14}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":34}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":53}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":44}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":40}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":21}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":19}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":76}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":8}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":43}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":39}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":41}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":39}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":164}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":8}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":130}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":6}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":70}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":47}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":89}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":86}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":36}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":43}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":41}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":59}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":21}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":24}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":64}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":7}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":74,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":74,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":74,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":74,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/apm/analytics/performance-analytics.service.ts": {"path":"/workspaces/CurrentDao-backend/src/apm/analytics/performance-analytics.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":29}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":18}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":24}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":23}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":1}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":66}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":73}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":54}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":59}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":18}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":36}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":38}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":64}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":38}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":14}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":31}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":36}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":39}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":64}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":43}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":28}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":6}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":40}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":59}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":37}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":103}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":77}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":22}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":19}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":22}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":23}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":27}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":25}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":44}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":21}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":80}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":63}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":42}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":40}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":5}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":17}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":5}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":50}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":18}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":30}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":93}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":12}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":27}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":51}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":22}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":38}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":30}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":5}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":39}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":25}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":43}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":55}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":28}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":82}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":25}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":8}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":5}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":12}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":19}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":51}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":6}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":3}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":106,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":106,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":106,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":106,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/apm/dashboard/dashboard.service.ts": {"path":"/workspaces/CurrentDao-backend/src/apm/dashboard/dashboard.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":79}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":31}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":62}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":67}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":5}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":47}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":5}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":66}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":43}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":12}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":42}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":15}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":32}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":28}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":30}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":36}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":34}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":31}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":8}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":16}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":33}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":40}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":38}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":38}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":46}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":10}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":32}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":8}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":21}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":60}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":63}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":23}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":41}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":42}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":56,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":56,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":56,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":56,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/apm/metrics/metrics-collector.service.ts": {"path":"/workspaces/CurrentDao-backend/src/apm/metrics/metrics-collector.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":10}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":10}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":18}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":28}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":62}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":69}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":32}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":19}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":50}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":53}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":55}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":56}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":42}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":52}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":54}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":79}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":49}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":7}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":28}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":7}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":52}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":8}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":63}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":30}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":7}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":66}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":8}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":6}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":64}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":35}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":7}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":64}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":8}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":6}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":73}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":60}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":7}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":29}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":58}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":56}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":42}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":6}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":48}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":29}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":63}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":44}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":7}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":51}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":53}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":7}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":53}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":46}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":59}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":14}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":8}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":7}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":30}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":30}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":29}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":68}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":54}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":46}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":21}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":12}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":56}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":57}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":3}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":101,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":101,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":101,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":101,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/apm/optimization/optimization-service.ts": {"path":"/workspaces/CurrentDao-backend/src/apm/optimization/optimization-service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":89}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":34}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":65}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":50}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":73}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":5}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":59}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":5}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":36}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":69}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":61}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":45}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":73}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":78}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":68}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":20}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":7}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":76}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":72}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":38}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":69}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":20}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":74}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":43}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":12}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":38}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":69}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":5}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":56}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":5}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":7}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":38}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":79}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":8}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":7}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":22}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":36}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":20}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":71}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":8}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":7}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":25}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":20}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":93}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":8}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":6}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":77,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":77,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":77,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":77,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/assets/asset.module.ts": {"path":"/workspaces/CurrentDao-backend/src/assets/asset.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":72}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":79}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":55}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":73}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":14}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":15}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":23}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":17}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":4}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":12}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":15}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":4}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":2}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":27}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":25,"column":27}},"locations":[{"start":{"line":1,"column":0},"end":{"line":25,"column":27}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":25,"column":27}},"loc":{"start":{"line":1,"column":0},"end":{"line":25,"column":27}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/assets/caching/cache.service.ts": {"path":"/workspaces/CurrentDao-backend/src/assets/caching/cache.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":27}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":58}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":79}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":65}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":80}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":53}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":52}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":3}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":32}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":39}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":29}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":40}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":57}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":29}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":5}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":51}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":23}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":60}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":0,"19":0,"20":0,"21":0,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":0,"29":0,"30":0,"31":1},"branchMap":{"0":{"type":"branch","line":4,"loc":{"start":{"line":4,"column":7},"end":{"line":32,"column":1}},"locations":[{"start":{"line":4,"column":7},"end":{"line":32,"column":1}}]},"1":{"type":"branch","line":8,"loc":{"start":{"line":8,"column":2},"end":{"line":12,"column":3}},"locations":[{"start":{"line":8,"column":2},"end":{"line":12,"column":3}}]},"2":{"type":"branch","line":14,"loc":{"start":{"line":14,"column":2},"end":{"line":26,"column":3}},"locations":[{"start":{"line":14,"column":2},"end":{"line":26,"column":3}}]},"3":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":17},"end":{"line":16,"column":29}},"locations":[{"start":{"line":16,"column":17},"end":{"line":16,"column":29}}]},"4":{"type":"branch","line":18,"loc":{"start":{"line":18,"column":39},"end":{"line":22,"column":5}},"locations":[{"start":{"line":18,"column":39},"end":{"line":22,"column":5}}]}},"b":{"0":[1],"1":[1],"2":[1],"3":[0],"4":[0]},"fnMap":{"0":{"name":"CacheService","decl":{"start":{"line":4,"column":7},"end":{"line":32,"column":1}},"loc":{"start":{"line":4,"column":7},"end":{"line":32,"column":1}},"line":4},"1":{"name":"set","decl":{"start":{"line":8,"column":2},"end":{"line":12,"column":3}},"loc":{"start":{"line":8,"column":2},"end":{"line":12,"column":3}},"line":8},"2":{"name":"get","decl":{"start":{"line":14,"column":2},"end":{"line":26,"column":3}},"loc":{"start":{"line":14,"column":2},"end":{"line":26,"column":3}},"line":14},"3":{"name":"invalidate","decl":{"start":{"line":28,"column":2},"end":{"line":31,"column":3}},"loc":{"start":{"line":28,"column":2},"end":{"line":31,"column":3}},"line":28}},"f":{"0":1,"1":1,"2":1,"3":0}} +,"/workspaces/CurrentDao-backend/src/assets/cdn/cdn.service.ts": {"path":"/workspaces/CurrentDao-backend/src/assets/cdn/cdn.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":56}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":42}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":77}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":63}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":39}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"branchMap":{"0":{"type":"branch","line":4,"loc":{"start":{"line":4,"column":7},"end":{"line":12,"column":1}},"locations":[{"start":{"line":4,"column":7},"end":{"line":12,"column":1}}]},"1":{"type":"branch","line":7,"loc":{"start":{"line":7,"column":2},"end":{"line":11,"column":3}},"locations":[{"start":{"line":7,"column":2},"end":{"line":11,"column":3}}]}},"b":{"0":[1],"1":[1]},"fnMap":{"0":{"name":"CdnService","decl":{"start":{"line":4,"column":7},"end":{"line":12,"column":1}},"loc":{"start":{"line":4,"column":7},"end":{"line":12,"column":1}},"line":4},"1":{"name":"getAssetUrl","decl":{"start":{"line":7,"column":2},"end":{"line":11,"column":3}},"loc":{"start":{"line":7,"column":2},"end":{"line":11,"column":3}},"line":7}},"f":{"0":1,"1":1}} +,"/workspaces/CurrentDao-backend/src/assets/optimization/compression.service.ts": {"path":"/workspaces/CurrentDao-backend/src/assets/optimization/compression.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":29}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":33}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":54}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":33}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":64}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":62}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":9}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":35}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":44}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":7}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":32}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":77}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":5}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":0,"19":0,"20":1,"21":1,"22":0,"23":0,"24":0,"25":1,"26":1},"branchMap":{"0":{"type":"branch","line":9,"loc":{"start":{"line":9,"column":7},"end":{"line":27,"column":1}},"locations":[{"start":{"line":9,"column":7},"end":{"line":27,"column":1}}]},"1":{"type":"branch","line":12,"loc":{"start":{"line":12,"column":2},"end":{"line":26,"column":3}},"locations":[{"start":{"line":12,"column":2},"end":{"line":26,"column":3}}]},"2":{"type":"branch","line":18,"loc":{"start":{"line":18,"column":34},"end":{"line":20,"column":7}},"locations":[{"start":{"line":18,"column":34},"end":{"line":20,"column":7}}]},"3":{"type":"branch","line":22,"loc":{"start":{"line":22,"column":6},"end":{"line":25,"column":5}},"locations":[{"start":{"line":22,"column":6},"end":{"line":25,"column":5}}]}},"b":{"0":[1],"1":[1],"2":[0],"3":[0]},"fnMap":{"0":{"name":"CompressionService","decl":{"start":{"line":9,"column":7},"end":{"line":27,"column":1}},"loc":{"start":{"line":9,"column":7},"end":{"line":27,"column":1}},"line":9},"1":{"name":"compressAsset","decl":{"start":{"line":12,"column":2},"end":{"line":26,"column":3}},"loc":{"start":{"line":12,"column":2},"end":{"line":26,"column":3}},"line":12}},"f":{"0":1,"1":1}} +,"/workspaces/CurrentDao-backend/src/assets/optimization/image-optimizer.service.ts": {"path":"/workspaces/CurrentDao-backend/src/assets/optimization/image-optimizer.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":36}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":67}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":19}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":45}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":62}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":74}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":82}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":16,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":16,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":16,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":16,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/assets/versioning/asset-version.service.ts": {"path":"/workspaces/CurrentDao-backend/src/assets/versioning/asset-version.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":33}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":65}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":47}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":17}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":24}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":20}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":67}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":38}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":27}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":30}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":49}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":5}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":33}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":1},"branchMap":{"0":{"type":"branch","line":5,"loc":{"start":{"line":5,"column":7},"end":{"line":25,"column":1}},"locations":[{"start":{"line":5,"column":7},"end":{"line":25,"column":1}}]},"1":{"type":"branch","line":8,"loc":{"start":{"line":8,"column":2},"end":{"line":15,"column":3}},"locations":[{"start":{"line":8,"column":2},"end":{"line":15,"column":3}}]}},"b":{"0":[1],"1":[1]},"fnMap":{"0":{"name":"AssetVersionService","decl":{"start":{"line":5,"column":7},"end":{"line":25,"column":1}},"loc":{"start":{"line":5,"column":7},"end":{"line":25,"column":1}},"line":5},"1":{"name":"generateVersionHash","decl":{"start":{"line":8,"column":2},"end":{"line":15,"column":3}},"loc":{"start":{"line":8,"column":2},"end":{"line":15,"column":3}},"line":8},"2":{"name":"appendVersionToFilename","decl":{"start":{"line":17,"column":2},"end":{"line":24,"column":3}},"loc":{"start":{"line":17,"column":2},"end":{"line":24,"column":3}},"line":17}},"f":{"0":1,"1":1,"2":0}} +,"/workspaces/CurrentDao-backend/src/audit/audit.module.ts": {"path":"/workspaces/CurrentDao-backend/src/audit/audit.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":47}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":67}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":63}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":66}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":46}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":44}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":2}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":27}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":13,"column":27}},"locations":[{"start":{"line":1,"column":0},"end":{"line":13,"column":27}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":13,"column":27}},"loc":{"start":{"line":1,"column":0},"end":{"line":13,"column":27}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/audit/audit.service.ts": {"path":"/workspaces/CurrentDao-backend/src/audit/audit.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":82}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":111}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":124}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":63}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":29}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":23}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":27}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":18}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":17}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":23}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":25}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":19}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":29}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":1}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":31}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":20}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":44}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":48}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":44}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":30}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":28}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":35}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":29}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":18}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":19}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":21}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":25}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":25}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":29}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":37}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":28}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":22}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":54}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":58}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":62}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":20}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":20}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":21}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":26}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":20}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":30}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":13}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":51}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":58}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":14}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":31}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":62}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":37}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":74}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":39}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":78}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":44}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":24}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":39}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":62}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":17}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":24}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":28}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":14}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":31}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":27}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":22}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":25}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":25}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":24}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":25}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":41}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":11}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":53}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":13}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":15}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":57}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":33}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":66}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":29}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":35}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":35}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":35}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":43}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":37}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":92}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":95}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":44}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":64}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":39}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":17}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":33}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":27}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":17}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":27}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":28}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":18}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":41}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":28}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":33}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":10}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":15}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":23}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":22}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":19}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":21}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":26}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":27}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":27}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":10}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":28}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":8}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":43}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":31}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":20}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":27}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":65}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":8}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":17}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":69}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":31}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":25}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":23}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":20}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":8}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":46}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":46}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":19}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":20}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":37}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":37}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":7}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":24}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":31}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":61}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":5}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":57}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":29}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":46}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":22}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":66}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":42}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":41}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":27}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":30}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":34}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":34}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":30}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":36}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":7}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":101}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":20}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":3}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":23}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":22}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":28}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":32}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":23}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":25}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":26}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":28}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":23}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":17}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":41}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":14}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":22}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":25}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":25}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":25}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":29}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":23}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":11}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":30}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":33}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":55}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":65}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":33}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":68}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":74}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":20}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":43}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":31}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":37}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":79}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":48}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":48}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":54}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":50}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":51}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":57}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":49}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":51}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":55}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":49}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":26}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":24}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":40}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":40}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":39}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":8}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":37}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":17}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":21}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":20}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":23}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":8}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":17}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":39}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":8}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":14}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":29}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":24}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":17}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":8}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":17}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":25}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":23}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":17}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":23}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":49}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":8}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":14}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":18}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":29}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":34}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":32}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":39}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":10}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":8}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":16}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":39}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":20}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":29}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":28}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":10}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":8}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":37}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":37}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":7}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":24}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":31}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":67}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":5}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":25}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":69}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":29}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":63}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":0}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":22}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":78}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":42}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":53}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":33}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":26}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":30}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":30}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":34}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":42}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":36}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":7}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":126}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":20}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":3}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":55}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":21}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":18}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":17}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":18}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":6}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":77}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":23}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":80}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":5}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":25}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":88}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":5}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":25}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":88}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":5}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":23}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":80}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":5}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":0}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":26}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":93}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":5}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":24}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":87}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":23}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":80}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":5}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":26}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":92}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":5}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":30}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":108}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":24}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":84}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":5}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":47}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":48}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":55}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":53}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":37}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":42}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":63}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":0}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":12}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":11}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":12}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":43}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":12}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":6}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":3}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":0}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":67}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":35}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":18}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":17}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":18}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":6}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":89}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":21}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":78}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":5}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":23}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":86}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":5}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":25}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":94}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":5}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":0}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":23}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":83}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":5}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":26}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":99}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":5}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":24}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":93}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":5}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":0}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":26}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":93}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":5}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":26}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":93}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":5}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":0}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":25}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":94}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":5}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":0}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":30}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":114}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":5}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":0}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":30}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":114}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":5}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":47}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":48}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":61}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":0}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":53}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":37}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":0}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":42}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":0}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":71}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":0}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":12}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":19}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":12}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":43}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":12}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":6}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":3}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":0}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":82}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":77}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":0}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":20}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":76}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":5}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":0}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":18}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":72}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":5}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":103}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":30}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":47}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":49}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":49}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":47}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":7}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":0}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":90}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":72}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":92}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":84}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":76}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":0}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":12}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":16}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":19}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":21}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":21}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":19}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":23}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":16}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":26}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":24}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":20}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":6}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":3}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":0}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":94}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":89}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":0}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":20}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":82}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":5}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":0}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":18}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":78}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":5}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":0}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":11}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":24}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":25}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":27}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":29}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":16}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":18}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":16}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":17}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":27}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":30}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":53}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":55}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":57}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":54}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":52}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":50}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":51}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":7}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":0}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":84}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":72}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":103}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":0}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":12}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":24}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":18}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":25}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":27}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":29}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":16}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":16}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":17}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":22}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":16}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":26}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":6}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":3}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":0}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":56}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":75}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":20}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":59}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":5}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":20}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":3}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":0}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":68}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":73}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":20}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":27}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":7}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":26}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":65}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":5}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":26}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":3}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":0}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":64}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":32}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":28}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":21}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":22}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":20}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":19}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":22}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":7}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":6}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":72}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":70}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":0}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":83}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":0}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":12}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":18}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":18}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":15}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":6}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":3}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":0}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":30}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":26}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":21}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":19}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":14}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":19}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":22}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":26}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":30}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":30}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":22}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":19}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":7}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":6}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":76}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":53}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":0}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":20}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":76}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":5}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":0}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":18}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":72}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":5}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":0}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":51}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":0}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":46}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":0}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":29}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":31}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":25}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":29}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":29}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":25}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":28}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":8}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":3}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":0}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":24}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":27}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":46}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":22}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":52}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":0}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":28}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":43}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":5}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":0}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":27}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":37}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":5}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":0}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":29}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":39}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":5}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":0}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":60}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":3}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":0}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":30}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":33}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":46}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":22}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":66}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":0}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":28}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":51}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":5}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":0}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":27}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":57}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":5}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":0}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":29}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":59}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":5}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":0}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":60}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":3}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":0}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":55}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":24}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":32}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":28}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":6}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":61}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":34}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":4}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":30}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":20}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":61}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":14}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":21}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":61}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":14}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":21}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":61}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":14}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":21}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":61}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":14}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":14}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":61}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":5}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":0}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":64}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":14}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":40}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":35}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":8}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":7}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":0}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":78}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":14}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":40}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":44}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":8}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":7}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":0}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":12}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":18}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":26}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":22}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":6}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":3}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":0}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":65}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":31}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":30}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":45}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":70}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":50}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":70}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":39}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":9}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":9}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":7}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":5}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":0}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":68}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":62}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":83}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":0}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":45}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":56}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":49}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":3}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":0}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":96}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":43}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":82}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":4}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":42}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":56}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":68}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":7}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":57}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":69}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":7}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":5}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":0}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":27}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":79}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":89}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":0}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":51}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":62}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":55}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":3}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":0}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":48}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":30}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":36}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":28}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":17}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":36}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":20}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":23}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":7}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":6}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":58}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":17}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":34}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":7}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":0}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":70}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":17}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":34}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":7}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":0}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":34}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":17}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":36}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":20}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":23}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":7}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":0}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":30}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":36}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":0}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":33}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":39}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":66}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":53}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":30}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":26}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":24}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":46}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":33}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":11}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":14}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":28}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":7}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":5}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":0}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":39}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":51}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":72}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":59}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":30}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":32}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":30}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":46}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":33}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":11}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":14}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":34}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":7}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":5}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":0}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":12}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":24}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":30}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":22}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":6}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":3}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":0}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":48}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":37}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":44}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":72}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":3}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":0}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":92}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":76}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":47}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":89}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":83}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":0}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":83}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":0}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":76}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":74}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":0}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":50}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":3}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":0}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":81}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":76}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":39}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":89}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":83}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":0}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":52}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":48}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":39}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":7}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":0}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":61}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":3}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":0}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":91}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":76}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":48}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":89}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":83}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":0}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":52}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":52}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":65}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":7}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":0}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":65}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":3}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":0}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":85}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":76}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":71}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":89}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":83}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":0}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":41}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":3}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":0}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":81}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":76}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":71}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":89}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":83}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":0}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":41}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":3}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":0}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":99}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":76}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":86}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":83}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":0}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":38}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":31}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":21}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":20}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":0}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":51}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":4}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":35}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":59}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":5}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":0}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":18}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":3}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":0}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":103}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":76}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":86}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":83}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":0}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":38}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":33}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":21}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":20}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":0}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":53}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":4}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":35}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":61}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":5}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":0}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":18}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":3}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":0}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":103}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":76}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":86}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":83}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":0}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":38}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":33}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":21}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":20}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":0}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":53}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":4}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":35}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":61}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":5}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":0}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":18}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":3}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":0}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":99}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":76}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":86}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":83}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":0}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":38}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":31}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":21}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":20}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":0}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":51}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":4}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":35}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":59}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":5}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":0}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":18}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":3}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":0}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":109}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":88}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":92}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":89}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":0}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":38}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":35}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":21}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":20}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":0}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":55}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":4}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":35}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":63}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":5}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":0}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":18}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":3}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":0}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":113}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":88}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":92}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":89}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":0}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":38}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":37}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":21}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":20}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":0}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":57}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":4}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":35}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":65}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":5}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":0}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":18}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":3}},"1004":{"start":{"line":1005,"column":0},"end":{"line":1005,"column":0}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":117}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":88}},"1007":{"start":{"line":1008,"column":0},"end":{"line":1008,"column":92}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":89}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":0}},"1010":{"start":{"line":1011,"column":0},"end":{"line":1011,"column":32}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":39}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":21}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":20}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":0}},"1015":{"start":{"line":1016,"column":0},"end":{"line":1016,"column":59}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":4}},"1017":{"start":{"line":1018,"column":0},"end":{"line":1018,"column":35}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":67}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":5}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":0}},"1021":{"start":{"line":1022,"column":0},"end":{"line":1022,"column":18}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":3}},"1023":{"start":{"line":1024,"column":0},"end":{"line":1024,"column":0}},"1024":{"start":{"line":1025,"column":0},"end":{"line":1025,"column":85}},"1025":{"start":{"line":1026,"column":0},"end":{"line":1026,"column":88}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":92}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":86}},"1028":{"start":{"line":1029,"column":0},"end":{"line":1029,"column":0}},"1029":{"start":{"line":1030,"column":0},"end":{"line":1030,"column":37}},"1030":{"start":{"line":1031,"column":0},"end":{"line":1031,"column":37}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":20}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":0}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":74}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":73}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":0}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":40}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":3}},"1038":{"start":{"line":1039,"column":0},"end":{"line":1039,"column":0}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":83}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":88}},"1041":{"start":{"line":1042,"column":0},"end":{"line":1042,"column":92}},"1042":{"start":{"line":1043,"column":0},"end":{"line":1043,"column":86}},"1043":{"start":{"line":1044,"column":0},"end":{"line":1044,"column":0}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":31}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":37}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":20}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":0}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":74}},"1049":{"start":{"line":1050,"column":0},"end":{"line":1050,"column":73}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":0}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":23}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":3}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":0}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":81}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":88}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":92}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":86}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":0}},"1059":{"start":{"line":1060,"column":0},"end":{"line":1060,"column":31}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":40}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":20}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":0}},"1063":{"start":{"line":1064,"column":0},"end":{"line":1064,"column":75}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":62}},"1065":{"start":{"line":1066,"column":0},"end":{"line":1066,"column":0}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":21}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":3}},"1068":{"start":{"line":1069,"column":0},"end":{"line":1069,"column":0}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":82}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":88}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":92}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":86}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":0}},"1074":{"start":{"line":1075,"column":0},"end":{"line":1075,"column":31}},"1075":{"start":{"line":1076,"column":0},"end":{"line":1076,"column":40}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":20}},"1077":{"start":{"line":1078,"column":0},"end":{"line":1078,"column":0}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":76}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":64}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":0}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":22}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":3}},"1083":{"start":{"line":1084,"column":0},"end":{"line":1084,"column":0}},"1084":{"start":{"line":1085,"column":0},"end":{"line":1085,"column":87}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":88}},"1086":{"start":{"line":1087,"column":0},"end":{"line":1087,"column":92}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":86}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":0}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":54}},"1090":{"start":{"line":1091,"column":0},"end":{"line":1091,"column":4}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":23}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":18}},"1093":{"start":{"line":1094,"column":0},"end":{"line":1094,"column":0}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":45}},"1095":{"start":{"line":1096,"column":0},"end":{"line":1096,"column":31}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":0}},"1097":{"start":{"line":1098,"column":0},"end":{"line":1098,"column":41}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":88}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":90}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":78}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":6}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":37}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":53}},"1104":{"start":{"line":1105,"column":0},"end":{"line":1105,"column":62}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":0}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":37}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":14}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":5}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":0}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":46}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":3}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":0}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":81}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":88}},"1115":{"start":{"line":1116,"column":0},"end":{"line":1116,"column":92}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":86}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":0}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":54}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":4}},"1120":{"start":{"line":1121,"column":0},"end":{"line":1121,"column":27}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":18}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":0}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":45}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":53}},"1125":{"start":{"line":1126,"column":0},"end":{"line":1126,"column":34}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":14}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":5}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":0}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":50}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":3}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":0}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":84}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":43}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":43}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":4}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":42}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":41}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":40}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":39}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":20}},"1141":{"start":{"line":1142,"column":0},"end":{"line":1142,"column":3}},"1142":{"start":{"line":1143,"column":0},"end":{"line":1143,"column":0}},"1143":{"start":{"line":1144,"column":0},"end":{"line":1144,"column":86}},"1144":{"start":{"line":1145,"column":0},"end":{"line":1145,"column":27}},"1145":{"start":{"line":1146,"column":0},"end":{"line":1146,"column":4}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":30}},"1147":{"start":{"line":1148,"column":0},"end":{"line":1148,"column":20}},"1148":{"start":{"line":1149,"column":0},"end":{"line":1149,"column":130}},"1149":{"start":{"line":1150,"column":0},"end":{"line":1150,"column":21}},"1150":{"start":{"line":1151,"column":0},"end":{"line":1151,"column":130}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":21}},"1152":{"start":{"line":1153,"column":0},"end":{"line":1153,"column":130}},"1153":{"start":{"line":1154,"column":0},"end":{"line":1154,"column":21}},"1154":{"start":{"line":1155,"column":0},"end":{"line":1155,"column":130}},"1155":{"start":{"line":1156,"column":0},"end":{"line":1156,"column":14}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":130}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":5}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":3}},"1159":{"start":{"line":1160,"column":0},"end":{"line":1160,"column":0}},"1160":{"start":{"line":1161,"column":0},"end":{"line":1161,"column":59}},"1161":{"start":{"line":1162,"column":0},"end":{"line":1162,"column":40}},"1162":{"start":{"line":1163,"column":0},"end":{"line":1163,"column":73}},"1163":{"start":{"line":1164,"column":0},"end":{"line":1164,"column":68}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":48}},"1165":{"start":{"line":1166,"column":0},"end":{"line":1166,"column":21}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":3}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":0}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":82}},"1169":{"start":{"line":1170,"column":0},"end":{"line":1170,"column":31}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":47}},"1171":{"start":{"line":1172,"column":0},"end":{"line":1172,"column":4}},"1172":{"start":{"line":1173,"column":0},"end":{"line":1173,"column":43}},"1173":{"start":{"line":1174,"column":0},"end":{"line":1174,"column":41}},"1174":{"start":{"line":1175,"column":0},"end":{"line":1175,"column":40}},"1175":{"start":{"line":1176,"column":0},"end":{"line":1176,"column":39}},"1176":{"start":{"line":1177,"column":0},"end":{"line":1177,"column":20}},"1177":{"start":{"line":1178,"column":0},"end":{"line":1178,"column":3}},"1178":{"start":{"line":1179,"column":0},"end":{"line":1179,"column":0}},"1179":{"start":{"line":1180,"column":0},"end":{"line":1180,"column":98}},"1180":{"start":{"line":1181,"column":0},"end":{"line":1181,"column":27}},"1181":{"start":{"line":1182,"column":0},"end":{"line":1182,"column":4}},"1182":{"start":{"line":1183,"column":0},"end":{"line":1183,"column":30}},"1183":{"start":{"line":1184,"column":0},"end":{"line":1184,"column":20}},"1184":{"start":{"line":1185,"column":0},"end":{"line":1185,"column":130}},"1185":{"start":{"line":1186,"column":0},"end":{"line":1186,"column":21}},"1186":{"start":{"line":1187,"column":0},"end":{"line":1187,"column":130}},"1187":{"start":{"line":1188,"column":0},"end":{"line":1188,"column":21}},"1188":{"start":{"line":1189,"column":0},"end":{"line":1189,"column":130}},"1189":{"start":{"line":1190,"column":0},"end":{"line":1190,"column":21}},"1190":{"start":{"line":1191,"column":0},"end":{"line":1191,"column":130}},"1191":{"start":{"line":1192,"column":0},"end":{"line":1192,"column":14}},"1192":{"start":{"line":1193,"column":0},"end":{"line":1193,"column":130}},"1193":{"start":{"line":1194,"column":0},"end":{"line":1194,"column":5}},"1194":{"start":{"line":1195,"column":0},"end":{"line":1195,"column":3}},"1195":{"start":{"line":1196,"column":0},"end":{"line":1196,"column":0}},"1196":{"start":{"line":1197,"column":0},"end":{"line":1197,"column":41}},"1197":{"start":{"line":1198,"column":0},"end":{"line":1198,"column":32}},"1198":{"start":{"line":1199,"column":0},"end":{"line":1199,"column":28}},"1199":{"start":{"line":1200,"column":0},"end":{"line":1200,"column":20}},"1200":{"start":{"line":1201,"column":0},"end":{"line":1201,"column":20}},"1201":{"start":{"line":1202,"column":0},"end":{"line":1202,"column":18}},"1202":{"start":{"line":1203,"column":0},"end":{"line":1203,"column":17}},"1203":{"start":{"line":1204,"column":0},"end":{"line":1204,"column":20}},"1204":{"start":{"line":1205,"column":0},"end":{"line":1205,"column":7}},"1205":{"start":{"line":1206,"column":0},"end":{"line":1206,"column":27}},"1206":{"start":{"line":1207,"column":0},"end":{"line":1207,"column":22}},"1207":{"start":{"line":1208,"column":0},"end":{"line":1208,"column":20}},"1208":{"start":{"line":1209,"column":0},"end":{"line":1209,"column":19}},"1209":{"start":{"line":1210,"column":0},"end":{"line":1210,"column":22}},"1210":{"start":{"line":1211,"column":0},"end":{"line":1211,"column":12}},"1211":{"start":{"line":1212,"column":0},"end":{"line":1212,"column":0}},"1212":{"start":{"line":1213,"column":0},"end":{"line":1213,"column":31}},"1213":{"start":{"line":1214,"column":0},"end":{"line":1214,"column":19}},"1214":{"start":{"line":1215,"column":0},"end":{"line":1215,"column":39}},"1215":{"start":{"line":1216,"column":0},"end":{"line":1216,"column":35}},"1216":{"start":{"line":1217,"column":0},"end":{"line":1217,"column":16}},"1217":{"start":{"line":1218,"column":0},"end":{"line":1218,"column":49}},"1218":{"start":{"line":1219,"column":0},"end":{"line":1219,"column":31}},"1219":{"start":{"line":1220,"column":0},"end":{"line":1220,"column":35}},"1220":{"start":{"line":1221,"column":0},"end":{"line":1221,"column":39}},"1221":{"start":{"line":1222,"column":0},"end":{"line":1222,"column":35}},"1222":{"start":{"line":1223,"column":0},"end":{"line":1223,"column":8}},"1223":{"start":{"line":1224,"column":0},"end":{"line":1224,"column":45}},"1224":{"start":{"line":1225,"column":0},"end":{"line":1225,"column":7}},"1225":{"start":{"line":1226,"column":0},"end":{"line":1226,"column":0}},"1226":{"start":{"line":1227,"column":0},"end":{"line":1227,"column":28}},"1227":{"start":{"line":1228,"column":0},"end":{"line":1228,"column":68}},"1228":{"start":{"line":1229,"column":0},"end":{"line":1229,"column":21}},"1229":{"start":{"line":1230,"column":0},"end":{"line":1230,"column":40}},"1230":{"start":{"line":1231,"column":0},"end":{"line":1231,"column":30}},"1231":{"start":{"line":1232,"column":0},"end":{"line":1232,"column":18}},"1232":{"start":{"line":1233,"column":0},"end":{"line":1233,"column":32}},"1233":{"start":{"line":1234,"column":0},"end":{"line":1234,"column":28}},"1234":{"start":{"line":1235,"column":0},"end":{"line":1235,"column":36}},"1235":{"start":{"line":1236,"column":0},"end":{"line":1236,"column":10}},"1236":{"start":{"line":1237,"column":0},"end":{"line":1237,"column":34}},"1237":{"start":{"line":1238,"column":0},"end":{"line":1238,"column":9}},"1238":{"start":{"line":1239,"column":0},"end":{"line":1239,"column":5}},"1239":{"start":{"line":1240,"column":0},"end":{"line":1240,"column":0}},"1240":{"start":{"line":1241,"column":0},"end":{"line":1241,"column":23}},"1241":{"start":{"line":1242,"column":0},"end":{"line":1242,"column":41}},"1242":{"start":{"line":1243,"column":0},"end":{"line":1243,"column":21}},"1243":{"start":{"line":1244,"column":0},"end":{"line":1244,"column":38}},"1244":{"start":{"line":1245,"column":0},"end":{"line":1245,"column":31}},"1245":{"start":{"line":1246,"column":0},"end":{"line":1246,"column":38}},"1246":{"start":{"line":1247,"column":0},"end":{"line":1247,"column":32}},"1247":{"start":{"line":1248,"column":0},"end":{"line":1248,"column":9}},"1248":{"start":{"line":1249,"column":0},"end":{"line":1249,"column":5}},"1249":{"start":{"line":1250,"column":0},"end":{"line":1250,"column":0}},"1250":{"start":{"line":1251,"column":0},"end":{"line":1251,"column":24}},"1251":{"start":{"line":1252,"column":0},"end":{"line":1252,"column":75}},"1252":{"start":{"line":1253,"column":0},"end":{"line":1253,"column":0}},"1253":{"start":{"line":1254,"column":0},"end":{"line":1254,"column":20}},"1254":{"start":{"line":1255,"column":0},"end":{"line":1255,"column":3}},"1255":{"start":{"line":1256,"column":0},"end":{"line":1256,"column":0}},"1256":{"start":{"line":1257,"column":0},"end":{"line":1257,"column":45}},"1257":{"start":{"line":1258,"column":0},"end":{"line":1258,"column":37}},"1258":{"start":{"line":1259,"column":0},"end":{"line":1259,"column":0}},"1259":{"start":{"line":1260,"column":0},"end":{"line":1260,"column":21}},"1260":{"start":{"line":1261,"column":0},"end":{"line":1261,"column":11}},"1261":{"start":{"line":1262,"column":0},"end":{"line":1262,"column":15}},"1262":{"start":{"line":1263,"column":0},"end":{"line":1263,"column":17}},"1263":{"start":{"line":1264,"column":0},"end":{"line":1264,"column":17}},"1264":{"start":{"line":1265,"column":0},"end":{"line":1265,"column":16}},"1265":{"start":{"line":1266,"column":0},"end":{"line":1266,"column":19}},"1266":{"start":{"line":1267,"column":0},"end":{"line":1267,"column":18}},"1267":{"start":{"line":1268,"column":0},"end":{"line":1268,"column":28}},"1268":{"start":{"line":1269,"column":0},"end":{"line":1269,"column":15}},"1269":{"start":{"line":1270,"column":0},"end":{"line":1270,"column":20}},"1270":{"start":{"line":1271,"column":0},"end":{"line":1271,"column":6}},"1271":{"start":{"line":1272,"column":0},"end":{"line":1272,"column":0}},"1272":{"start":{"line":1273,"column":0},"end":{"line":1273,"column":34}},"1273":{"start":{"line":1274,"column":0},"end":{"line":1274,"column":13}},"1274":{"start":{"line":1275,"column":0},"end":{"line":1275,"column":23}},"1275":{"start":{"line":1276,"column":0},"end":{"line":1276,"column":25}},"1276":{"start":{"line":1277,"column":0},"end":{"line":1277,"column":25}},"1277":{"start":{"line":1278,"column":0},"end":{"line":1278,"column":18}},"1278":{"start":{"line":1279,"column":0},"end":{"line":1279,"column":21}},"1279":{"start":{"line":1280,"column":0},"end":{"line":1280,"column":27}},"1280":{"start":{"line":1281,"column":0},"end":{"line":1281,"column":31}},"1281":{"start":{"line":1282,"column":0},"end":{"line":1282,"column":23}},"1282":{"start":{"line":1283,"column":0},"end":{"line":1283,"column":28}},"1283":{"start":{"line":1284,"column":0},"end":{"line":1284,"column":7}},"1284":{"start":{"line":1285,"column":0},"end":{"line":1285,"column":0}},"1285":{"start":{"line":1286,"column":0},"end":{"line":1286,"column":52}},"1286":{"start":{"line":1287,"column":0},"end":{"line":1287,"column":46}},"1287":{"start":{"line":1288,"column":0},"end":{"line":1288,"column":6}},"1288":{"start":{"line":1289,"column":0},"end":{"line":1289,"column":0}},"1289":{"start":{"line":1290,"column":0},"end":{"line":1290,"column":33}},"1290":{"start":{"line":1291,"column":0},"end":{"line":1291,"column":3}},"1291":{"start":{"line":1292,"column":0},"end":{"line":1292,"column":0}},"1292":{"start":{"line":1293,"column":0},"end":{"line":1293,"column":65}},"1293":{"start":{"line":1294,"column":0},"end":{"line":1294,"column":45}},"1294":{"start":{"line":1295,"column":0},"end":{"line":1295,"column":0}},"1295":{"start":{"line":1296,"column":0},"end":{"line":1296,"column":21}},"1296":{"start":{"line":1297,"column":0},"end":{"line":1297,"column":23}},"1297":{"start":{"line":1298,"column":0},"end":{"line":1298,"column":13}},"1298":{"start":{"line":1299,"column":0},"end":{"line":1299,"column":15}},"1299":{"start":{"line":1300,"column":0},"end":{"line":1300,"column":15}},"1300":{"start":{"line":1301,"column":0},"end":{"line":1301,"column":17}},"1301":{"start":{"line":1302,"column":0},"end":{"line":1302,"column":17}},"1302":{"start":{"line":1303,"column":0},"end":{"line":1303,"column":18}},"1303":{"start":{"line":1304,"column":0},"end":{"line":1304,"column":19}},"1304":{"start":{"line":1305,"column":0},"end":{"line":1305,"column":15}},"1305":{"start":{"line":1306,"column":0},"end":{"line":1306,"column":23}},"1306":{"start":{"line":1307,"column":0},"end":{"line":1307,"column":19}},"1307":{"start":{"line":1308,"column":0},"end":{"line":1308,"column":6}},"1308":{"start":{"line":1309,"column":0},"end":{"line":1309,"column":0}},"1309":{"start":{"line":1310,"column":0},"end":{"line":1310,"column":50}},"1310":{"start":{"line":1311,"column":0},"end":{"line":1311,"column":33}},"1311":{"start":{"line":1312,"column":0},"end":{"line":1312,"column":23}},"1312":{"start":{"line":1313,"column":0},"end":{"line":1313,"column":25}},"1313":{"start":{"line":1314,"column":0},"end":{"line":1314,"column":25}},"1314":{"start":{"line":1315,"column":0},"end":{"line":1315,"column":27}},"1315":{"start":{"line":1316,"column":0},"end":{"line":1316,"column":48}},"1316":{"start":{"line":1317,"column":0},"end":{"line":1317,"column":49}},"1317":{"start":{"line":1318,"column":0},"end":{"line":1318,"column":41}},"1318":{"start":{"line":1319,"column":0},"end":{"line":1319,"column":25}},"1319":{"start":{"line":1320,"column":0},"end":{"line":1320,"column":33}},"1320":{"start":{"line":1321,"column":0},"end":{"line":1321,"column":35}},"1321":{"start":{"line":1322,"column":0},"end":{"line":1322,"column":7}},"1322":{"start":{"line":1323,"column":0},"end":{"line":1323,"column":0}},"1323":{"start":{"line":1324,"column":0},"end":{"line":1324,"column":52}},"1324":{"start":{"line":1325,"column":0},"end":{"line":1325,"column":46}},"1325":{"start":{"line":1326,"column":0},"end":{"line":1326,"column":6}},"1326":{"start":{"line":1327,"column":0},"end":{"line":1327,"column":0}},"1327":{"start":{"line":1328,"column":0},"end":{"line":1328,"column":33}},"1328":{"start":{"line":1329,"column":0},"end":{"line":1329,"column":3}},"1329":{"start":{"line":1330,"column":0},"end":{"line":1330,"column":0}},"1330":{"start":{"line":1331,"column":0},"end":{"line":1331,"column":55}},"1331":{"start":{"line":1332,"column":0},"end":{"line":1332,"column":45}},"1332":{"start":{"line":1333,"column":0},"end":{"line":1333,"column":0}},"1333":{"start":{"line":1334,"column":0},"end":{"line":1334,"column":21}},"1334":{"start":{"line":1335,"column":0},"end":{"line":1335,"column":23}},"1335":{"start":{"line":1336,"column":0},"end":{"line":1336,"column":13}},"1336":{"start":{"line":1337,"column":0},"end":{"line":1337,"column":15}},"1337":{"start":{"line":1338,"column":0},"end":{"line":1338,"column":15}},"1338":{"start":{"line":1339,"column":0},"end":{"line":1339,"column":17}},"1339":{"start":{"line":1340,"column":0},"end":{"line":1340,"column":17}},"1340":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":18}},"1341":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":19}},"1342":{"start":{"line":1343,"column":0},"end":{"line":1343,"column":15}},"1343":{"start":{"line":1344,"column":0},"end":{"line":1344,"column":23}},"1344":{"start":{"line":1345,"column":0},"end":{"line":1345,"column":19}},"1345":{"start":{"line":1346,"column":0},"end":{"line":1346,"column":6}},"1346":{"start":{"line":1347,"column":0},"end":{"line":1347,"column":0}},"1347":{"start":{"line":1348,"column":0},"end":{"line":1348,"column":50}},"1348":{"start":{"line":1349,"column":0},"end":{"line":1349,"column":33}},"1349":{"start":{"line":1350,"column":0},"end":{"line":1350,"column":23}},"1350":{"start":{"line":1351,"column":0},"end":{"line":1351,"column":25}},"1351":{"start":{"line":1352,"column":0},"end":{"line":1352,"column":25}},"1352":{"start":{"line":1353,"column":0},"end":{"line":1353,"column":27}},"1353":{"start":{"line":1354,"column":0},"end":{"line":1354,"column":48}},"1354":{"start":{"line":1355,"column":0},"end":{"line":1355,"column":49}},"1355":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":41}},"1356":{"start":{"line":1357,"column":0},"end":{"line":1357,"column":25}},"1357":{"start":{"line":1358,"column":0},"end":{"line":1358,"column":33}},"1358":{"start":{"line":1359,"column":0},"end":{"line":1359,"column":35}},"1359":{"start":{"line":1360,"column":0},"end":{"line":1360,"column":7}},"1360":{"start":{"line":1361,"column":0},"end":{"line":1361,"column":0}},"1361":{"start":{"line":1362,"column":0},"end":{"line":1362,"column":52}},"1362":{"start":{"line":1363,"column":0},"end":{"line":1363,"column":46}},"1363":{"start":{"line":1364,"column":0},"end":{"line":1364,"column":6}},"1364":{"start":{"line":1365,"column":0},"end":{"line":1365,"column":0}},"1365":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":33}},"1366":{"start":{"line":1367,"column":0},"end":{"line":1367,"column":3}},"1367":{"start":{"line":1368,"column":0},"end":{"line":1368,"column":0}},"1368":{"start":{"line":1369,"column":0},"end":{"line":1369,"column":58}},"1369":{"start":{"line":1370,"column":0},"end":{"line":1370,"column":53}},"1370":{"start":{"line":1371,"column":0},"end":{"line":1371,"column":62}},"1371":{"start":{"line":1372,"column":0},"end":{"line":1372,"column":3}},"1372":{"start":{"line":1373,"column":0},"end":{"line":1373,"column":0}},"1373":{"start":{"line":1374,"column":0},"end":{"line":1374,"column":60}},"1374":{"start":{"line":1375,"column":0},"end":{"line":1375,"column":34}},"1375":{"start":{"line":1376,"column":0},"end":{"line":1376,"column":78}},"1376":{"start":{"line":1377,"column":0},"end":{"line":1377,"column":0}},"1377":{"start":{"line":1378,"column":0},"end":{"line":1378,"column":57}},"1378":{"start":{"line":1379,"column":0},"end":{"line":1379,"column":14}},"1379":{"start":{"line":1380,"column":0},"end":{"line":1380,"column":40}},"1380":{"start":{"line":1381,"column":0},"end":{"line":1381,"column":35}},"1381":{"start":{"line":1382,"column":0},"end":{"line":1382,"column":8}},"1382":{"start":{"line":1383,"column":0},"end":{"line":1383,"column":7}},"1383":{"start":{"line":1384,"column":0},"end":{"line":1384,"column":0}},"1384":{"start":{"line":1385,"column":0},"end":{"line":1385,"column":91}},"1385":{"start":{"line":1386,"column":0},"end":{"line":1386,"column":27}},"1386":{"start":{"line":1387,"column":0},"end":{"line":1387,"column":3}},"1387":{"start":{"line":1388,"column":0},"end":{"line":1388,"column":0}},"1388":{"start":{"line":1389,"column":0},"end":{"line":1389,"column":58}},"1389":{"start":{"line":1390,"column":0},"end":{"line":1390,"column":34}},"1390":{"start":{"line":1391,"column":0},"end":{"line":1391,"column":78}},"1391":{"start":{"line":1392,"column":0},"end":{"line":1392,"column":0}},"1392":{"start":{"line":1393,"column":0},"end":{"line":1393,"column":63}},"1393":{"start":{"line":1394,"column":0},"end":{"line":1394,"column":14}},"1394":{"start":{"line":1395,"column":0},"end":{"line":1395,"column":40}},"1395":{"start":{"line":1396,"column":0},"end":{"line":1396,"column":44}},"1396":{"start":{"line":1397,"column":0},"end":{"line":1397,"column":8}},"1397":{"start":{"line":1398,"column":0},"end":{"line":1398,"column":7}},"1398":{"start":{"line":1399,"column":0},"end":{"line":1399,"column":0}},"1399":{"start":{"line":1400,"column":0},"end":{"line":1400,"column":97}},"1400":{"start":{"line":1401,"column":0},"end":{"line":1401,"column":27}},"1401":{"start":{"line":1402,"column":0},"end":{"line":1402,"column":3}},"1402":{"start":{"line":1403,"column":0},"end":{"line":1403,"column":0}},"1403":{"start":{"line":1404,"column":0},"end":{"line":1404,"column":45}},"1404":{"start":{"line":1405,"column":0},"end":{"line":1405,"column":45}},"1405":{"start":{"line":1406,"column":0},"end":{"line":1406,"column":41}},"1406":{"start":{"line":1407,"column":0},"end":{"line":1407,"column":47}},"1407":{"start":{"line":1408,"column":0},"end":{"line":1408,"column":46}},"1408":{"start":{"line":1409,"column":0},"end":{"line":1409,"column":3}},"1409":{"start":{"line":1410,"column":0},"end":{"line":1410,"column":0}},"1410":{"start":{"line":1411,"column":0},"end":{"line":1411,"column":34}},"1411":{"start":{"line":1412,"column":0},"end":{"line":1412,"column":55}},"1412":{"start":{"line":1413,"column":0},"end":{"line":1413,"column":61}},"1413":{"start":{"line":1414,"column":0},"end":{"line":1414,"column":4}},"1414":{"start":{"line":1415,"column":0},"end":{"line":1415,"column":53}},"1415":{"start":{"line":1416,"column":0},"end":{"line":1416,"column":101}},"1416":{"start":{"line":1417,"column":0},"end":{"line":1417,"column":44}},"1417":{"start":{"line":1418,"column":0},"end":{"line":1418,"column":12}},"1418":{"start":{"line":1419,"column":0},"end":{"line":1419,"column":62}},"1419":{"start":{"line":1420,"column":0},"end":{"line":1420,"column":5}},"1420":{"start":{"line":1421,"column":0},"end":{"line":1421,"column":3}},"1421":{"start":{"line":1422,"column":0},"end":{"line":1422,"column":0}},"1422":{"start":{"line":1423,"column":0},"end":{"line":1423,"column":34}},"1423":{"start":{"line":1424,"column":0},"end":{"line":1424,"column":52}},"1424":{"start":{"line":1425,"column":0},"end":{"line":1425,"column":31}},"1425":{"start":{"line":1426,"column":0},"end":{"line":1426,"column":97}},"1426":{"start":{"line":1427,"column":0},"end":{"line":1427,"column":4}},"1427":{"start":{"line":1428,"column":0},"end":{"line":1428,"column":65}},"1428":{"start":{"line":1429,"column":0},"end":{"line":1429,"column":47}},"1429":{"start":{"line":1430,"column":0},"end":{"line":1430,"column":28}},"1430":{"start":{"line":1431,"column":0},"end":{"line":1431,"column":54}},"1431":{"start":{"line":1432,"column":0},"end":{"line":1432,"column":30}},"1432":{"start":{"line":1433,"column":0},"end":{"line":1433,"column":23}},"1433":{"start":{"line":1434,"column":0},"end":{"line":1434,"column":66}},"1434":{"start":{"line":1435,"column":0},"end":{"line":1435,"column":7}},"1435":{"start":{"line":1436,"column":0},"end":{"line":1436,"column":0}},"1436":{"start":{"line":1437,"column":0},"end":{"line":1437,"column":55}},"1437":{"start":{"line":1438,"column":0},"end":{"line":1438,"column":90}},"1438":{"start":{"line":1439,"column":0},"end":{"line":1439,"column":3}},"1439":{"start":{"line":1440,"column":0},"end":{"line":1440,"column":0}},"1440":{"start":{"line":1441,"column":0},"end":{"line":1441,"column":86}},"1441":{"start":{"line":1442,"column":0},"end":{"line":1442,"column":66}},"1442":{"start":{"line":1443,"column":0},"end":{"line":1443,"column":47}},"1443":{"start":{"line":1444,"column":0},"end":{"line":1444,"column":53}},"1444":{"start":{"line":1445,"column":0},"end":{"line":1445,"column":7}},"1445":{"start":{"line":1446,"column":0},"end":{"line":1446,"column":0}},"1446":{"start":{"line":1447,"column":0},"end":{"line":1447,"column":12}},"1447":{"start":{"line":1448,"column":0},"end":{"line":1448,"column":15}},"1448":{"start":{"line":1449,"column":0},"end":{"line":1449,"column":43}},"1449":{"start":{"line":1450,"column":0},"end":{"line":1450,"column":39}},"1450":{"start":{"line":1451,"column":0},"end":{"line":1451,"column":8}},"1451":{"start":{"line":1452,"column":0},"end":{"line":1452,"column":14}},"1452":{"start":{"line":1453,"column":0},"end":{"line":1453,"column":42}},"1453":{"start":{"line":1454,"column":0},"end":{"line":1454,"column":42}},"1454":{"start":{"line":1455,"column":0},"end":{"line":1455,"column":56}},"1455":{"start":{"line":1456,"column":0},"end":{"line":1456,"column":58}},"1456":{"start":{"line":1457,"column":0},"end":{"line":1457,"column":50}},"1457":{"start":{"line":1458,"column":0},"end":{"line":1458,"column":62}},"1458":{"start":{"line":1459,"column":0},"end":{"line":1459,"column":8}},"1459":{"start":{"line":1460,"column":0},"end":{"line":1460,"column":21}},"1460":{"start":{"line":1461,"column":0},"end":{"line":1461,"column":64}},"1461":{"start":{"line":1462,"column":0},"end":{"line":1462,"column":52}},"1462":{"start":{"line":1463,"column":0},"end":{"line":1463,"column":48}},"1463":{"start":{"line":1464,"column":0},"end":{"line":1464,"column":50}},"1464":{"start":{"line":1465,"column":0},"end":{"line":1465,"column":60}},"1465":{"start":{"line":1466,"column":0},"end":{"line":1466,"column":48}},"1466":{"start":{"line":1467,"column":0},"end":{"line":1467,"column":8}},"1467":{"start":{"line":1468,"column":0},"end":{"line":1468,"column":20}},"1468":{"start":{"line":1469,"column":0},"end":{"line":1469,"column":56}},"1469":{"start":{"line":1470,"column":0},"end":{"line":1470,"column":42}},"1470":{"start":{"line":1471,"column":0},"end":{"line":1471,"column":75}},"1471":{"start":{"line":1472,"column":0},"end":{"line":1472,"column":8}},"1472":{"start":{"line":1473,"column":0},"end":{"line":1473,"column":19}},"1473":{"start":{"line":1474,"column":0},"end":{"line":1474,"column":55}},"1474":{"start":{"line":1475,"column":0},"end":{"line":1475,"column":60}},"1475":{"start":{"line":1476,"column":0},"end":{"line":1476,"column":48}},"1476":{"start":{"line":1477,"column":0},"end":{"line":1477,"column":62}},"1477":{"start":{"line":1478,"column":0},"end":{"line":1478,"column":8}},"1478":{"start":{"line":1479,"column":0},"end":{"line":1479,"column":6}},"1479":{"start":{"line":1480,"column":0},"end":{"line":1480,"column":3}},"1480":{"start":{"line":1481,"column":0},"end":{"line":1481,"column":0}},"1481":{"start":{"line":1482,"column":0},"end":{"line":1482,"column":55}},"1482":{"start":{"line":1483,"column":0},"end":{"line":1483,"column":17}},"1483":{"start":{"line":1484,"column":0},"end":{"line":1484,"column":25}},"1484":{"start":{"line":1485,"column":0},"end":{"line":1485,"column":27}},"1485":{"start":{"line":1486,"column":0},"end":{"line":1486,"column":22}},"1486":{"start":{"line":1487,"column":0},"end":{"line":1487,"column":7}},"1487":{"start":{"line":1488,"column":0},"end":{"line":1488,"column":56}},"1488":{"start":{"line":1489,"column":0},"end":{"line":1489,"column":12}},"1489":{"start":{"line":1490,"column":0},"end":{"line":1490,"column":7}},"1490":{"start":{"line":1491,"column":0},"end":{"line":1491,"column":20}},"1491":{"start":{"line":1492,"column":0},"end":{"line":1492,"column":27}},"1492":{"start":{"line":1493,"column":0},"end":{"line":1493,"column":23}},"1493":{"start":{"line":1494,"column":0},"end":{"line":1494,"column":35}},"1494":{"start":{"line":1495,"column":0},"end":{"line":1495,"column":27}},"1495":{"start":{"line":1496,"column":0},"end":{"line":1496,"column":27}},"1496":{"start":{"line":1497,"column":0},"end":{"line":1497,"column":31}},"1497":{"start":{"line":1498,"column":0},"end":{"line":1498,"column":10}},"1498":{"start":{"line":1499,"column":0},"end":{"line":1499,"column":32}},"1499":{"start":{"line":1500,"column":0},"end":{"line":1500,"column":8}},"1500":{"start":{"line":1501,"column":0},"end":{"line":1501,"column":7}},"1501":{"start":{"line":1502,"column":0},"end":{"line":1502,"column":21}},"1502":{"start":{"line":1503,"column":0},"end":{"line":1503,"column":27}},"1503":{"start":{"line":1504,"column":0},"end":{"line":1504,"column":23}},"1504":{"start":{"line":1505,"column":0},"end":{"line":1505,"column":28}},"1505":{"start":{"line":1506,"column":0},"end":{"line":1506,"column":27}},"1506":{"start":{"line":1507,"column":0},"end":{"line":1507,"column":31}},"1507":{"start":{"line":1508,"column":0},"end":{"line":1508,"column":29}},"1508":{"start":{"line":1509,"column":0},"end":{"line":1509,"column":10}},"1509":{"start":{"line":1510,"column":0},"end":{"line":1510,"column":32}},"1510":{"start":{"line":1511,"column":0},"end":{"line":1511,"column":8}},"1511":{"start":{"line":1512,"column":0},"end":{"line":1512,"column":6}},"1512":{"start":{"line":1513,"column":0},"end":{"line":1513,"column":3}},"1513":{"start":{"line":1514,"column":0},"end":{"line":1514,"column":0}},"1514":{"start":{"line":1515,"column":0},"end":{"line":1515,"column":55}},"1515":{"start":{"line":1516,"column":0},"end":{"line":1516,"column":17}},"1516":{"start":{"line":1517,"column":0},"end":{"line":1517,"column":25}},"1517":{"start":{"line":1518,"column":0},"end":{"line":1518,"column":27}},"1518":{"start":{"line":1519,"column":0},"end":{"line":1519,"column":22}},"1519":{"start":{"line":1520,"column":0},"end":{"line":1520,"column":7}},"1520":{"start":{"line":1521,"column":0},"end":{"line":1521,"column":39}},"1521":{"start":{"line":1522,"column":0},"end":{"line":1522,"column":3}},"1522":{"start":{"line":1523,"column":0},"end":{"line":1523,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"995":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1023":0,"1024":0,"1025":0,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1040":0,"1041":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1059":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1145":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1177":0,"1178":0,"1179":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1196":0,"1197":0,"1198":0,"1199":0,"1200":0,"1201":0,"1202":0,"1203":0,"1204":0,"1205":0,"1206":0,"1207":0,"1208":0,"1209":0,"1210":0,"1211":0,"1212":0,"1213":0,"1214":0,"1215":0,"1216":0,"1217":0,"1218":0,"1219":0,"1220":0,"1221":0,"1222":0,"1223":0,"1224":0,"1225":0,"1226":0,"1227":0,"1228":0,"1229":0,"1230":0,"1231":0,"1232":0,"1233":0,"1234":0,"1235":0,"1236":0,"1237":0,"1238":0,"1239":0,"1240":0,"1241":0,"1242":0,"1243":0,"1244":0,"1245":0,"1246":0,"1247":0,"1248":0,"1249":0,"1250":0,"1251":0,"1252":0,"1253":0,"1254":0,"1255":0,"1256":0,"1257":0,"1258":0,"1259":0,"1260":0,"1261":0,"1262":0,"1263":0,"1264":0,"1265":0,"1266":0,"1267":0,"1268":0,"1269":0,"1270":0,"1271":0,"1272":0,"1273":0,"1274":0,"1275":0,"1276":0,"1277":0,"1278":0,"1279":0,"1280":0,"1281":0,"1282":0,"1283":0,"1284":0,"1285":0,"1286":0,"1287":0,"1288":0,"1289":0,"1290":0,"1291":0,"1292":0,"1293":0,"1294":0,"1295":0,"1296":0,"1297":0,"1298":0,"1299":0,"1300":0,"1301":0,"1302":0,"1303":0,"1304":0,"1305":0,"1306":0,"1307":0,"1308":0,"1309":0,"1310":0,"1311":0,"1312":0,"1313":0,"1314":0,"1315":0,"1316":0,"1317":0,"1318":0,"1319":0,"1320":0,"1321":0,"1322":0,"1323":0,"1324":0,"1325":0,"1326":0,"1327":0,"1328":0,"1329":0,"1330":0,"1331":0,"1332":0,"1333":0,"1334":0,"1335":0,"1336":0,"1337":0,"1338":0,"1339":0,"1340":0,"1341":0,"1342":0,"1343":0,"1344":0,"1345":0,"1346":0,"1347":0,"1348":0,"1349":0,"1350":0,"1351":0,"1352":0,"1353":0,"1354":0,"1355":0,"1356":0,"1357":0,"1358":0,"1359":0,"1360":0,"1361":0,"1362":0,"1363":0,"1364":0,"1365":0,"1366":0,"1367":0,"1368":0,"1369":0,"1370":0,"1371":0,"1372":0,"1373":0,"1374":0,"1375":0,"1376":0,"1377":0,"1378":0,"1379":0,"1380":0,"1381":0,"1382":0,"1383":0,"1384":0,"1385":0,"1386":0,"1387":0,"1388":0,"1389":0,"1390":0,"1391":0,"1392":0,"1393":0,"1394":0,"1395":0,"1396":0,"1397":0,"1398":0,"1399":0,"1400":0,"1401":0,"1402":0,"1403":0,"1404":0,"1405":0,"1406":0,"1407":0,"1408":0,"1409":0,"1410":0,"1411":0,"1412":0,"1413":0,"1414":0,"1415":0,"1416":0,"1417":0,"1418":0,"1419":0,"1420":0,"1421":0,"1422":0,"1423":0,"1424":0,"1425":0,"1426":0,"1427":0,"1428":0,"1429":0,"1430":0,"1431":0,"1432":0,"1433":0,"1434":0,"1435":0,"1436":0,"1437":0,"1438":0,"1439":0,"1440":0,"1441":0,"1442":0,"1443":0,"1444":0,"1445":0,"1446":0,"1447":0,"1448":0,"1449":0,"1450":0,"1451":0,"1452":0,"1453":0,"1454":0,"1455":0,"1456":0,"1457":0,"1458":0,"1459":0,"1460":0,"1461":0,"1462":0,"1463":0,"1464":0,"1465":0,"1466":0,"1467":0,"1468":0,"1469":0,"1470":0,"1471":0,"1472":0,"1473":0,"1474":0,"1475":0,"1476":0,"1477":0,"1478":0,"1479":0,"1480":0,"1481":0,"1482":0,"1483":0,"1484":0,"1485":0,"1486":0,"1487":0,"1488":0,"1489":0,"1490":0,"1491":0,"1492":0,"1493":0,"1494":0,"1495":0,"1496":0,"1497":0,"1498":0,"1499":0,"1500":0,"1501":0,"1502":0,"1503":0,"1504":0,"1505":0,"1506":0,"1507":0,"1508":0,"1509":0,"1510":0,"1511":0,"1512":0,"1513":0,"1514":0,"1515":0,"1516":0,"1517":0,"1518":0,"1519":0,"1520":0,"1521":0,"1522":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1523,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":1523,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":1523,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":1523,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/audit/decorators/audit.decorator.ts": {"path":"/workspaces/CurrentDao-backend/src/audit/decorators/audit.decorator.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":73}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":34}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":14}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":16}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":38}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":31}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":23}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":27}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":31}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":32}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":28}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":22}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":37}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":37}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":54}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":10}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":36}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":8}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":62}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":65}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":26}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":57}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":66}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":62}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":64}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":54}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":55}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":44}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":47}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":47}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":7}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":21}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":62}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":5}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":4}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":2}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":69}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":15}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":31}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":5}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":2}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":67}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":16}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":5}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":2}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":69}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":16}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":15}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":31}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":30}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":2}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":69}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":16}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":15}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":31}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":53}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":2}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":70}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":16}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":15}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":32}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":53}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":2}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":70}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":16}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":15}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":32}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":55}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":5}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":2}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":69}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":16}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":15}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":31}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":55}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":2}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":69}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":16}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":15}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":31}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":55}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":2}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":68}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":16}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":15}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":30}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":33}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":52}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":25}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":2}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":69}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":16}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":15}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":31}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":33}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":52}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":25}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":5}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":2}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":75}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":16}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":15}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":38}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":53}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":25}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":5}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":2}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":74}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":16}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":37}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":35}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":57}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":25}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":29}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":30}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":2}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":73}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":16}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":15}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":36}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":34}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":55}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":25}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":5}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":2}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":75}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":16}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":15}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":38}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":42}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":55}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":29}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":5}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":2}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":76}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":16}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":15}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":39}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":35}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":53}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":25}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":5}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":2}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":78}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":16}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":15}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":41}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":39}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":55}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":2}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":57}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":19}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":16}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":24}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":35}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":5}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":44}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":56}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":35}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":22}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":21}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":11}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":56}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":21}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":17}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":35}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":50}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":46}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":63}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":29}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":50}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":66}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":63}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":24}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":36}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":96}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":26}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":34}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":53}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":12}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":71}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":36}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":9}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":7}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":20}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":6}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":22}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":4}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":1}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":27}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":12}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":29}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":29}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":25}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":33}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":34}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":29}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":30}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":9}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":3}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":75}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":26}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":49}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":53}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":57}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":18}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":71}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":62}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":64}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":54}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":55}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":6}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":46}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":23}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":4}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":1}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":27}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":12}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":18}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":25}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":21}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":9}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":3}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":19}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":16}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":24}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":35}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":5}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":50}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":32}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":22}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":39}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":38}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":7}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":22}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":4}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":1}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":31}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":22}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":24}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":75}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":9}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":3}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":19}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":16}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":24}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":35}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":5}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":34}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":36}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":23}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":44}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":35}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":63}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":7}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":22}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":4}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":1}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":67}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":19}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":16}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":24}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":35}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":5}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":43}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":22}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":4}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":1}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":47}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":19}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":16}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":24}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":35}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":40}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":22}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":4}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":1}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":59}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":19}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":16}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":24}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":35}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":5}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":46}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":22}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":4}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":1}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":53}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":33}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":44}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":38}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":76}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":5}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":52}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":4}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":366,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":366,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":366,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":366,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/audit/entities/audit-log.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/audit/entities/audit-log.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":108}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":20}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":22}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":22}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":20}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":20}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":20}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":34}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":32}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":34}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":36}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":40}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":16}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":14}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":28}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":24}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":20}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":34}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":27}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":14}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":24}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":1}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":24}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":1}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":21}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":23}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":33}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":13}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":46}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":22}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":48}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":26}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":79}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":26}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":75}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":50}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":46}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":18}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":49}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":61}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":63}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":21}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":65}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":25}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":64}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":22}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":65}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":66}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":21}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":54}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":94}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":93}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":23}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":43}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":23}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":43}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":13}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":19}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":21}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":20}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":20}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":7}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":20}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":22}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":18}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":26}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":30}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":6}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":12}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":52}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":25}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":6}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":15}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":81}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":30}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":32}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":6}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":4}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":59}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":61}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":21}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":66}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":48}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":20}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":72}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":68}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":20}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":67}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":19}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":49}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":21}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":49}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":43}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":25}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":20}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":19}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":19}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":26}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":24}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":23}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":43}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":17}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":31}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":26}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":32}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":32}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":29}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":27}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":4}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":43}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":24}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":19}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":22}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":29}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":25}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":24}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":24}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":7}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":28}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":19}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":23}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":20}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":26}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":7}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":20}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":23}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":25}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":24}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":7}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":4}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":43}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":27}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":27}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":26}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":20}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":23}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":22}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":25}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":7}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":21}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":22}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":25}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":30}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":27}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":6}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":27}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":20}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":21}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":7}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":4}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":65}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":25}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":48}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":20}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":47}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":19}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":43}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":16}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":21}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":24}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":20}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":23}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":23}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":25}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":4}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":43}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":13}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":33}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":33}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":27}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":23}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":19}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":26}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":23}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":22}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":7}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":20}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":19}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":20}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":26}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":24}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":25}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":7}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":4}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":43}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":16}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":26}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":27}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":29}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":34}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":29}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":19}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":22}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":19}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":7}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":4}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":43}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":10}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":18}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":21}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":19}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":18}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":22}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":26}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":24}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":4}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":51}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":23}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":51}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":23}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":0}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":56}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":27}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":60}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":32}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":55}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":27}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":54}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":26}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":0}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":52}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":24}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":43}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":18}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":0}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":43}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":18}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":33}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":36}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":33}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":35}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":33}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":23}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":27}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":21}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":28}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":331,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":331,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":331,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":331,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/audit/entities/transaction-log.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/audit/entities/transaction-log.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":131}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":29}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":38}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":44}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":28}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":36}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":20}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":32}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":24}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":32}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":40}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":31}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":26}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":22}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":28}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":20}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":26}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":24}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":22}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":33}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":26}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":28}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":38}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":38}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":34}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":30}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":36}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":36}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":34}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":18}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":1}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":26}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":1}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":27}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":29}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":33}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":13}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":50}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":24}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":90}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":54}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":32}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":63}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":60}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":31}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":58}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":29}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":47}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":53}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":25}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":56}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":27}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":61}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":32}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":74}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":34}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":55}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":17}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":55}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":26}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":55}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":55}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":55}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":24}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":40}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":28}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":64}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":32}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":69}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":28}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":66}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":74}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":32}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":69}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":24}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":43}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":17}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":13}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":17}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":19}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":21}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":21}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":20}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":34}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":6}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":14}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":19}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":21}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":34}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":6}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":20}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":17}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":19}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":6}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":4}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":43}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":18}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":24}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":22}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":18}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":27}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":15}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":31}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":43}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":6}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":29}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":33}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":4}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":43}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":20}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":24}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":26}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":21}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":37}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":26}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":26}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":4}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":43}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":27}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":24}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":19}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":27}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":29}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":25}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":24}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":7}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":15}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":64}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":21}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":26}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":24}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":6}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":15}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":64}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":25}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":25}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":21}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":23}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":25}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":26}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":9}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":26}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":24}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":6}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":16}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":24}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":46}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":23}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":21}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":27}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":24}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":9}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":26}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":24}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":6}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":4}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":43}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":9}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":18}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":50}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":20}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":19}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":21}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":20}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":26}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":7}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":23}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":22}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":27}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":29}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":7}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":4}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":43}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":13}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":20}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":19}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":22}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":21}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":18}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":21}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":20}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":23}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":19}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":21}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":22}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":20}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":7}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":4}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":43}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":10}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":22}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":24}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":19}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":17}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":22}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":22}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":22}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":7}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":30}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":4}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":43}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":13}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":20}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":21}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":22}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":20}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":37}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":39}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":4}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":43}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":10}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":14}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":17}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":15}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":18}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":25}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":6}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":16}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":17}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":15}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":18}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":25}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":6}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":23}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":17}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":15}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":50}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":24}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":7}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":21}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":17}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":15}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":19}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":21}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":24}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":7}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":27}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":19}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":24}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":19}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":21}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":7}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":4}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":43}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":13}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":17}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":25}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":21}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":25}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":6}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":13}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":19}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":23}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":25}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":20}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":25}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":9}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":20}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":23}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":25}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":20}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":25}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":9}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":6}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":16}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":23}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":24}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":24}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":24}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":6}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":22}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":24}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":24}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":23}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":27}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":6}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":4}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":43}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":12}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":27}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":14}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":21}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":15}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":22}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":25}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":23}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":6}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":78}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":16}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":21}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":23}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":26}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":6}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":16}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":23}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":23}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":21}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":6}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":4}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":0}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":43}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":19}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":26}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":33}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":21}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":27}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":20}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":20}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":18}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":23}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":7}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":26}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":4}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":43}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":14}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":22}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":20}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":19}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":21}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":24}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":22}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":7}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":14}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":30}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":20}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":23}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":25}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":6}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":4}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":0}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":49}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":21}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":0}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":43}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":24}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":0}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":43}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":17}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":17}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":21}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":23}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":27}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":26}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":26}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":25}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":6}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":46}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":21}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":0}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":46}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":21}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":0}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":70}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":21}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":0}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":33}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":20}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":0}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":49}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":21}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":50}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":22}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":0}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":68}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":20}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":0}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":50}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":22}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":0}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":68}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":20}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":0}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":51}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":23}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":0}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":69}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":21}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":0}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":67}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":19}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":0}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":72}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":24}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":0}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":68}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":20}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":0}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":67}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":19}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":52}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":24}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":0}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":76}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":27}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":0}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":50}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":22}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":0}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":68}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":20}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":0}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":68}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":26}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":0}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":57}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":29}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":0}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":57}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":29}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":0}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":69}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":28}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":0}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":62}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":33}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":0}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":59}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":35}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":0}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":43}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":15}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":29}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":28}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":21}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":22}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":23}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":20}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":22}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":23}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":19}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":26}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":30}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":23}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":7}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":4}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":0}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":43}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":18}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":0}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":43}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":18}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":48}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":39}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":22}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":0}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":27}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":33}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":31}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":35}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":29}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":34}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":32}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":23}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":27}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":21}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":33}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":31}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":28}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":23}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":30}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":541,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":541,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":541,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":541,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/audit/interceptors/audit.interceptor.ts": {"path":"/workspaces/CurrentDao-backend/src/audit/interceptors/audit.interceptor.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":18}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":19}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":14}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":44}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":41}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":51}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":37}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":16}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":38}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":68}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":48}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":58}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":62}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":14}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":48}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":62}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":37}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":74}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":79}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":33}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":56}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":58}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":27}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":39}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":9}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":52}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":59}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":27}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":29}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":7}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":45}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":66}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":7}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":31}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":78}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":28}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":41}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":44}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":71}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":45}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":47}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":57}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":24}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":20}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":10}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":40}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":25}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":19}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":7}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":20}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":31}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":56}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":7}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":73}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":18}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":60}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":41}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":46}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":21}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":27}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":6}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":65}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":51}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":31}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":18}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":22}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":53}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":30}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":34}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":34}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":40}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":38}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":44}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":43}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":44}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":36}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":30}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":46}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":41}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":20}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":63}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":65}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":64}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":62}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":33}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":28}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":17}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":36}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":37}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":18}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":41}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":33}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":10}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":15}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":23}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":22}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":19}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":10}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":33}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":8}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":52}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":40}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":20}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":60}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":63}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":8}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":17}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":68}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":31}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":25}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":23}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":20}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":8}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":23}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":47}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":37}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":37}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":7}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":45}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":54}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":70}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":38}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":32}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":62}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":34}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":29}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":34}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":26}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":43}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":23}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":50}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":18}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":32}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":29}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":27}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":20}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":8}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":33}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":57}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":56}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":3}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":31}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":23}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":23}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":22}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":16}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":20}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":31}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":46}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":46}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":50}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":43}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":79}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":46}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":59}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":65}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":5}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":30}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":28}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":67}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":53}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":24}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":27}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":27}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":29}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":6}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":34}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":28}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":44}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":44}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":69}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":5}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":47}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":28}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":39}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":22}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":56}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":26}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":29}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":29}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":31}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":8}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":5}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":57}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":49}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":3}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":37}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":21}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":18}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":22}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":16}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":30}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":55}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":57}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":65}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":45}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":26}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":53}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":20}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":20}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":40}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":42}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":46}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":54}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":56}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":60}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":19}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":26}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":40}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":40}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":39}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":8}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":13}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":17}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":21}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":20}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":23}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":8}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":17}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":39}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":8}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":14}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":29}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":24}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":17}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":8}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":17}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":22}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":49}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":17}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":23}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":50}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":8}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":14}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":38}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":34}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":40}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":48}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":10}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":8}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":16}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":39}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":20}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":29}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":28}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":10}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":8}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":37}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":37}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":7}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":68}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":3}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":37}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":35}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":23}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":22}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":16}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":20}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":31}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":38}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":66}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":42}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":53}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":64}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":73}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":39}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":53}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":64}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":22}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":58}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":19}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":57}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":43}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":24}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":32}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":35}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":44}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":7}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":0}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":34}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":34}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":44}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":46}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":45}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":44}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":8}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":31}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":31}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":39}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":41}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":30}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":43}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":51}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":8}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":5}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":0}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":61}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":3}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":25}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":23}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":15}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":22}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":20}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":31}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":46}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":0}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":31}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":22}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":42}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":29}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":25}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":35}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":24}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":50}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":20}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":20}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":6}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":0}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":43}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":43}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":49}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":3}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":36}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":35}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":15}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":22}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":20}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":31}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":46}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":37}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":61}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":48}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":69}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":0}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":55}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":44}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":43}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":41}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":19}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":35}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":28}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":7}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":0}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":61}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":3}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":59}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":30}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":27}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":29}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":32}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":33}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":6}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":0}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":73}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":3}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":56}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":66}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":71}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":66}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":68}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":21}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":3}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":0}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":60}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":64}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":21}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":3}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":51}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":30}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":47}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":3}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":0}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":53}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":30}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":35}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":3}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":0}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":54}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":30}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":12}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":62}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":65}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":6}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":3}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":0}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":55}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":30}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":12}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":35}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":31}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":23}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":47}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":38}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":37}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":20}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":29}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":6}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":3}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":0}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":57}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":30}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":12}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":35}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":39}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":25}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":42}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":39}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":20}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":6}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":3}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":0}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":59}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":69}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":3}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":0}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":62}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":79}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":3}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":0}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":49}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":12}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":19}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":43}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":38}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":6}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":3}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":0}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":50}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":41}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":3}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":0}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":61}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":56}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":44}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":19}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":5}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":43}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":21}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":5}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":18}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":3}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":0}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":61}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":46}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":3}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":0}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":55}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":40}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":3}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":0}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":66}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":12}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":76}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":6}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":3}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":0}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":60}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":41}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":3}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":0}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":43}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":74}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":3}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":0}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":40}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":27}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":0}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":35}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":18}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":5}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":0}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":52}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":32}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":0}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":56}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":41}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":44}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":65}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":52}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":16}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":33}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":9}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":7}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":0}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":23}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":5}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":0}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":16}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":3}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":0}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":56}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":29}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":17}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":14}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":15}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":12}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":15}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":19}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":12}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":20}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":22}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":12}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":12}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":6}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":0}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":42}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":60}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":6}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":3}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":0}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":48}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":37}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":44}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":72}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":3}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":0}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":51}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":31}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":19}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":18}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":21}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":21}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":14}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":18}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":21}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":14}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":18}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":18}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":18}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":6}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":0}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":63}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":3}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":618,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":618,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":618,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":618,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/audit/reports/compliance.report.ts": {"path":"/workspaces/CurrentDao-backend/src/audit/reports/compliance.report.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":66}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":14}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":16}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":38}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":20}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":18}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":39}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":19}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":70}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":4}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":20}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":44}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":12}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":28}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":32}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":17}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":46}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":50}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":50}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":30}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":26}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":56}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":60}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":22}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":22}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":15}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":27}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":28}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":25}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":28}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":22}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":9}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":7}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":25}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":30}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":12}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":47}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":29}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":27}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":46}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":4}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":13}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":33}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":31}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":31}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":16}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":28}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":23}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":25}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":22}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":4}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":9}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":33}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":33}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":33}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":22}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":1}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":39}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":13}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":23}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":19}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":23}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":15}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":17}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":24}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":23}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":23}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":20}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":20}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":34}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":23}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":52}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":16}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":18}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":20}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":1}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":38}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":13}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":23}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":24}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":51}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":20}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":13}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":31}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":62}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":14}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":31}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":62}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":37}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":74}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":6}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":23}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":72}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":36}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":20}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":117}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":6}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":66}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":11}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":14}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":19}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":25}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":17}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":14}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":15}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":18}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":11}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":27}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":47}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":52}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":58}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":57}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":54}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":55}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":58}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":51}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":7}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":42}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":15}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":17}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":37}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":30}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":23}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":14}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":19}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":25}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":17}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":14}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":15}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":18}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":11}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":6}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":64}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":18}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":3}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":28}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":28}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":36}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":31}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":25}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":22}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":6}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":29}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":25}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":22}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":9}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":9}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":9}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":10}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":6}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":60}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":0}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":29}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":28}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":36}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":31}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":25}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":22}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":37}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":6}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":29}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":30}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":27}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":30}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":9}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":9}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":9}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":10}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":6}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":61}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":30}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":28}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":36}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":71}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":29}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":25}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":26}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":8}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":9}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":9}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":9}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":10}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":6}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":62}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":32}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":28}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":36}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":52}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":67}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":29}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":25}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":24}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":8}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":9}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":9}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":9}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":10}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":6}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":64}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":3}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":29}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":28}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":36}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":57}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":74}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":0}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":61}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":24}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":25}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":20}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":18}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":14}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":37}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":30}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":38}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":25}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":6}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":62}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":41}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":49}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":56}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":51}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":20}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":18}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":16}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":8}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":25}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":45}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":25}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":41}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":23}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":40}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":59}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":37}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":59}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":24}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":22}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":20}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":12}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":33}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":11}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":7}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":5}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":24}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":74}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":12}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":17}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":13}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":17}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":19}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":6}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":3}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":36}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":20}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":18}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":14}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":15}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":31}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":35}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":27}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":30}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":24}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":6}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":24}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":17}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":19}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":27}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":20}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":25}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":56}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":7}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":13}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":21}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":19}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":22}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":9}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":25}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":19}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":22}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":9}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":6}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":19}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":19}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":23}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":22}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":22}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":7}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":6}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":58}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":33}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":0}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":43}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":48}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":22}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":18}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":16}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":8}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":30}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":26}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":30}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":46}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":35}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":45}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":15}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":35}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":25}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":39}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":25}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":32}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":9}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":5}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":0}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":48}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":58}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":38}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":13}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":24}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":62}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":31}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":53}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":37}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":8}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":6}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":12}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":17}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":25}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":29}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":21}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":24}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":32}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":8}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":37}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":70}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":70}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":6}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":3}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":21}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":21}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":46}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":22}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":50}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":0}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":28}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":45}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":5}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":27}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":44}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":5}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":29}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":46}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":5}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":0}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":60}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":3}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":0}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":56}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":50}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":31}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":52}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":63}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":3}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":0}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":55}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":27}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":62}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":3}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":0}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":79}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":71}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":25}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":39}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":60}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":11}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":45}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":60}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":11}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":37}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":44}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":70}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":69}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":46}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":23}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":52}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":9}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":0}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":80}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":7}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":58}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":52}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":62}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":8}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":6}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":12}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":21}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":24}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":41}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":16}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":22}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":16}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":26}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":6}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":3}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":0}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":37}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":20}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":18}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":19}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":76}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":25}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":49}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":51}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":51}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":63}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":9}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":0}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":66}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":54}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":50}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":7}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":0}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":12}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":19}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":21}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":21}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":23}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":24}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":20}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":6}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":3}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":0}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":43}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":20}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":18}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":19}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":65}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":25}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":55}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":57}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":56}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":9}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":55}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":50}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":51}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":7}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":0}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":12}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":25}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":27}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":16}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":16}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":17}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":6}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":3}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":0}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":42}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":20}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":18}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":19}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":58}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":33}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":0}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":43}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":48}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":22}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":18}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":16}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":8}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":37}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":5}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":0}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":70}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":69}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":0}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":12}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":50}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":32}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":48}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":48}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":40}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":46}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":39}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":31}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":37}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":35}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":12}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":10}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":19}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":71}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":33}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":22}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":6}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":3}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":0}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":39}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":20}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":18}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":19}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":11}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":25}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":23}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":21}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":24}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":27}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":60}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":53}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":51}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":57}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":7}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":0}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":12}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":25}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":23}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":21}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":24}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":6}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":3}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":0}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":40}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":20}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":18}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":19}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":11}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":27}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":25}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":25}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":23}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":27}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":57}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":55}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":55}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":53}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":7}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":0}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":12}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":27}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":25}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":25}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":23}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":6}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":3}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":0}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":43}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":20}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":18}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":19}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":66}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":25}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":62}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":53}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":55}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":52}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":9}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":0}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":12}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":22}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":17}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":19}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":16}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":6}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":3}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":0}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":36}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":20}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":18}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":19}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":11}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":27}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":27}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":27}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":16}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":27}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":57}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":57}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":57}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":50}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":7}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":0}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":12}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":27}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":27}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":27}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":16}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":6}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":3}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":0}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":73}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":61}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":63}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":3}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":0}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":30}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":25}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":36}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":56}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":63}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":12}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":18}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":35}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":27}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":30}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":23}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":11}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":26}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":52}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":24}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":82}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":28}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":23}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":84}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":12}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":11}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":26}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":59}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":24}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":70}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":28}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":23}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":73}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":12}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":10}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":32}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":23}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":8}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":13}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":19}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":51}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":27}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":28}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":23}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":11}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":26}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":43}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":24}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":76}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":28}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":23}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":100}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":12}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":11}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":26}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":58}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":79}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":28}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":23}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":77}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":12}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":10}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":32}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":23}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":8}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":6}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":0}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":59}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":3}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":0}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":36}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":21}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":20}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":18}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":31}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":46}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":70}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":18}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":21}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":0}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":82}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":36}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":52}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":66}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":58}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":9}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":0}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":31}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":20}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":42}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":14}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":44}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":7}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":5}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":0}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":55}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":58}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":65}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":16}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":49}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":33}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":10}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":9}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":0}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":30}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":20}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":48}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":14}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":52}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":7}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":5}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":0}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":12}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":76}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":0}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":12}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":26}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":36}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":13}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":12}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":30}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":28}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":26}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":6}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":3}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":0}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":37}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":21}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":20}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":18}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":22}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":58}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":13}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":3}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":0}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":31}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":21}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":45}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":53}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":3}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":0}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":41}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":80}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":3}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":0}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":73}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":37}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":79}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":3}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":0}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":41}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":20}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":18}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":14}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":49}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":53}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":6}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":53}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":22}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":26}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":0}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":40}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":32}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":19}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":32}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":54}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":9}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":23}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":32}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":60}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":9}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":45}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":5}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":0}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":34}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":3}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":0}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":41}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":20}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":18}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":13}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":11}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":19}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":23}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":22}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":22}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":6}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":5}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":60}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":12}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":7}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":37}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":25}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":64}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":30}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":8}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":6}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":3}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":0}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":67}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":39}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":32}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":3}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":0}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":69}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":42}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":34}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":3}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":0}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":76}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":48}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":52}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":3}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":0}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":80}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":31}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":0}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":60}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":27}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":71}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":8}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":5}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":0}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":56}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":27}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":63}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":8}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":5}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":0}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":33}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":73}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":5}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":0}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":27}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":3}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":0}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":43}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":35}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":20}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":18}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":22}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":59}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":56}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":7}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":0}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":59}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":14}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":47}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":28}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":8}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":7}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":0}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":61}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":3}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":0}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":41}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":20}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":18}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":22}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":33}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":35}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":3}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":0}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":35}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":20}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":18}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":22}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":33}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":35}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":3}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":0}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":45}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":20}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":18}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":22}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":33}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":35}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":3}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":0}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":32}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":20}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":18}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":43}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":33}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":45}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":3}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":0}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":34}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":20}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":18}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":45}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":33}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":47}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":3}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":0}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":34}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":20}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":18}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":45}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":33}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":47}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":3}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":0}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":46}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":20}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":18}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":22}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":33}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":36}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":3}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":0}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":39}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":20}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":18}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":22}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":33}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":43}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":3}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":0}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":35}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":20}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":18}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":22}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":33}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":42}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":3}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":0}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":38}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":20}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":18}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":47}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":33}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":49}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":3}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":0}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":40}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":20}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":18}},"1004":{"start":{"line":1005,"column":0},"end":{"line":1005,"column":49}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":33}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":51}},"1007":{"start":{"line":1008,"column":0},"end":{"line":1008,"column":3}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":0}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":39}},"1010":{"start":{"line":1011,"column":0},"end":{"line":1011,"column":20}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":18}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":22}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":33}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":39}},"1015":{"start":{"line":1016,"column":0},"end":{"line":1016,"column":3}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":0}},"1017":{"start":{"line":1018,"column":0},"end":{"line":1018,"column":35}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":20}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":18}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":22}},"1021":{"start":{"line":1022,"column":0},"end":{"line":1022,"column":33}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":33}},"1023":{"start":{"line":1024,"column":0},"end":{"line":1024,"column":3}},"1024":{"start":{"line":1025,"column":0},"end":{"line":1025,"column":0}},"1025":{"start":{"line":1026,"column":0},"end":{"line":1026,"column":36}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":20}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":18}},"1028":{"start":{"line":1029,"column":0},"end":{"line":1029,"column":22}},"1029":{"start":{"line":1030,"column":0},"end":{"line":1030,"column":33}},"1030":{"start":{"line":1031,"column":0},"end":{"line":1031,"column":32}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":3}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":0}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":45}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":20}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":18}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":38}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":33}},"1038":{"start":{"line":1039,"column":0},"end":{"line":1039,"column":12}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":46}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":48}},"1041":{"start":{"line":1042,"column":0},"end":{"line":1042,"column":51}},"1042":{"start":{"line":1043,"column":0},"end":{"line":1043,"column":49}},"1043":{"start":{"line":1044,"column":0},"end":{"line":1044,"column":6}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":3}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":0}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":38}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":20}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":18}},"1049":{"start":{"line":1050,"column":0},"end":{"line":1050,"column":22}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":33}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":42}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":3}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":0}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":36}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":20}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":18}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":22}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":33}},"1059":{"start":{"line":1060,"column":0},"end":{"line":1060,"column":43}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":3}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":0}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":42}},"1063":{"start":{"line":1064,"column":0},"end":{"line":1064,"column":20}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":18}},"1065":{"start":{"line":1066,"column":0},"end":{"line":1066,"column":38}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":33}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":12}},"1068":{"start":{"line":1069,"column":0},"end":{"line":1069,"column":48}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":49}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":48}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":48}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":6}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":3}},"1074":{"start":{"line":1075,"column":0},"end":{"line":1075,"column":0}},"1075":{"start":{"line":1076,"column":0},"end":{"line":1076,"column":42}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":20}},"1077":{"start":{"line":1078,"column":0},"end":{"line":1078,"column":18}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":22}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":33}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":43}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":3}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":0}},"1083":{"start":{"line":1084,"column":0},"end":{"line":1084,"column":40}},"1084":{"start":{"line":1085,"column":0},"end":{"line":1085,"column":20}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":18}},"1086":{"start":{"line":1087,"column":0},"end":{"line":1087,"column":22}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":33}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":42}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":3}},"1090":{"start":{"line":1091,"column":0},"end":{"line":1091,"column":0}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":40}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":20}},"1093":{"start":{"line":1094,"column":0},"end":{"line":1094,"column":18}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":22}},"1095":{"start":{"line":1096,"column":0},"end":{"line":1096,"column":33}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":42}},"1097":{"start":{"line":1098,"column":0},"end":{"line":1098,"column":3}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":0}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":38}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":20}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":18}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":22}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":33}},"1104":{"start":{"line":1105,"column":0},"end":{"line":1105,"column":41}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":3}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":0}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":45}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":20}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":18}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":22}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":33}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":37}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":3}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":0}},"1115":{"start":{"line":1116,"column":0},"end":{"line":1116,"column":36}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":20}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":18}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":22}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":33}},"1120":{"start":{"line":1121,"column":0},"end":{"line":1121,"column":38}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":3}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":0}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":38}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":20}},"1125":{"start":{"line":1126,"column":0},"end":{"line":1126,"column":18}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":22}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":33}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":38}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":3}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":0}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":42}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":20}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":18}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":22}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":33}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":42}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":3}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":0}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":42}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":20}},"1141":{"start":{"line":1142,"column":0},"end":{"line":1142,"column":18}},"1142":{"start":{"line":1143,"column":0},"end":{"line":1143,"column":22}},"1143":{"start":{"line":1144,"column":0},"end":{"line":1144,"column":33}},"1144":{"start":{"line":1145,"column":0},"end":{"line":1145,"column":42}},"1145":{"start":{"line":1146,"column":0},"end":{"line":1146,"column":3}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":0}},"1147":{"start":{"line":1148,"column":0},"end":{"line":1148,"column":42}},"1148":{"start":{"line":1149,"column":0},"end":{"line":1149,"column":20}},"1149":{"start":{"line":1150,"column":0},"end":{"line":1150,"column":18}},"1150":{"start":{"line":1151,"column":0},"end":{"line":1151,"column":22}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":33}},"1152":{"start":{"line":1153,"column":0},"end":{"line":1153,"column":42}},"1153":{"start":{"line":1154,"column":0},"end":{"line":1154,"column":3}},"1154":{"start":{"line":1155,"column":0},"end":{"line":1155,"column":0}},"1155":{"start":{"line":1156,"column":0},"end":{"line":1156,"column":45}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":20}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":18}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":22}},"1159":{"start":{"line":1160,"column":0},"end":{"line":1160,"column":33}},"1160":{"start":{"line":1161,"column":0},"end":{"line":1161,"column":37}},"1161":{"start":{"line":1162,"column":0},"end":{"line":1162,"column":3}},"1162":{"start":{"line":1163,"column":0},"end":{"line":1163,"column":0}},"1163":{"start":{"line":1164,"column":0},"end":{"line":1164,"column":36}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":20}},"1165":{"start":{"line":1166,"column":0},"end":{"line":1166,"column":18}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":22}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":33}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":38}},"1169":{"start":{"line":1170,"column":0},"end":{"line":1170,"column":3}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":0}},"1171":{"start":{"line":1172,"column":0},"end":{"line":1172,"column":38}},"1172":{"start":{"line":1173,"column":0},"end":{"line":1173,"column":20}},"1173":{"start":{"line":1174,"column":0},"end":{"line":1174,"column":18}},"1174":{"start":{"line":1175,"column":0},"end":{"line":1175,"column":22}},"1175":{"start":{"line":1176,"column":0},"end":{"line":1176,"column":33}},"1176":{"start":{"line":1177,"column":0},"end":{"line":1177,"column":38}},"1177":{"start":{"line":1178,"column":0},"end":{"line":1178,"column":3}},"1178":{"start":{"line":1179,"column":0},"end":{"line":1179,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"995":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1023":0,"1024":0,"1025":0,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1040":0,"1041":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1049":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1059":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1145":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1177":0,"1178":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1179,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":1179,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":1179,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":1179,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/carbon-tracking.module.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/carbon-tracking.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":59}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":87}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":78}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":88}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":70}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":84}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":55}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":52}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":34}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":30}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":24}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":30}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":32}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":24}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":30}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":36}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":36}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/carbon.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/carbon.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":68}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":69}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":87}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":78}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":88}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":70}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":84}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":31}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":14}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":59}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":53}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":59}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":49}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":58}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":6}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":58}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":61}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":54}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":6}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":48}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":17}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":59}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":45}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":46}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":67}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":27}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":32}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":38}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":19}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":64}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":26}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":68}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":45}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":46}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":27}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":55}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":58}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":75}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":59}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":53}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":54}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":31}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":70}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":32}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":40}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":63}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":34}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":6}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":72,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/analytics/reduction-analytics.service.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/analytics/reduction-analytics.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":40}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":71}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":53}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":12}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":7}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":34}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":40}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":36}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":8}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":7}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":38}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":35}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":26}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":8}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":6}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":69}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":50}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":12}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":28}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":32}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":57}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":55}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":34,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/calculations/emission-calculator.service.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/calculations/emission-calculator.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":40}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":71}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":60}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":38}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":16}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":15}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":43}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":4}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":25}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":58}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":63}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":70}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":44}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":12}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":16}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":62}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":69}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":37}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":56}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":19}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":16}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":55}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":39}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":69}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":10}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":68}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":75}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":12}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":32}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":57}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":12}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":75}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":6}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":70}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":34}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":57}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":70,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":70,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":70,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":70,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/dto/carbon-calculation.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/dto/carbon-calculation.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":9}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":74}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":35}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":55}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":25}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":69}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":54}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":4}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":15}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":13}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":67}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":71}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":15}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":11}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":19}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":30}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":68}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":13}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":54}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":22}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":68}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":15}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":13}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":1}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":30}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":65}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":25}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":54}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":35}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":47}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":21}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":63}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":27}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":51}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":26}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":69,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/entities/carbon-data.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/entities/carbon-data.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":28}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":42}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":44}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":36}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":34}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":30}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":14}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":14}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":25}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":33}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":13}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":49}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":25}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":34}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":70}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":46}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":29}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":46}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":29}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":20}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":25}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":18}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":22}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":29}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":22}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":21}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":18}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":21}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":22}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":33}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":3}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":34}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":37}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":46}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":78,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":78,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":78,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":78,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/offsets/carbon-offset.service.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/offsets/carbon-offset.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":34}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":65}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":23}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":19}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":20}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":68}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":6}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":39}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":47}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":37}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":6}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":48}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":12}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":7}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":14}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":33}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":33}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":7}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":14}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":37}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":8}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":7}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":14}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":35}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":72}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":52}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":51,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/reporting/sustainability-report.service.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/reporting/sustainability-report.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":42}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":73}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":78}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":76}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":12}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":36}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":44}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":22}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":49}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":29}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":32}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":36}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":6}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":58}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":12}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":11}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":29}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":27}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":28}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":34,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/carbon/tracking/real-time-tracker.service.ts": {"path":"/workspaces/CurrentDao-backend/src/carbon/tracking/real-time-tracker.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":37}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":68}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":49}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":56}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":51}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":61}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":26}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":6}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":38}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":14}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":12}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":48}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":67}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":6}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/classification/classification.module.ts": {"path":"/workspaces/CurrentDao-backend/src/classification/classification.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":83}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":40}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":48}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":65}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":67}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":65}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":64}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":77}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":4}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":37}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":50}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":2}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":36}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":21,"column":36}},"locations":[{"start":{"line":1,"column":0},"end":{"line":21,"column":36}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":21,"column":36}},"loc":{"start":{"line":1,"column":0},"end":{"line":21,"column":36}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/classification/classification.service.ts": {"path":"/workspaces/CurrentDao-backend/src/classification/classification.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":25}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":84}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":20}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":15}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":24}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":51}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":50}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":8}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":17}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":28}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":43}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":8}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":42}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":20}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":41}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":18}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":28}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":8}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":25}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":25}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":25}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":28}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":34}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":25}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":13}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":60}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":67}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":68}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":36}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":66}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":36}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":72}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":6}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":5}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":37}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":39}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":39}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":38}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":43}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":35}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":56}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":56}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":51}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":60}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":54}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":32}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":6}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":51}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":56}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":33}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":55}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":55}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":56}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":13}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":58}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":43}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":60}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":52}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":42}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":61}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":21}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":34}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":11}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":57}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":7}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":5}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":54}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":5}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":32}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":60}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":61}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":20}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":55}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":13}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":57}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":63}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":29}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":6}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":60}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":53}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":3}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":63}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":26}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":73}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":57}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":50}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":3}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":5}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":22}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":5}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":23}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":27}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":30}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":52}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":33}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":50}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":3}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":23}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":5}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":62}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":60}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":20}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":49}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":7}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":20}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":70}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":3}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":32}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":5}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":32}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":27}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":30}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":60}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":28}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":49}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":7}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":20}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":34}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":60}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":8}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":5}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":20}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":5}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":33}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":60}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":33}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":18}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":17}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":23}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":6}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":11}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":15}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":17}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":13}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":18}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":15}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":17}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":11}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":15}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":36}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":80}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":21}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":66}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":19}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":9}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":5}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":0}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":36}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":68}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":20}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":9}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":5}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":0}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":33}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":75}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":17}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":28}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":78}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":34}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":8}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":5}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":34}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":64}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":5}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":77}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":69}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":12}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":17}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":12}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":11}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":12}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":43}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":6}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":3}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":5}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":22}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":5}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":55}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":63}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":39}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":34}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":7}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":50}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":3}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":5}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":36}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":5}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":34}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":33}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":33}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":41}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":40}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":59}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":41}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":36}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":9}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":24}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":40}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":28}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":58}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":42}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":17}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":76}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":9}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":18}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":3}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":5}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":22}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":5}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":51}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":60}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":32}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":70}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":5}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":3}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":62}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":5}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":32}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":5}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":28}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":32}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":29}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":55}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":48}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":3}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":5}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":28}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":28}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":15}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":32}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":29}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":50}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":32}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":48}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":5}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":22}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":5}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":60}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":58}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":20}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":30}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":7}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":19}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":76}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":5}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":19}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":3}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":0}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":26}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":5}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":27}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":26}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":23}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":29}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":58}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":36}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":7}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":19}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":34}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":72}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":5}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":19}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":3}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":38}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":5}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":69}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":31}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":18}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":17}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":18}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":23}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":6}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":11}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":15}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":17}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":13}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":13}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":11}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":17}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":17}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":15}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":15}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":36}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":78}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":0}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":17}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":68}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":5}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":15}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":62}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":5}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":21}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":80}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":5}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":0}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":35}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":80}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":5}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":0}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":33}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":74}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":5}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":17}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":28}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":76}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":34}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":8}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":5}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":0}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":76}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":68}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":12}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":16}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":12}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":11}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":12}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":43}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":6}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":3}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":0}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":5}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":28}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":5}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":56}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":59}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":32}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":76}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":5}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":3}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":0}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":68}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":5}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":31}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":5}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":28}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":32}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":29}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":67}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":60}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":3}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":0}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":5}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":27}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":5}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":28}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":15}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":32}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":29}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":62}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":38}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":60}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":3}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":0}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":5}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":28}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":5}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":66}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":70}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":20}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":30}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":7}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":25}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":75}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":5}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":25}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":3}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":0}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":5}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":30}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":5}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":31}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":28}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":29}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":70}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":22}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":7}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":25}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":74}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":5}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":25}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":3}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":0}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":5}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":37}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":5}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":69}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":36}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":18}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":17}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":18}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":23}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":6}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":11}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":15}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":17}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":13}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":11}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":13}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":17}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":17}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":16}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":15}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":36}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":0}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":24}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":62}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":0}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":15}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":59}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":5}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":0}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":17}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":65}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":5}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":21}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":77}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":5}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":0}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":35}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":77}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":5}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":0}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":20}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":54}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":43}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":9}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":75}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":28}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":63}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":28}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":8}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":5}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":0}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":17}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":28}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":70}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":34}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":8}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":5}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":0}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":68}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":0}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":73}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":0}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":12}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":21}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":12}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":11}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":12}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":43}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":6}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":3}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":0}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":5}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":27}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":5}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":56}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":65}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":32}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":75}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":5}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":3}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":0}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":63}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":0}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":5}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":47}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":5}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":26}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":27}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":33}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":41}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":68}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":78}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":0}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":49}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":68}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":52}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":7}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":0}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":76}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":0}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":33}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":64}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":62}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":54}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":56}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":8}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":6}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":0}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":12}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":32}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":30}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":49}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":79}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":6}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":3}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":0}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":5}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":41}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":5}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":23}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":27}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":41}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":11}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":16}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":17}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":30}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":36}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":12}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":0}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":45}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":68}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":64}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":0}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":27}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":71}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":54}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":0}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":12}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":16}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":20}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":22}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":18}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":27}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":26}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":32}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":8}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":6}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":3}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":0}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":5}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":49}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":5}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":30}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":18}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":26}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":21}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":23}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":14}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":33}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":18}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":6}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":36}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":0}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":80}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":0}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":26}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":74}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":30}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":6}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":0}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":36}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":68}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":20}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":9}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":5}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":0}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":72}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":0}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":69}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":0}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":33}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":3}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":672,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":672,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":672,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":672,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/classification/dto/category.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/classification/dto/category.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":16}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":11}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":12}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":10}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":6}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":6}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":9}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":25}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":80}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":79}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":32}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":64}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":25}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":73}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":15}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":17}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":63}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":79}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":24}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":26}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":61}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":74}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":13}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":10}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":27}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":70}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":15}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":24}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":65}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":13}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":9}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":80}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":12}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":27}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":18}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":62}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":15}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":33}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":22}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":71}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":67}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":14}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":15}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":21}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":1}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":22}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":32}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":24}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":21}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":41}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":21}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":15}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":24}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":38}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":4}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":15}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":26}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":24}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":46}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":4}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":14}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":24}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":24}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":18}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":43}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":4}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":14}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":15}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":24}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":21}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":49}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":4}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":13}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":15}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":18}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":60}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":12}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":27}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":15}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":18}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":66}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":13}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":15}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":9}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":70}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":13}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":15}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":9}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":11}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":22}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":1}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":24}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":3}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":34}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":46}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":13}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":64}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":25}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":48}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":15}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":55}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":22}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":79}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":25}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":61}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":66}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":26}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":62}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":23}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":59}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":20}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":57}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":72}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":17}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":62}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":32}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":55}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":18}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":55}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":1}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":3}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":29}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":3}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":38}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":53}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":36}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":46}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":16}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":59}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":15}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":62}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":16}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":58}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":21}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":1}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":3}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":20}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":3}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":30}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":46}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":13}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":64}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":25}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":48}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":15}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":66}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":26}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":62}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":23}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":51}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":30}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":1}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":32}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":59}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":13}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":15}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":9}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":20}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":64}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":21}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":15}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":25}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":75}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":15}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":29}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":67}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":15}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":35}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":1}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":3}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":31}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":3}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":40}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":59}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":20}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":63}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":24}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":66}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":26}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":50}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":14}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":31}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":30}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":36}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":4}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":290,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":290,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":290,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":290,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/classification/dto/quality-rating.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/classification/dto/quality-rating.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":22}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":62}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":11}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":12}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":10}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":6}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":6}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":9}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":15}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":25}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":80}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":79}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":8}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":42}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":53}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":28}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":37}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":70}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":15}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":75}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":17}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":15}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":62}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":66}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":46}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":11}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":15}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":21}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":73}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":13}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":15}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":11}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":27}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":77}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":13}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":15}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":9}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":11}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":24}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":78}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":13}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":9}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":11}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":24}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":45}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":15}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":69}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":14}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":15}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":24}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":25}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":41}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":4}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":13}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":15}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":32}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":65}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":13}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":15}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":9}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":11}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":24}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":44}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":24}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":12}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":27}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":15}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":18}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":55}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":15}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":37}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":1}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":28}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":3}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":56}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":25}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":3}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":67}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":14}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":15}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":21}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":1}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":37}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":80}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":24}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":15}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":25}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":76}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":22}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":15}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":64}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":11}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":15}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":22}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":24}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":18}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":45}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":14}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":15}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":23}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":24}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":18}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":43}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":4}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":14}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":15}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":21}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":24}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":23}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":49}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":4}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":13}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":15}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":66}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":13}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":15}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":9}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":20}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":70}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":13}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":15}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":9}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":11}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":22}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":1}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":3}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":30}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":3}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":39}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":45}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":13}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":70}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":24}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":0}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":47}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":15}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":54}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":22}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":66}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":20}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":46}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":21}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":65}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":26}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":66}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":24}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":67}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":24}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":70}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":20}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":61}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":22}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":24}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":25}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":41}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":4}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":31}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":59}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":20}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":57}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":20}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":61}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":17}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":55}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":36}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":45}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":18}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":45}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":18}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":1}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":3}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":27}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":3}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":37}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":78}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":28}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":15}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":26}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":16}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":42}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":38}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":4}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":13}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":15}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":17}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":15}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":68}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":13}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":15}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":23}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":54}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":11}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":15}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":22}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":16}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":44}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":37}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":4}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":13}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":15}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":17}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":27}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":73}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":13}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":15}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":17}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":28}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":73}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":17}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":15}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":20}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":24}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":26}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":36}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":4}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":17}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":15}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":22}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":70}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":14}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":15}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":24}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":79}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":13}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":15}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":9}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":29}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":24}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":18}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":47}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":4}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":13}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":15}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":11}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":10}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":27}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":69}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":14}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":15}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":23}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":24}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":33}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":39}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":4}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":13}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":15}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":30}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":24}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":39}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":28}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":4}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":13}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":15}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":19}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":80}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":12}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":27}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":15}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":18}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":55}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":15}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":37}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":1}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":3}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":27}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":3}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":56}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":25}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":24}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":30}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":40}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":4}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":30}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":15}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":31}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":1}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":0}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":3}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":27}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":3}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":37}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":24}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":28}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":34}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":4}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":28}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":15}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":27}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":0}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":24}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":30}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":36}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":4}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":30}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":15}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":31}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":64}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":11}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":15}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":22}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":24}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":18}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":45}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":4}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":14}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":15}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":23}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":0}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":24}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":21}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":49}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":4}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":13}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":15}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":18}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":0}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":24}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":18}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":52}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":4}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":14}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":15}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":22}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":66}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":13}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":15}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":9}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":20}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":0}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":70}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":13}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":15}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":9}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":11}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":22}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":1}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":0}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":29}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":3}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":39}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":51}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":13}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":0}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":78}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":26}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":53}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":15}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":0}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":60}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":22}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":0}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":54}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":21}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":0}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":52}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":27}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":0}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":53}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":28}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":0}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":16}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":30}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":40}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":4}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":30}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":45}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":18}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":0}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":54}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":19}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":0}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":62}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":23}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":0}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":79}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":28}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":0}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":66}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":26}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":0}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":61}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":22}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":0}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":24}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":33}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":39}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":4}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":29}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":0}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":24}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":39}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":28}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":4}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":18}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":0}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":72}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":17}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":0}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":55}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":36}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":0}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":45}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":18}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":0}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":45}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":18}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":1}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":0}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":3}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":39}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":3}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":40}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":55}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":32}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":0}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":61}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":36}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":0}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":60}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":45}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":0}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":71}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":26}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":531,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":531,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":531,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":531,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/classification/entities/certification.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/classification/entities/certification.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":23}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":82}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":17}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":58}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":33}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":31}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":32}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":36}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":28}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":40}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":28}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":32}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":23}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":33}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":20}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":22}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":22}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":22}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":23}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":28}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":33}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":11}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":4}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":26}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":26}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":43}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":22}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":50}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":21}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":75}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":27}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":53}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":27}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":68}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":11}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":17}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":40}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":30}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":52}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":69}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":51}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":58}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":28}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":11}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":17}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":4}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":26}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":50}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":22}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":58}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":29}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":47}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":51}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":17}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":44}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":36}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":44}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":32}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":43}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":18}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":43}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":1}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":25}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":39}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":41}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":39}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":16}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":100}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":53}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":33}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":39}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":26}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":44}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":49}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":31}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":27}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":31}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":6}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":4}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":43}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":41}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":16}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":77}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":48}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":33}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":39}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":26}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":21}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":44}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":50}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":19}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":33}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":22}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":37}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":6}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":4}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":45}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":43}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":16}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":73}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":62}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":33}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":39}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":25}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":21}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":46}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":48}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":19}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":31}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":37}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":6}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":4}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":39}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":37}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":66}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":47}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":33}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":39}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":25}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":21}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":52}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":46}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":29}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":34}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":6}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":4}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":3}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":40}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":45}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":78}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":51}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":33}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":39}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":26}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":21}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":52}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":50}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":19}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":30}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":33}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":6}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":4}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":2}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":3}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":53}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":3}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":80}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":60}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":17}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":25}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":33}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":77}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":3}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":40}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":2}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":3}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":58}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":3}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":72}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":71}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":17}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":3}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":34}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":17}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":3}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":36}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":78}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":4}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":31}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":2}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":3}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":56}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":48}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":20}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":34}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":14}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":23}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":38}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":37}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":49}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":5}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":32}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":275,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":275,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":275,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":275,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/classification/entities/energy-category.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/classification/entities/energy-category.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":25}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":84}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":12}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":17}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":56}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":55}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":26}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":16}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":18}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":28}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":30}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":14}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":30}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":27}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":32}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":44}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":34}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":32}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":34}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":26}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":36}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":34}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":36}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":1}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":25}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":28}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":29}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":11}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":17}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":21}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":17}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":25}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":26}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":43}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":22}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":11}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":24}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":25}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":48}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":69}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":36}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":25}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":65}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":29}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":68}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":26}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":51}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":23}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":47}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":20}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":38}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":20}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":51}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":17}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":44}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":32}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":43}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":43}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":18}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":18}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":64}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":29}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":76}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":34}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":1}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":3}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":36}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":42}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":33}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":25}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":16}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":75}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":18}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":26}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":22}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":42}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":4}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":3}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":32}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":24}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":59}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":18}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":26}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":22}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":17}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":41}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":4}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":3}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":33}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":25}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":79}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":18}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":25}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":22}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":42}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":4}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":3}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":38}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":30}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":79}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":18}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":25}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":22}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":17}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":47}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":4}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":3}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":35}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":27}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":57}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":18}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":25}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":22}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":17}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":46}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":4}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":3}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":39}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":65}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":18}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":26}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":23}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":17}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":45}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":4}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":3}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":32}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":17}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":67}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":26}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":23}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":17}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":46}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":4}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":3}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":35}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":27}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":55}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":18}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":25}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":23}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":17}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":46}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":4}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":2}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":3}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":55}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":3}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":71}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":10}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":21}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":20}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":21}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":26}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":25}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":2}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":3}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":42}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":3}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":71}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":53}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":29}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":28}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":28}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":33}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":30}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":35}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":28}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":30}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":26}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":4}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":42}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":248,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":248,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":248,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":248,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/classification/entities/energy-quality.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/classification/entities/energy-quality.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":17}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":58}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":29}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":27}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":25}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":10}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":10}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":10}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":10}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":27}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":11}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":24}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":17}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":24}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":26}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":15}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":43}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":22}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":11}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":22}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":20}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":34}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":21}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":70}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":24}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":4}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":38}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":27}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":68}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":26}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":78}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":78}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":11}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":23}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":17}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":13}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":4}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":50}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":22}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":60}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":31}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":47}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":20}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":38}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":20}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":51}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":44}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":36}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":43}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":18}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":43}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":1}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":3}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":26}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":40}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":3}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":34}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":28}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":77}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":24}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":25}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":23}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":21}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":38}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":17}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":53}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":19}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":24}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":34}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":37}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":6}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":4}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":3}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":35}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":29}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":71}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":24}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":25}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":22}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":18}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":21}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":38}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":17}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":19}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":24}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":34}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":39}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":6}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":3}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":32}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":26}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":72}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":24}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":26}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":22}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":22}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":18}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":22}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":31}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":17}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":38}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":24}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":35}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":38}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":6}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":4}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":2}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":3}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":43}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":3}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":35}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":24}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":55}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":66}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":2}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":46}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":39}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":20}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":31}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":14}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":52}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":33}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":53}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":2}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":3}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":65}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":3}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":41}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":21}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":17}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":24}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":15}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":45}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":29}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":0}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":10}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":42}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":63}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":4}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":217,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":217,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":217,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":217,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/decorators/api-version.decorator.ts": {"path":"/workspaces/CurrentDao-backend/src/common/decorators/api-version.decorator.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":74}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":45}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":42}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":31}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":45}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":36}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":41}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":44}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":23}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":30}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":11}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":23}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":34}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":34}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":2}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":9}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":34}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":59}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":40}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":52}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":44}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":51}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":48}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":2}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":30}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":2}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":23}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":63}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":74}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":39}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":33}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":21}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":23}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":67}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":27}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":2}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":31}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":66}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":55}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":51}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":63}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":2}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":34}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":55}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":18}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":51}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":61}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":39}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":2}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":26}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":75}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":51}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":61}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":38}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":100,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":100,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":100,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":100,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/decorators/scope.decorator.ts": {"path":"/workspaces/CurrentDao-backend/src/common/decorators/scope.decorator.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":18}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":69}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":77}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":56}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":47}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":33}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":35}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":16}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":33}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":33}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":11}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":40}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":28}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":2}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":40}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":39}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":6}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":55}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":39}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":2}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":38}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":37}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":66}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":10}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":26}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":36}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":8}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":53}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":25}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":32}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":2}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":33}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":2}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":11}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":19}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":33}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":70}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":10}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":16}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":26}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":36}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":8}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":53}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":49}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":32}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":2}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":28}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":2}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":15}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":35}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":66}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":10}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":26}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":36}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":8}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":55}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":51}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":32}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":2}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":28}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":2}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":11}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":29}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":35}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":37}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":15}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":25}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":37}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":22}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":1}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":75}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":10}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":16}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":25}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":35}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":8}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":58}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":23}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":71}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":22}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":2}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":29}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":2}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":11}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":40}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":24}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":41}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":39}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":18}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":36}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":23}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":16}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":1}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":32}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":23}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":10}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":16}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":25}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":35}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":8}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":78}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":22}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":4}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":2}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":60}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":2}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":11}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":10}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":38}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":3}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":46}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":57}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":51}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":4}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":2}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":3}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":52}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":2}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":11}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":37}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":22}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":28}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":4}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":3}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":33}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":30}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":28}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":39}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":17}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":1}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":71}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":10}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":16}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":25}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":35}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":8}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":25}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":55}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":5}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":58}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":22}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":4}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":2}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":3}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":39}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":2}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":11}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":34}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":2}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":16}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":31}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":3}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":53}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":27}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":79}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":13}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":6}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":18}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":4}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":2}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":3}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":48}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":2}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":11}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":26}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":38}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":3}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":57}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":27}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":40}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":18}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":4}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":2}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":3}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":24}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":3}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":61}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":48}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":2}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":3}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":32}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":54}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":33}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":43}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":2}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":3}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":37}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":3}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":58}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":33}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":33}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":2}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":32}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":54}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":33}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":35}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":2}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":31}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":3}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":76}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":62}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":2}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":27}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":3}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":28}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":14}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":23}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":26}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":57}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":2}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":0}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":3}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":23}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":3}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":51}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":51}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":2}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":24}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":3}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":62}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":46}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":2}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":3}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":40}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":3}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":35}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":25}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":13}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":19}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":19}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":34}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":18}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":1}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":3}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":39}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":3}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":38}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":30}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":26}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":37}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":15}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":48}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":6}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":323,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":323,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":323,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":323,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/filters/http-exception.filter.ts": {"path":"/workspaces/CurrentDao-backend/src/common/filters/http-exception.filter.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":18}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":16}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":20}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":24}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":44}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":8}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":19}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":10}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":22}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":42}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":41}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":44}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":28}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":54}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":30}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":30}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":42}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":24}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":51}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":27}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":2}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":39}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":57}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":56}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":58}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":52}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":52}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":50}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":70}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":63}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":2}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":25}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":65}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":39}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":61}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":61}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":61}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":47}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":56}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":43}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":52}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":50}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":60}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":57}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":54}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":2}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":61}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":65}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":53}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":51}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":51}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":36}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":56}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":36}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":49}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":46}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":76}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":78}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":22}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":69}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":27}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":68}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":13}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":12}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":11}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":14}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":16}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":17}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":14}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":6}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":20}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":46}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":27}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":52}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":50}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":20}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":48}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":3}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":49}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":47}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":19}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":18}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":26}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":52}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":5}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":29}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":45}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":48}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":54}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":8}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":33}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":58}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":7}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":72}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":5}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":28}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":12}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":47}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":66}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":43}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":44}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":11}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":13}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":22}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":42}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":37}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":36}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":14}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":11}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":20}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":6}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":3}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":25}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":5}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":57}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":19}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":18}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":26}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":52}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":5}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":41}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":45}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":24}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":71}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":38}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":39}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":14}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":15}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":24}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":13}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":8}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":5}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":39}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":58}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":33}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":47}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":16}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":17}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":44}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":15}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":80}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":10}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":31}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":14}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":15}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":14}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":32}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":30}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":37}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":13}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":37}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":8}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":12}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":13}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":40}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":11}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":6}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":3}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":49}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":5}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":61}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":19}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":18}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":26}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":51}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":5}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":26}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":43}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":24}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":30}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":67}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":10}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":12}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":46}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":68}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":45}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":14}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":6}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":5}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":38}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":5}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":29}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":18}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":26}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":63}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":22}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":23}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":21}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":23}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":27}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":42}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":26}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":24}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":29}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":6}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":40}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":12}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":11}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":11}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":6}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":40}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":33}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":5}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":33}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":40}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":26}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":44}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":26}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":31}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":8}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":20}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":5}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":51}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":5}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":58}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":12}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":43}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":37}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":25}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":6}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":3}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":5}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":31}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":5}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":39}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":78}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":3}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":5}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":37}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":5}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":80}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":67}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":53}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":24}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":16}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":65}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":8}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":50}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":32}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":12}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":31}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":5}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":3}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":1}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":3}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":56}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":3}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":32}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":18}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":50}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":6}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":33}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":12}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":38}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":12}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":2}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":0}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":74}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":31}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":12}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":36}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":5}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":2}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":79}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":35}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":12}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":39}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":2}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":66}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":32}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":12}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":36}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":2}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":73}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":31}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":12}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":35}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":5}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":370,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":370,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":370,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":370,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/interceptors/response.interceptor.ts": {"path":"/workspaces/CurrentDao-backend/src/common/interceptors/response.interceptor.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":23}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":50}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":13}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":14}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":34}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":42}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":34}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":8}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":10}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":17}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":42}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":8}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":20}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":34}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":45}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":44}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":28}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":48}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":32}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":38}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":24}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":51}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":25}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":2}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":49}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":47}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":53}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":61}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":72}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":69}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":78}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":22}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":2}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":13}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":61}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":53}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":32}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":51}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":51}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":5}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":44}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":76}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":65}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":58}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":32}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":50}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":21}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":78}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":50}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":51}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":27}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":61}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":30}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":58}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":46}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":59}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":69}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":9}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":9}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":48}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":59}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":26}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":46}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":23}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":22}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":9}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":71}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":9}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":6}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":5}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":35}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":20}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":22}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":21}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":27}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":42}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":14}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":70}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":6}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":12}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":11}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":11}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":6}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":3}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":5}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":30}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":37}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":11}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":16}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":34}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":6}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":21}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":22}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":30}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":43}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":14}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":47}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":30}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":20}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":21}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":21}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":6}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":45}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":37}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":14}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":22}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":23}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":23}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":6}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":27}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":42}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":14}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":70}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":6}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":12}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":22}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":11}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":17}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":6}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":3}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":5}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":42}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":5}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":51}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":44}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":19}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":45}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":54}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":18}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":5}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":26}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":73}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":3}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":25}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":29}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":23}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":23}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":22}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":11}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":29}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":52}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":28}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":39}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":52}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":5}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":0}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":23}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":59}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":3}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":5}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":48}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":5}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":60}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":41}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":42}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":41}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":71}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":25}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":14}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":79}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":8}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":5}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":44}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":77}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":28}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":14}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":36}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":33}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":8}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":5}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":57}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":3}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":0}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":5}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":31}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":5}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":39}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":78}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":3}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":5}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":30}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":5}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":48}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":38}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":52}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":93}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":56}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":1}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":52}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":3}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":43}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":12}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":15}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":16}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":16}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":49}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":10}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":9}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":54}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":4}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":2}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":3}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":50}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":3}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":57}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":14}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":292,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":292,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":292,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":292,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/interfaces/response.interface.ts": {"path":"/workspaces/CurrentDao-backend/src/common/interfaces/response.interface.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":42}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":65}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":73}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":3}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":39}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":26}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":20}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":40}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":25}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":29}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":34}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":30}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":29}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":33}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":29}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":22}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":15}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":32}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":33}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":15}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":33}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":16}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":30}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":30}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":21}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":37}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":41}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":38}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":43}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":22}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":10}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":26}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":16}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":56}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":26}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":52}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":28}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":12}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":28}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":16}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":25}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":29}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":26}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":31}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":36}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":22}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":18}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":16}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":1}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":36}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":40}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":35}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":22}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":16}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":39}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":15}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":35}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":27}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":27}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":36}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":17}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":1}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":3}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":3}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":41}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":20}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":21}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":37}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":29}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":1}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":30}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":3}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":34}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":16}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":23}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":17}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":19}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":16}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":19}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":25}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":1}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":36}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":3}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":32}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":40}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":21}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":46}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":34}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":55}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":1}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":3}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":29}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":3}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":38}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":10}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":1}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":3}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":33}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":37}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":20}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":18}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":27}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":30}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":1}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":3}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":22}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":41}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":3}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":29}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":3}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":29}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":22}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":22}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":22}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":30}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":32}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":26}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":26}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":24}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":36}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":40}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":32}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":1}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":3}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":28}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":3}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":70}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":33}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":33}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":33}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":33}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":37}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":38}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":35}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":35}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":34}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":40}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":42}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":38}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":209,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":209,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":209,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":209,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/pipes/transform.pipe.ts": {"path":"/workspaces/CurrentDao-backend/src/common/pipes/transform.pipe.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":17}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":61}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":44}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":16}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":7}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":9}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":65}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":3}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":37}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":41}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":17}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":11}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":10}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":16}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":17}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":11}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":14}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":15}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":14}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":2}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":39}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":46}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":21}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":53}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":22}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":34}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":55}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":42}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":32}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":23}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":24}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":45}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":36}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":29}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":16}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":2}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":46}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":13}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":53}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":59}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":47}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":45}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":51}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":58}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":47}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":64}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":19}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":46}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":5}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":43}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":38}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":5}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":47}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":30}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":64}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":5}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":52}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":31}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":56}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":41}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":34}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":48}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":50}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":11}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":55}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":34}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":38}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":24}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":11}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":58}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":16}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":32}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":9}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":7}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":3}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":32}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":50}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":40}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":64}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":38}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":52}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":8}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":5}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":25}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":72}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":73}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":3}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":5}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":25}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":5}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":45}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":49}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":51}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":14}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":18}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":56}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":31}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":8}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":30}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":3}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":1}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":54}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":3}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":49}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":40}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":27}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":72}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":36}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":27}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":25}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":22}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":6}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":4}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":2}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":3}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":49}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":3}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":42}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":28}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":39}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":6}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":36}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":29}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":24}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":20}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":5}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":25}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":44}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":18}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":72}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":4}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":2}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":3}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":46}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":3}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":66}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":10}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":13}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":23}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":23}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":34}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":4}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":9}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":34}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":30}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":30}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":63}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":20}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":73}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":2}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":3}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":51}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":3}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":63}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":12}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":13}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":23}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":23}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":34}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":4}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":11}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":63}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":2}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":73}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":3}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":69}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":10}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":28}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":9}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":35}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":56}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":31}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":5}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":2}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":3}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":34}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":3}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":67}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":10}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":26}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":9}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":35}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":54}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":30}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":5}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":261,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":261,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":261,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":261,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/providers/config.provider.ts": {"path":"/workspaces/CurrentDao-backend/src/common/providers/config.provider.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":18}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":64}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":51}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":11}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":15}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":9}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":47}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":11}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":12}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":9}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":15}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":60}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":25}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":30}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":22}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":28}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":28}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":22}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":61}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":50}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":13}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":56}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":13}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":61}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":44}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":13}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":50}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":34}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":14}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":45}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":33}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":41}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":28}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":13}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":56}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":30}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":25}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":13}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":13}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":49}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":32}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":13}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":56}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":25}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":44}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":31}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":13}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":40}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":27}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":13}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":50}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":37}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":13}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":54}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":28}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":45}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":33}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":14}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":45}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":1}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":30}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":13}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":32}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":13}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":40}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":31}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":13}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":40}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":70}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":13}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":40}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":28}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":13}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":71}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":59}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":13}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":40}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":37}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":13}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":73}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":70}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":1}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":33}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":3}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":40}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":31}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":21}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":34}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":25}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":1}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":24}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":49}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":48}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":3}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":13}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":53}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":60}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":50}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":14}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":50}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":48}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":20}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":21}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":25}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":17}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":6}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":3}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":5}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":42}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":39}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":32}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":41}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":5}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":3}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":31}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":5}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":48}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":41}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":25}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":48}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":16}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":25}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":12}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":36}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":30}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":47}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":25}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":17}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":6}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":35}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":33}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":48}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":24}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":25}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":6}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":36}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":28}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":33}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":13}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":16}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":78}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":9}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":20}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":76}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":0}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":38}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":76}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":7}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":12}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":62}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":3}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":35}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":5}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":28}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":29}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":33}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":19}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":24}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":46}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":21}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":7}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":41}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":22}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":33}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":7}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":28}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":23}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":73}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":8}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":5}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":18}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":3}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":5}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":34}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":5}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":44}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":49}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":33}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":3}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":5}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":20}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":5}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":28}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":63}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":5}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":27}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":5}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":27}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":60}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":5}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":28}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":5}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":28}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":61}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":3}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":5}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":21}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":5}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":21}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":54}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":3}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":5}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":29}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":5}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":33}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":23}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":3}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":1}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":3}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":45}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":3}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":53}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":10}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":29}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":49}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":40}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":28}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":4}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":2}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":3}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":25}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":3}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":43}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":10}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":29}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":49}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":40}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":28}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":4}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":2}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":3}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":30}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":3}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":39}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":0}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":35}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":37}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":39}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":3}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":39}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":3}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":29}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":3}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":46}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":10}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":24}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":38}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":4}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":2}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":3}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":34}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":3}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":51}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":10}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":23}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":43}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":4}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":2}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":3}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":38}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":3}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":46}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":10}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":24}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":46}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":4}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":2}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":0}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":40}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":3}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":26}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":31}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":14}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":21}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":11}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":48}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":378,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":378,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":378,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":378,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/providers/database.provider.ts": {"path":"/workspaces/CurrentDao-backend/src/common/providers/database.provider.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":20}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":68}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":50}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":11}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":15}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":9}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":51}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":52}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":28}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":42}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":29}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":29}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":33}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":29}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":18}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":50}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":53}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":15}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":2}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":31}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":42}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":22}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":22}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":35}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":29}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":33}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":27}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":26}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":53}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":55}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":72}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":62}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":52}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":64}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":38}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":54}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":30}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":5}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":39}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":57}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":24}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":49}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":23}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":63}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":52}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":66}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":30}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":42}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":55}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":36}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":51}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":3}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":24}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":31}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":27}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":3}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":27}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":31}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":35}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":3}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":5}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":35}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":41}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":9}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":46}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":18}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":13}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":19}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":3}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":31}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":46}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":49}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":12}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":29}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":51}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":59}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":42}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":6}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":3}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":5}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":26}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":5}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":30}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":53}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":17}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":49}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":5}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":18}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":5}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":65}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":46}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":3}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":1}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":3}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":47}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":3}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":39}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":25}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":36}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":16}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":10}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":31}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":64}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":31}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":4}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":2}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":3}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":3}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":45}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":10}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":31}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":77}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":31}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":4}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":2}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":3}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":35}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":3}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":55}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":41}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":51}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":10}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":35}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":24}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":20}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":47}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":56}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":50}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":46}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":56}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":57}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":54}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":29}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":19}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":4}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":208,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":208,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":208,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":208,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/providers/logger.provider.ts": {"path":"/workspaces/CurrentDao-backend/src/common/providers/logger.provider.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":18}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":63}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":50}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":11}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":77}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":26}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":40}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":37}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":29}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":35}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":17}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":31}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":22}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":23}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":48}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":17}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":30}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":2}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":29}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":27}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":16}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":1}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":24}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":49}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":48}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":37}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":54}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":34}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":50}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":14}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":73}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":33}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":54}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":36}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":28}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":32}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":42}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":31}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":39}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":7}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":3}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":23}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":5}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":46}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":40}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":7}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":67}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":37}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":59}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":74}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":74}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":62}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":11}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":9}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":6}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":3}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":5}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":34}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":30}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":31}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":9}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":6}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":36}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":33}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":25}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":29}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":63}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":33}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":34}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":11}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":8}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":5}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":16}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":48}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":68}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":3}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":5}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":14}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":5}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":66}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":32}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":39}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":12}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":7}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":3}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":5}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":16}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":5}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":49}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":68}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":22}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":50}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":69}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":5}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":24}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":5}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":52}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":71}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":3}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":5}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":18}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":38}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":30}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":3}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":5}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":37}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":48}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":53}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":3}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":5}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":29}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":5}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":14}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":47}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":20}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":31}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":21}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":11}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":37}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":39}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":7}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":3}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":5}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":27}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":79}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":70}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":39}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":15}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":7}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":1}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":3}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":45}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":3}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":37}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":34}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":16}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":10}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":29}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":59}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":4}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":2}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":3}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":25}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":59}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":10}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":29}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":52}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":43}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":4}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":2}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":3}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":31}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":3}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":39}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":3}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":33}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":3}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":38}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":28}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":5}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":59}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":29}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":54}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":55}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":63}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":6}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":17}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":4}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":2}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":3}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":29}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":40}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":25}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":20}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":19}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":6}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":31}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":10}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":21}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":46}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":58}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":6}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":30}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":46}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":19}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":69}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":20}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":16}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":8}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":6}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":4}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":283,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":283,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":283,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":283,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/common/utils/pagination.util.ts": {"path":"/workspaces/CurrentDao-backend/src/common/utils/pagination.util.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":21}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":49}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":18}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":42}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":30}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":29}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":31}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":36}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":32}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":39}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":31}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":34}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":16}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":22}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":46}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":10}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":9}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":10}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":10}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":31}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":2}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":28}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":2}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":45}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":36}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":32}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":39}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":15}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":23}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":46}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":23}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":43}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":44}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":49}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":10}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":41}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":47}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":56}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":58}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":25}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":2}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":36}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":2}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":45}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":44}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":37}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":34}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":15}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":16}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":6}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":77}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":25}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":14}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":68}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":25}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":2}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":3}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":55}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":2}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":36}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":32}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":3}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":70}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":28}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":2}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":26}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":2}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":44}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":36}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":32}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":42}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":33}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":13}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":15}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":4}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":12}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":29}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":6}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":29}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":40}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":38}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":49}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":59}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":30}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":2}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":3}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":30}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":2}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":32}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":24}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":3}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":41}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":15}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":16}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":39}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":2}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":57}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":2}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":57}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":32}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":24}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":32}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":29}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":16}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":14}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":16}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":13}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":7}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":33}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":39}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":30}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":11}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":13}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":2}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":3}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":32}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":2}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":33}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":32}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":33}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":74}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":67}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":22}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":2}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":3}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":2}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":40}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":38}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":42}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":24}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":3}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":29}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":13}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":21}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":32}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":11}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":36}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":30}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":30}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":44}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":54}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":2}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":37}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":2}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":42}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":31}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":38}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":26}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":3}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":31}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":13}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":17}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":22}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":11}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":28}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":43}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":31}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":28}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":32}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":38}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":57}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":7}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":19}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":7}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":4}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":236,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":236,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":236,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":236,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/config/database.config.ts": {"path":"/workspaces/CurrentDao-backend/src/config/database.config.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":55}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":76}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":77}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":66}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":75}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":77}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":26}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":32}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":45}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":54}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":48}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":44}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":54}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":15}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":19}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":6}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":55}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":52}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":5}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/config/stellar.config.ts": {"path":"/workspaces/CurrentDao-backend/src/config/stellar.config.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":39}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":28}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":1}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":44}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":29}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":18}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":44}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":69}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":41}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":65}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":15}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":48}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":44}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":18}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":44}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":44}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":50}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":38}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":41}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":22}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":64}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":79}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":18}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":79}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":10}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":19}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":59}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":59}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":33}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":60}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":9}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":37}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":62}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":9}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":78}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":34}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":59}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":9}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":15}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":14}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":14}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":6}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":16}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":14}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":68}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":68}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":8}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":15}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":64}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":64}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":8}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":68}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":68}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":8}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":3}},"locations":[{"start":{"line":1,"column":0},"end":{"line":81,"column":3}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":81,"column":3}},"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":3}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/contract.service.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/contract.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":22}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":9}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":15}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":30}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":51}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":37}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":43}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":49}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":83}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":90}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":53}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":24}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":27}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":21}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":33}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":8}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":36}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":8}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":21}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":22}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":27}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":36}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":59}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":61}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":69}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":62}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":64}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":30}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":20}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":37}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":71}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":61}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":73}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":70}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":69}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":58}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":37}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":68}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":30}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":62}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":63}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":60}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":57}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":50}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":52}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":60}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":54}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":6}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":39}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":61}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":61}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":13}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":68}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":25}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":28}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":88}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":12}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":9}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":7}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":5}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":27}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":58}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":30}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":32}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":33}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":79}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":43}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":33}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":60}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":47}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":10}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":62}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":54}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":40}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":101}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":12}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":9}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":63}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":50}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":71}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":10}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":22}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":8}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":6}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":3}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":71}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":56}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":43}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":6}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":43}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":38}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":41}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":33}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":17}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":29}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":23}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":8}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":25}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":47}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":47}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":49}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":23}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":35}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":40}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":56}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":3}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":24}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":32}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":40}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":57}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":23}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":38}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":33}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":57}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":56}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":27}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":14}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":6}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":53}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":39}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":14}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":12}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":49}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":8}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":5}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":46}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":11}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":66}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":31}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":18}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":15}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":27}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":73}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":66}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":36}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":31}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":18}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":56}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":10}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":34}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":17}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":9}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":41}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":73}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":22}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":10}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":59}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":39}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":36}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":18}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":10}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":37}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":52}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":55}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":12}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":40}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":9}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":25}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":90}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":10}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":7}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":43}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":23}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":43}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":12}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":10}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":47}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":6}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":3}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":26}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":31}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":30}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":20}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":57}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":53}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":50}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":19}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":30}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":38}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":5}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":3}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":53}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":44}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":3}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":57}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":46}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":62}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":16}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":63}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":10}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":6}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":80}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":12}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":62}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":49}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":48}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":47}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":69}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":49}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":62}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":44}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":72}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":74}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":9}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":6}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":40}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":31}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":29}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":25}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":40}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":50}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":52}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":67}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":29}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":5}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":50}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":58}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":14}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":21}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":16}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":23}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":8}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":14}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":26}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":8}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":7}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":80}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":66}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":22}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":44}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":68}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":8}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":5}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":48}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":17}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":19}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":14}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":31}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":27}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":27}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":45}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":8}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":17}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":36}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":19}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":21}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":16}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":8}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":54}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":44}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":20}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":43}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":6}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":38}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":15}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":61}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":7}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":3}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":67}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":27}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":30}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":34}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":31}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":35}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":35}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":39}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":14}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":38}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":55}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":10}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":5}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":3}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":70}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":18}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":21}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":5}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":51}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":31}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":32}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":3}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":0}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":24}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":39}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":31}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":19}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":13}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":49}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":49}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":6}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":26}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":36}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":65}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":8}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":38}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":3}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":0}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":36}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":23}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":29}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":19}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":20}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":41}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":7}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":19}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":16}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":8}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":7}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":44}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":32}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":8}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":6}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":0}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":50}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":51}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":55}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":3}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":387,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":387,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":387,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":387,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/contracts.module.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/contracts.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":43}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":48}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":53}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":60}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":53}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":64}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":61}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":69}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":62}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":15}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":43}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":47}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":4}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":14}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":20}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":68}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":2}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":31}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":30,"column":31}},"locations":[{"start":{"line":1,"column":0},"end":{"line":30,"column":31}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":30,"column":31}},"loc":{"start":{"line":1,"column":0},"end":{"line":30,"column":31}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/soroban-client.service.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/soroban-client.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":22}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":9}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":30}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":44}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":49}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":11}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":10}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":6}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":53}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":90}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":75}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":8}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":16}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":24}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":36}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":16}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":15}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":21}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":35}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":66}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":64}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":14}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":46}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":30}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":62}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":60}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":35}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":34}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":43}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":33}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":19}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":37}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":43}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":48}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":66}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":59}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":26}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":43}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":47}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":37}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":35}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":28}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":26}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":47}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":63}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":16}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":28}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":9}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":31}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":65}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":31}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":40}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":78}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":12}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":9}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":38}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":55}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":19}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":60}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":64}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":28}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":26}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":10}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":65}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":44}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":72}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":22}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":16}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":24}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":41}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":45}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":35}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":33}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":27}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":24}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":45}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":38}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":55}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":14}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":26}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":39}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":42}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":10}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":8}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":6}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":77}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":57}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":17}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":25}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":25}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":7}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":57}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":36}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":27}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":29}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":29}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":78}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":34}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":7}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":57}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":26}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":23}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":31}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":29}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":25}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":37}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":66}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":16}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":9}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":27}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":36}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":10}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":8}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":19}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":8}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":7}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":61}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":71}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":99}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":17}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":19}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":14}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":64}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":53}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":71}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":21}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":8}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":50}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":61}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":17}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":8}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":3}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":34}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":27}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":29}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":35}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":56}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":34}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":7}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":3}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":78}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":9}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":61}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":23}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":75}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":8}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":44}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":57}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":8}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":5}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":3}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":34}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":35}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":69}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":72}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":34}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":32}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":32}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":8}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":6}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":54}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":51}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":57}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":17}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":63}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":27}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":6}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":22}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":25}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":66}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":10}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":7}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":26}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":15}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":47}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":22}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":39}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":52}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":44}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":50}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":8}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":39}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":3}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":55}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":40}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":73}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":26}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":16}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":48}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":57}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":11}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":8}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":5}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":40}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":54}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":41}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":3}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":33}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":29}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":29}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":13}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":26}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":29}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":5}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":26}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":61}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":5}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":38}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":73}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":5}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":38}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":41}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":5}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":34}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":83}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":6}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":35}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":30}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":33}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":5}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":36}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":45}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":5}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":39}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":3}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":79}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":9}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":38}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":55}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":7}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":41}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":41}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":7}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":21}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":24}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":66}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":8}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":5}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":0}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":65}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":3}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":39}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":36}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":20}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":80}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":26}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":63}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":12}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":74}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":62}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":47}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":74}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":36}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":57}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":6}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":3}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":27}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":29}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":22}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":32}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":35}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":66}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":58}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":15}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":7}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":23}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":38}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":15}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":15}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":8}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":7}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":42}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":8}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":6}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":31}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":44}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":78}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":8}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":5}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":50}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":3}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":32}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":29}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":28}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":47}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":66}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":35}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":76}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":30}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":9}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":10}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":29}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":45}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":40}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":9}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":27}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":7}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":0}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":64}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":5}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":0}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":21}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":3}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":378,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":378,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":378,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":378,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/contracts/contract.types.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/contracts/contract.types.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":18}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":24}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":34}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":76}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":32}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":27}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":38}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":29}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":27}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":19}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":20}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":28}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":37}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":19}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":21}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":17}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":21}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":27}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":43}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":19}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":27}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":18}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":17}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":27}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":33}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":1}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":41}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":22}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":22}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":25}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":43}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":21}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":29}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":27}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":19}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":33}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":31}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":36}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":40}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":29}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":27}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":17}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":24}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":25}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":27}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":28}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":1}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":36}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":34}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":48}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":39}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":33}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":35}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":17}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":35}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":39}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":18}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":32}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":39}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":113,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":113,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":113,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":113,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/contracts/escrow.contract.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/contracts/escrow.contract.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":18}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":65}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":59}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":18}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":56}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":46}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":56}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":29}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":35}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":38}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":6}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":37}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":30}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":36}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":39}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":35}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":5}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":26}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":32}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":23}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":6}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":26}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":23}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":6}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":70}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":49}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":24}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":43}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":73}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":15}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":39}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":29}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":34}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":37}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":57}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":6}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":46}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":38}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":38}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":32}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":52}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":25}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":76}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":41}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":47}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":47}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":49}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":90,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/contracts/governance.contract.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/contracts/governance.contract.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":18}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":65}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":59}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":18}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":60}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":50}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":56}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":31}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":37}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":40}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":6}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":26}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":33}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":28}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":34}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":21}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":23}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":34}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":41}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":21}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":5}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":32}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":38}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":22}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":41}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":6}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":26}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":24}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":6}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":70}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":49}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":24}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":43}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":73}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":15}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":39}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":29}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":34}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":37}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":57}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":6}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":46}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":38}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":38}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":32}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":52}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":25}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":76}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":41}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":47}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":47}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":49}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":90,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/contracts/token.contract.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/contracts/token.contract.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":18}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":65}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":59}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":18}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":55}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":45}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":56}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":29}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":6}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":5}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":26}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":31}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":21}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":24}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":30}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":21}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":24}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":28}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":21}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":24}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":6}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":25}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":30}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":6}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":5}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":32}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":70}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":49}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":3}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":43}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":73}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":39}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":29}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":34}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":37}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":57}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":6}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":46}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":38}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":38}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":32}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":52}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":25}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":18}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":76}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":41}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":47}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":47}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":49}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":7}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":91,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":91,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":91,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":91,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/deployer/deployer.service.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/deployer/deployer.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":73}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":24}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":34}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":8}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":37}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":65}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":13}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":58}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":61}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":37}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":68}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":57}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":6}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":23}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":35}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":40}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":63}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":65}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":36}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":79}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":8}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":46}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":61}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":18}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":9}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":18}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":53}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":59}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":41}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":18}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":9}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":27}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":31}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":37}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":22}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":36}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":75}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":8}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":64}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":66}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":14}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":16}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":8}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":7}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":38}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":54}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":57}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":51}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":41}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":17}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":27}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":14}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":23}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":33}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":27}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":38}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":8}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":71}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":53}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":41}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":26}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":30}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":72}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":36}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":7}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":47}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":20}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":99}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":6}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":12}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":17}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":41}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":14}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":14}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":47}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":10}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":32}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":6}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":24}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":32}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":40}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":60}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":14}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":47}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":60}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":8}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":7}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":20}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":36}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":73}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":8}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":5}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":54}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":41}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":26}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":7}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":45}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":36}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":37}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":40}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":46}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":8}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":6}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":41}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":7}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":38}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":32}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":8}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":7}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":48}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":8}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":6}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":18}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":161,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":161,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":161,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":161,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/dto/contract-call.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/dto/contract-call.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":10}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":12}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":11}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":6}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":76}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":36}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":20}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":30}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":29}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":17}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":12}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":33}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":15}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":15}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":28}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":14}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":15}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":25}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":13}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":15}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":27}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":27}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":25}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":13}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":15}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":26}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":21}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":13}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":9}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":28}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":1}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":39}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":23}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":29}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":28}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":13}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":9}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":15}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":36}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":23}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":29}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":15}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":13}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":17}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":13}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":19}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":13}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":15}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":22}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":15}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":34}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":13}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":15}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":28}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":13}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":15}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":27}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":13}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":28}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":13}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":33}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":13}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":15}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":43}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":1}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":63}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":13}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":29}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":14}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":15}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":21}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":133,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":133,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":133,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":133,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/contracts/entities/contract.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/contracts/entities/contract.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":19}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":25}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":19}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":26}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":18}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":20}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":28}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":1}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":29}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":28}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":26}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":47}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":33}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":29}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":33}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":47}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":29}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":50}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":11}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":29}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":29}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":28}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":28}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":29}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":29}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":30}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":22}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":17}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":25}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":35}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":28}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":20}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":43}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":28}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":43}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":33}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":43}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":43}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":45}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":31}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":48}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":21}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":43}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":43}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":18}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":99,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":99,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":99,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":99,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/cross-border/cross-border.module.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/cross-border.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":46}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":68}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":91}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":80}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":59}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":84}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":77}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":9}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":78}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":39}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":28}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":4}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":12}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":4}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":2}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":33}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":30,"column":33}},"locations":[{"start":{"line":1,"column":0},"end":{"line":30,"column":33}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":30,"column":33}},"loc":{"start":{"line":1,"column":0},"end":{"line":30,"column":33}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/cross-border/compliance/regulation-service.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/compliance/regulation-service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":33}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":15}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":32}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":30}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":29}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":24}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":78}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":34}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":38}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":26}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":35}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":66}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":28}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":21}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":24}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":63}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":72}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":53}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":33}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":43}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":7}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":46}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":46}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":73}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":30}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":15}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":15}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":15}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":15}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":10}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":28}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":34}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":31}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":32}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":27}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":33}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":29}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":36}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":10}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":59}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":27}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":8}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":7}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":36}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":51}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":20}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":82}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":36}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":25}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":41}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":35}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":10}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":27}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":32}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":35}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":32}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":10}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":59}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":27}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":8}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":7}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":44}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":53}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":76}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":35}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":28}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":26}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":30}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":10}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":27}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":28}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":35}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":35}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":10}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":27}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":29}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":8}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":7}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":40}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":47}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":74}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":35}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":28}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":30}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":31}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":29}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":74}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":29}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":8}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":7}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":42}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":62}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":73}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":30}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":15}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":15}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":15}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":15}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":15}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":15}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":15}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":15}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":15}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":15}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":10}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":33}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":32}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":34}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":10}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":27}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":32}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":28}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":30}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":10}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":37}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":27}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":8}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":7}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":35}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":45}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":70}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":35}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":28}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":36}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":29}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":32}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":10}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":27}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":25}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":30}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":10}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":27}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":31}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":8}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":7}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":37}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":46}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":71}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":35}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":28}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":34}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":31}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":33}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":10}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":27}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":30}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":29}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":37}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":10}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":44}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":28}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":8}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":7}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":45}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":45}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":79}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":48}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":28}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":34}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":30}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":30}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":10}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":27}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":33}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":28}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":30}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":10}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":73}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":28}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":8}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":7}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":41}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":52}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":76}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":60}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":28}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":29}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":27}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":33}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":10}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":27}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":34}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":28}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":29}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":10}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":27}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":29}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":8}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":7}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":40}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":57}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":69}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":35}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":28}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":32}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":33}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":33}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":10}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":27}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":32}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":33}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":29}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":10}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":27}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":27}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":8}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":6}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":41}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":56}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":7}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":20}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":75}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":6}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":3}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":0}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":24}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":26}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":26}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":23}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":19}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":28}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":32}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":108}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":6}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":64}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":20}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":20}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":17}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":6}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":41}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":43}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":34}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":53}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":67}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":22}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":22}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":19}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":15}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":24}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":9}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":25}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":62}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":0}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":39}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":74}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":7}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":5}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":0}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":62}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":79}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":12}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":20}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":13}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":57}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":15}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":21}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":6}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":3}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":35}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":26}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":26}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":23}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":23}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":44}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":57}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":33}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":55}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":65}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":63}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":36}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":47}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":52}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":58}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":36}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":7}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":22}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":3}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":39}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":31}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":25}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":31}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":39}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":24}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":14}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":34}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":26}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":82}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":63}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":8}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":64}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":14}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":34}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":23}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":101}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":8}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":5}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":64}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":14}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":34}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":23}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":100}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":79}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":5}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":38}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":53}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":67}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":28}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":22}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":65}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":35}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":25}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":88}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":5}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":12}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":32}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":13}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":14}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":61}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":6}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":3}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":33}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":30}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":55}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":72}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":75}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":0}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":22}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":29}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":29}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":30}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":12}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":25}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":5}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":3}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":72}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":27}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":57}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":37}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":21}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":63}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":22}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":67}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":23}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":68}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":25}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":68}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":22}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":69}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":16}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":68}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":7}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":7}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":76}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":3}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":54}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":27}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":24}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":19}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":61}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":20}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":65}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":21}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":66}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":14}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":66}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":5}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":3}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":0}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":65}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":38}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":3}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":0}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":41}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":49}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":3}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":62}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":56}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":21}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":55}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":57}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":6}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":3}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":18,"39":18,"40":1,"41":1,"42":18,"43":18,"44":18,"45":18,"46":18,"47":18,"48":18,"49":18,"50":18,"51":18,"52":18,"53":18,"54":18,"55":18,"56":18,"57":18,"58":18,"59":18,"60":18,"61":18,"62":18,"63":18,"64":18,"65":18,"66":18,"67":18,"68":18,"69":18,"70":18,"71":18,"72":18,"73":18,"74":18,"75":18,"76":18,"77":18,"78":18,"79":18,"80":18,"81":18,"82":18,"83":18,"84":18,"85":18,"86":18,"87":18,"88":18,"89":18,"90":18,"91":18,"92":18,"93":18,"94":18,"95":18,"96":18,"97":18,"98":18,"99":18,"100":18,"101":18,"102":18,"103":18,"104":18,"105":18,"106":18,"107":18,"108":18,"109":18,"110":18,"111":18,"112":18,"113":18,"114":18,"115":18,"116":18,"117":18,"118":18,"119":18,"120":18,"121":18,"122":18,"123":18,"124":18,"125":18,"126":18,"127":18,"128":18,"129":18,"130":18,"131":18,"132":18,"133":18,"134":18,"135":18,"136":18,"137":18,"138":18,"139":18,"140":18,"141":18,"142":18,"143":18,"144":18,"145":18,"146":18,"147":18,"148":18,"149":18,"150":18,"151":18,"152":18,"153":18,"154":18,"155":18,"156":18,"157":18,"158":18,"159":18,"160":18,"161":18,"162":18,"163":18,"164":18,"165":18,"166":18,"167":18,"168":18,"169":18,"170":18,"171":18,"172":18,"173":18,"174":18,"175":18,"176":18,"177":18,"178":18,"179":18,"180":18,"181":18,"182":18,"183":18,"184":18,"185":18,"186":18,"187":18,"188":18,"189":18,"190":18,"191":18,"192":18,"193":18,"194":18,"195":18,"196":18,"197":18,"198":18,"199":18,"200":18,"201":18,"202":18,"203":18,"204":18,"205":18,"206":18,"207":18,"208":18,"209":18,"210":18,"211":18,"212":18,"213":18,"214":18,"215":18,"216":18,"217":18,"218":18,"219":18,"220":18,"221":18,"222":18,"223":18,"224":18,"225":18,"226":18,"227":18,"228":18,"229":18,"230":18,"231":18,"232":18,"233":18,"234":18,"235":18,"236":18,"237":18,"238":18,"239":18,"240":18,"241":18,"242":18,"243":18,"244":18,"245":180,"246":18,"247":18,"248":18,"249":18,"250":18,"251":18,"252":1,"253":1,"254":14,"255":14,"256":14,"257":14,"258":14,"259":14,"260":14,"261":14,"262":14,"263":14,"264":14,"265":14,"266":14,"267":14,"268":14,"269":14,"270":14,"271":14,"272":14,"273":14,"274":78,"275":78,"276":78,"277":78,"278":78,"279":78,"280":78,"281":78,"282":78,"283":78,"284":78,"285":78,"286":13,"287":13,"288":78,"289":14,"290":14,"291":14,"292":14,"293":14,"294":14,"295":14,"296":14,"297":14,"298":14,"299":14,"300":14,"301":1,"302":1,"303":14,"304":14,"305":14,"306":14,"307":14,"308":14,"309":14,"310":140,"311":140,"312":140,"313":140,"314":140,"315":140,"316":140,"317":140,"318":140,"319":140,"320":78,"321":78,"322":140,"323":14,"324":14,"325":14,"326":1,"327":1,"328":78,"329":78,"330":78,"331":78,"332":78,"333":78,"334":6,"335":6,"336":6,"337":6,"338":6,"339":6,"340":6,"341":72,"342":78,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":72,"350":78,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":72,"359":72,"360":72,"361":72,"362":72,"363":78,"364":8,"365":8,"366":78,"367":7,"368":7,"369":7,"370":72,"371":72,"372":72,"373":72,"374":72,"375":72,"376":72,"377":72,"378":1,"379":1,"380":14,"381":14,"382":14,"383":14,"384":14,"385":14,"386":7,"387":7,"388":5,"389":7,"390":2,"391":2,"392":14,"393":1,"394":1,"395":14,"396":14,"397":78,"398":78,"399":30,"400":78,"401":3,"402":78,"403":29,"404":78,"405":14,"406":78,"407":2,"408":78,"409":0,"410":78,"411":14,"412":14,"413":14,"414":14,"415":1,"416":1,"417":78,"418":78,"419":78,"420":30,"421":78,"422":3,"423":78,"424":29,"425":78,"426":16,"427":78,"428":78,"429":1,"430":1,"431":2,"432":2,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":3,"440":3,"441":30,"442":3,"443":3,"444":3,"445":1},"branchMap":{"0":{"type":"branch","line":38,"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":3}}]},"1":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":10},"end":{"line":252,"column":3}},"locations":[{"start":{"line":42,"column":10},"end":{"line":252,"column":3}}]},"2":{"type":"branch","line":245,"loc":{"start":{"line":245,"column":24},"end":{"line":247,"column":5}},"locations":[{"start":{"line":245,"column":24},"end":{"line":247,"column":5}}]},"3":{"type":"branch","line":254,"loc":{"start":{"line":254,"column":2},"end":{"line":301,"column":3}},"locations":[{"start":{"line":254,"column":2},"end":{"line":301,"column":3}}]},"4":{"type":"branch","line":274,"loc":{"start":{"line":274,"column":52},"end":{"line":289,"column":5}},"locations":[{"start":{"line":274,"column":52},"end":{"line":289,"column":5}}]},"5":{"type":"branch","line":286,"loc":{"start":{"line":286,"column":38},"end":{"line":288,"column":7}},"locations":[{"start":{"line":286,"column":38},"end":{"line":288,"column":7}}]},"6":{"type":"branch","line":303,"loc":{"start":{"line":303,"column":10},"end":{"line":326,"column":3}},"locations":[{"start":{"line":303,"column":10},"end":{"line":326,"column":3}}]},"7":{"type":"branch","line":310,"loc":{"start":{"line":310,"column":56},"end":{"line":323,"column":5}},"locations":[{"start":{"line":310,"column":56},"end":{"line":323,"column":5}}]},"8":{"type":"branch","line":312,"loc":{"start":{"line":312,"column":52},"end":{"line":313,"column":62}},"locations":[{"start":{"line":312,"column":52},"end":{"line":313,"column":62}}]},"9":{"type":"branch","line":313,"loc":{"start":{"line":313,"column":62},"end":{"line":314,"column":62}},"locations":[{"start":{"line":313,"column":62},"end":{"line":314,"column":62}}]},"10":{"type":"branch","line":317,"loc":{"start":{"line":317,"column":44},"end":{"line":318,"column":51}},"locations":[{"start":{"line":317,"column":44},"end":{"line":318,"column":51}}]},"11":{"type":"branch","line":320,"loc":{"start":{"line":320,"column":29},"end":{"line":320,"column":55}},"locations":[{"start":{"line":320,"column":29},"end":{"line":320,"column":55}}]},"12":{"type":"branch","line":320,"loc":{"start":{"line":320,"column":57},"end":{"line":322,"column":7}},"locations":[{"start":{"line":320,"column":57},"end":{"line":322,"column":7}}]},"13":{"type":"branch","line":328,"loc":{"start":{"line":328,"column":10},"end":{"line":378,"column":3}},"locations":[{"start":{"line":328,"column":10},"end":{"line":378,"column":3}}]},"14":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":23},"end":{"line":341,"column":5}},"locations":[{"start":{"line":334,"column":23},"end":{"line":341,"column":5}}]},"15":{"type":"branch","line":342,"loc":{"start":{"line":342,"column":-1},"end":{"line":343,"column":32}},"locations":[{"start":{"line":342,"column":-1},"end":{"line":343,"column":32}}]},"16":{"type":"branch","line":343,"loc":{"start":{"line":343,"column":28},"end":{"line":343,"column":61}},"locations":[{"start":{"line":343,"column":28},"end":{"line":343,"column":61}}]},"17":{"type":"branch","line":343,"loc":{"start":{"line":343,"column":63},"end":{"line":349,"column":5}},"locations":[{"start":{"line":343,"column":63},"end":{"line":349,"column":5}}]},"18":{"type":"branch","line":350,"loc":{"start":{"line":350,"column":-1},"end":{"line":351,"column":32}},"locations":[{"start":{"line":350,"column":-1},"end":{"line":351,"column":32}}]},"19":{"type":"branch","line":351,"loc":{"start":{"line":351,"column":28},"end":{"line":351,"column":61}},"locations":[{"start":{"line":351,"column":28},"end":{"line":351,"column":61}}]},"20":{"type":"branch","line":351,"loc":{"start":{"line":351,"column":63},"end":{"line":358,"column":5}},"locations":[{"start":{"line":351,"column":63},"end":{"line":358,"column":5}}]},"21":{"type":"branch","line":359,"loc":{"start":{"line":359,"column":-1},"end":{"line":364,"column":27}},"locations":[{"start":{"line":359,"column":-1},"end":{"line":364,"column":27}}]},"22":{"type":"branch","line":364,"loc":{"start":{"line":364,"column":27},"end":{"line":367,"column":5}},"locations":[{"start":{"line":364,"column":27},"end":{"line":367,"column":5}}]},"23":{"type":"branch","line":367,"loc":{"start":{"line":367,"column":5},"end":{"line":370,"column":5}},"locations":[{"start":{"line":367,"column":5},"end":{"line":370,"column":5}}]},"24":{"type":"branch","line":367,"loc":{"start":{"line":367,"column":34},"end":{"line":370,"column":5}},"locations":[{"start":{"line":367,"column":34},"end":{"line":370,"column":5}}]},"25":{"type":"branch","line":371,"loc":{"start":{"line":371,"column":-1},"end":{"line":378,"column":3}},"locations":[{"start":{"line":371,"column":-1},"end":{"line":378,"column":3}}]},"26":{"type":"branch","line":380,"loc":{"start":{"line":380,"column":10},"end":{"line":393,"column":3}},"locations":[{"start":{"line":380,"column":10},"end":{"line":393,"column":3}}]},"27":{"type":"branch","line":386,"loc":{"start":{"line":386,"column":21},"end":{"line":392,"column":5}},"locations":[{"start":{"line":386,"column":21},"end":{"line":392,"column":5}}]},"28":{"type":"branch","line":388,"loc":{"start":{"line":388,"column":28},"end":{"line":390,"column":5}},"locations":[{"start":{"line":388,"column":28},"end":{"line":390,"column":5}}]},"29":{"type":"branch","line":390,"loc":{"start":{"line":390,"column":5},"end":{"line":392,"column":5}},"locations":[{"start":{"line":390,"column":5},"end":{"line":392,"column":5}}]},"30":{"type":"branch","line":383,"loc":{"start":{"line":383,"column":36},"end":{"line":383,"column":70}},"locations":[{"start":{"line":383,"column":36},"end":{"line":383,"column":70}}]},"31":{"type":"branch","line":384,"loc":{"start":{"line":384,"column":36},"end":{"line":384,"column":73}},"locations":[{"start":{"line":384,"column":36},"end":{"line":384,"column":73}}]},"32":{"type":"branch","line":395,"loc":{"start":{"line":395,"column":10},"end":{"line":415,"column":3}},"locations":[{"start":{"line":395,"column":10},"end":{"line":415,"column":3}}]},"33":{"type":"branch","line":397,"loc":{"start":{"line":397,"column":40},"end":{"line":412,"column":5}},"locations":[{"start":{"line":397,"column":40},"end":{"line":412,"column":5}}]},"34":{"type":"branch","line":399,"loc":{"start":{"line":399,"column":8},"end":{"line":400,"column":63}},"locations":[{"start":{"line":399,"column":8},"end":{"line":400,"column":63}}]},"35":{"type":"branch","line":401,"loc":{"start":{"line":401,"column":8},"end":{"line":402,"column":67}},"locations":[{"start":{"line":401,"column":8},"end":{"line":402,"column":67}}]},"36":{"type":"branch","line":403,"loc":{"start":{"line":403,"column":8},"end":{"line":404,"column":68}},"locations":[{"start":{"line":403,"column":8},"end":{"line":404,"column":68}}]},"37":{"type":"branch","line":405,"loc":{"start":{"line":405,"column":8},"end":{"line":406,"column":68}},"locations":[{"start":{"line":405,"column":8},"end":{"line":406,"column":68}}]},"38":{"type":"branch","line":407,"loc":{"start":{"line":407,"column":8},"end":{"line":408,"column":69}},"locations":[{"start":{"line":407,"column":8},"end":{"line":408,"column":69}}]},"39":{"type":"branch","line":409,"loc":{"start":{"line":409,"column":8},"end":{"line":410,"column":68}},"locations":[{"start":{"line":409,"column":8},"end":{"line":410,"column":68}}]},"40":{"type":"branch","line":414,"loc":{"start":{"line":414,"column":48},"end":{"line":414,"column":72}},"locations":[{"start":{"line":414,"column":48},"end":{"line":414,"column":72}}]},"41":{"type":"branch","line":417,"loc":{"start":{"line":417,"column":10},"end":{"line":429,"column":3}},"locations":[{"start":{"line":417,"column":10},"end":{"line":429,"column":3}}]},"42":{"type":"branch","line":420,"loc":{"start":{"line":420,"column":6},"end":{"line":421,"column":61}},"locations":[{"start":{"line":420,"column":6},"end":{"line":421,"column":61}}]},"43":{"type":"branch","line":422,"loc":{"start":{"line":422,"column":6},"end":{"line":423,"column":65}},"locations":[{"start":{"line":422,"column":6},"end":{"line":423,"column":65}}]},"44":{"type":"branch","line":424,"loc":{"start":{"line":424,"column":6},"end":{"line":425,"column":66}},"locations":[{"start":{"line":424,"column":6},"end":{"line":425,"column":66}}]},"45":{"type":"branch","line":426,"loc":{"start":{"line":426,"column":6},"end":{"line":427,"column":66}},"locations":[{"start":{"line":426,"column":6},"end":{"line":427,"column":66}}]},"46":{"type":"branch","line":431,"loc":{"start":{"line":431,"column":2},"end":{"line":433,"column":3}},"locations":[{"start":{"line":431,"column":2},"end":{"line":433,"column":3}}]},"47":{"type":"branch","line":435,"loc":{"start":{"line":435,"column":2},"end":{"line":437,"column":3}},"locations":[{"start":{"line":435,"column":2},"end":{"line":437,"column":3}}]},"48":{"type":"branch","line":439,"loc":{"start":{"line":439,"column":2},"end":{"line":445,"column":3}},"locations":[{"start":{"line":439,"column":2},"end":{"line":445,"column":3}}]},"49":{"type":"branch","line":441,"loc":{"start":{"line":441,"column":6},"end":{"line":443,"column":56}},"locations":[{"start":{"line":441,"column":6},"end":{"line":443,"column":56}}]},"50":{"type":"branch","line":442,"loc":{"start":{"line":442,"column":52},"end":{"line":443,"column":56}},"locations":[{"start":{"line":442,"column":52},"end":{"line":443,"column":56}}]}},"b":{"0":[18],"1":[18],"2":[180],"3":[14],"4":[78],"5":[13],"6":[14],"7":[140],"8":[70],"9":[42],"10":[70],"11":[119],"12":[78],"13":[78],"14":[6],"15":[72],"16":[0],"17":[0],"18":[72],"19":[0],"20":[0],"21":[72],"22":[8],"23":[64],"24":[7],"25":[72],"26":[14],"27":[7],"28":[5],"29":[2],"30":[58],"31":[59],"32":[14],"33":[78],"34":[30],"35":[3],"36":[29],"37":[14],"38":[2],"39":[0],"40":[78],"41":[78],"42":[30],"43":[3],"44":[29],"45":[16],"46":[2],"47":[1],"48":[3],"49":[30],"50":[15]},"fnMap":{"0":{"name":"RegulationService","decl":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"line":38},"1":{"name":"initializeRegulations","decl":{"start":{"line":42,"column":10},"end":{"line":252,"column":3}},"loc":{"start":{"line":42,"column":10},"end":{"line":252,"column":3}},"line":42},"2":{"name":"checkCompliance","decl":{"start":{"line":254,"column":2},"end":{"line":301,"column":3}},"loc":{"start":{"line":254,"column":2},"end":{"line":301,"column":3}},"line":254},"3":{"name":"getApplicableRegulations","decl":{"start":{"line":303,"column":10},"end":{"line":326,"column":3}},"loc":{"start":{"line":303,"column":10},"end":{"line":326,"column":3}},"line":303},"4":{"name":"performComplianceCheck","decl":{"start":{"line":328,"column":10},"end":{"line":378,"column":3}},"loc":{"start":{"line":328,"column":10},"end":{"line":378,"column":3}},"line":328},"5":{"name":"determineOverallStatus","decl":{"start":{"line":380,"column":10},"end":{"line":393,"column":3}},"loc":{"start":{"line":380,"column":10},"end":{"line":393,"column":3}},"line":380},"6":{"name":"calculateNextReviewDate","decl":{"start":{"line":395,"column":10},"end":{"line":415,"column":3}},"loc":{"start":{"line":395,"column":10},"end":{"line":415,"column":3}},"line":395},"7":{"name":"calculateDeadline","decl":{"start":{"line":417,"column":10},"end":{"line":429,"column":3}},"loc":{"start":{"line":417,"column":10},"end":{"line":429,"column":3}},"line":417},"8":{"name":"getRegulationByCode","decl":{"start":{"line":431,"column":2},"end":{"line":433,"column":3}},"loc":{"start":{"line":431,"column":2},"end":{"line":433,"column":3}},"line":431},"9":{"name":"getAllRegulations","decl":{"start":{"line":435,"column":2},"end":{"line":437,"column":3}},"loc":{"start":{"line":435,"column":2},"end":{"line":437,"column":3}},"line":435},"10":{"name":"getRegulationsByCountry","decl":{"start":{"line":439,"column":2},"end":{"line":445,"column":3}},"loc":{"start":{"line":439,"column":2},"end":{"line":445,"column":3}},"line":439}},"f":{"0":18,"1":18,"2":14,"3":14,"4":78,"5":14,"6":14,"7":78,"8":2,"9":1,"10":3}} +,"/workspaces/CurrentDao-backend/src/cross-border/controller/cross-border.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/controller/cross-border.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":7}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":6}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":6}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":7}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":11}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":24}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":8}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":10}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":15}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":11}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":25}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":8}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":55}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":69}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":63}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":60}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":81}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":8}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":30}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":30}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":40}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":39}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":36}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":14}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":71}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":58}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":54}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":52}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":60}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":6}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":23}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":31}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":76}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":80}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":72}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":69}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":26}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":71}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":73}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":29}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":31}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":70}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":76}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":33}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":70}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":34}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":76}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":37}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":53}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":69}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":65}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":69}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":71}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":71}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":22}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":61}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":55}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":55}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":48}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":52}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":16}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":16}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":55}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":72}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":57}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":66}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":30}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":30}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":8}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":61}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":28}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":6}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":37}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":50}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":69}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":80}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":26}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":50}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":66}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":50}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":74}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":3}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":44}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":56}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":69}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":75}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":25}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":50}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":32}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":75}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":3}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":45}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":50}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":69}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":54}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":26}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":50}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":36}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":5}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":78}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":26}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":76}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":74}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":74}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":66}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":66}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":76}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":74}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":24}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":50}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":50}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":44}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":36}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":54}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":5}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":50}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":20}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":20}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":17}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":13}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":22}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":6}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":3}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":32}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":61}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":16}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":16}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":54}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":4}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":54}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":3}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":41}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":58}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":61}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":16}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":16}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":62}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":4}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":68}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":67}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":3}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":27}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":48}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":79}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":24}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":35}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":47}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":43}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":5}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":48}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":13}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":19}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":17}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":3}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":28}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":56}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":16}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":63}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":4}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":34}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":57}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":3}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":50}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":57}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":69}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":67}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":16}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":64}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":4}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":31}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":48}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":44}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":5}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":55}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":17}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":6}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":3}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":28}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":61}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":77}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":25}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":49}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":49}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":35}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":39}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":43}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":43}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":58}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":20}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":20}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":13}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":15}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":17}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":18}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":6}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":3}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":37}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":63}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":63}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":16}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":16}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":55}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":4}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":65}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":70}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":3}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":53}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":66}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":69}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":69}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":16}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":16}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":56}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":4}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":24}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":50}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":50}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":5}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":60}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":20}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":20}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":6}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":27}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":58}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":77}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":23}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":43}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":41}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":37}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":48}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":5}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":38}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":34}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":45}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":17}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":12}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":10}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":19}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":6}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":35}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":56}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":59}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":77}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":59}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":53}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":3}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":0}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":17}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":53}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":48}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":78}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":54}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":17}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":66}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":5}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":51}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":3}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":43}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":53}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":67}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":16}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":16}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":60}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":4}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":74}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":64}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":3}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":0}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":17}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":55}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":78}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":22}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":61}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":16}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":53}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":66}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":23}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":12}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":24}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":42}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":17}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":39}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":36}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":34}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":33}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":32}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":8}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":6}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":3}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":346,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":346,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":346,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":346,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/cross-border/currency/currency-service.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/currency/currency-service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":26}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":31}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":18}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":17}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":1}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":35}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":25}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":22}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":36}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":15}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":17}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":19}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":30}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":61}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":72}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":72}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":14}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":61}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":53}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":36}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":49}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":45}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":7}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":26}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":25}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":23}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":8}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":7}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":21}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":20}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":25}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":23}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":23}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":8}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":7}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":20}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":30}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":20}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":8}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":7}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":20}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":29}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":25}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":23}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":8}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":7}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":20}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":29}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":20}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":25}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":23}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":23}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":8}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":20}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":29}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":20}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":25}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":23}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":8}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":7}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":20}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":34}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":25}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":23}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":23}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":8}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":20}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":32}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":21}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":25}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":23}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":23}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":8}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":7}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":20}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":28}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":21}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":25}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":23}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":23}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":8}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":7}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":20}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":30}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":21}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":25}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":23}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":8}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":7}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":20}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":32}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":23}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":8}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":7}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":29}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":21}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":25}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":23}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":23}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":8}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":7}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":20}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":33}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":21}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":25}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":23}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":23}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":8}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":7}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":20}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":33}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":22}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":25}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":23}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":23}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":8}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":7}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":20}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":35}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":22}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":25}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":23}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":8}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":7}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":20}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":33}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":25}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":23}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":23}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":8}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":7}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":20}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":29}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":20}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":25}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":23}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":23}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":8}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":7}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":20}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":31}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":25}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":23}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":23}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":8}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":7}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":20}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":30}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":25}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":23}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":23}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":8}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":7}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":20}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":35}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":20}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":25}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":23}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":23}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":8}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":6}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":38}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":60}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":7}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":77}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":3}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":44}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":31}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":23}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":33}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":26}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":3}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":54}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":9}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":33}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":77}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":19}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":41}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":79}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":10}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":42}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":63}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":55}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":44}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":33}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":35}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":36}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":31}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":14}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":76}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":11}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":9}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":14}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":41}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":7}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":61}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":21}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":23}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":59}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":14}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":8}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":39}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":5}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":3}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":45}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":47}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":16}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":16}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":17}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":17}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":16}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":16}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":16}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":17}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":17}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":16}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":16}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":16}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":16}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":18}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":17}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":16}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":17}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":17}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":6}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":63}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":38}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":20}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":21}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":68}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":30}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":23}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":8}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":58}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":5}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":3}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":24}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":19}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":25}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":23}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":32}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":54}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":70}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":5}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":0}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":52}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":68}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":5}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":0}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":38}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":14}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":31}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":39}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":32}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":35}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":24}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":15}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":28}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":30}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":8}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":78}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":78}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":50}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":46}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":12}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":29}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":37}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":22}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":33}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":19}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":10}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":18}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":28}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":6}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":3}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":32}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":25}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":23}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":22}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":54}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":55}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":45}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":41}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":44}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":52}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":45}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":66}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":29}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":43}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":38}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":7}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":63}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":59}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":31}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":5}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":20}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":73}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":6}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":33}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":19}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":25}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":23}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":13}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":49}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":26}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":104}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":54}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":0}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":71}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":3}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":49}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":64}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":38}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":6}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":3}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":66}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":46}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":3}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":25}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":25}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":23}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":21}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":37}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":48}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":0}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":38}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":46}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":5}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":0}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":17}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":3}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":0}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":26}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":19}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":25}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":23}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":13}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":47}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":64}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":116}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":49}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":3}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":0}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":60}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":64}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":24}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":31}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":5}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":0}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":71}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":54}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":3}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":0}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":47}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":12}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":43}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":49}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":6}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":3}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":0}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":62}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":64}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":74}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":6}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":3}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":442,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":442,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":442,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":442,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/cross-border/dto/international-trade.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/dto/international-trade.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":10}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":41}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":53}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":36}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":15}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":25}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":15}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":25}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":13}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":17}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":15}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":38}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":15}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":30}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":12}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":15}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":1}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":31}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":13}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":15}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":13}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":26}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":13}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":15}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":21}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":15}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":12}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":28}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":42}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":13}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":26}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":35}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":13}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":24}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":24}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":13}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":13}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":19}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":36}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":45}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":15}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":19}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":38}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":49}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":15}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":31}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":35}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":13}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":15}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":22}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":13}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":15}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":13}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":15}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":22}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":13}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":15}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":22}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":13}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":15}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":19}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":13}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":15}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":22}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":17}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":15}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":27}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":17}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":15}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":24}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":13}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":24}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":13}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":15}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":21}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":12}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":23}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":13}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":17}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":1}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":42}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":26}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":15}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":36}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":13}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":15}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":18}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":13}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":15}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":20}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":15}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":19}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":36}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":45}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":15}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":38}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":49}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":15}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":19}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":31}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":35}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":13}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":15}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":17}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":1}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":42}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":13}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":15}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":25}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":13}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":15}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":25}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":26}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":15}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":36}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":0}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":13}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":15}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":20}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":13}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":15}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":18}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":27}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":15}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":38}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":15}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":21}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":17}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":15}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":13}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":15}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":21}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":13}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":15}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":13}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":15}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":22}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":13}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":15}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":22}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":13}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":15}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":19}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":242,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":242,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":242,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":242,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/cross-border/entities/cross-border-transaction.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/entities/cross-border-transaction.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":31}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":28}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":29}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":34}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":36}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":40}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":36}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":35}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":42}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":30}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":37}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":33}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":11}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":35}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":11}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":24}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":55}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":24}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":71}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":40}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":71}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":24}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":71}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":71}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":71}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":23}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":49}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":55}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":37}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":37}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":38}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":37}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":35}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":37}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":40}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":29}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":30}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":29}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":32}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":29}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":21}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":43}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":43}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":25}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":18}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":18}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":29}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":21}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":21}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":117,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":117,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":117,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":117,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/cross-border/reporting/regulatory-report.service.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/reporting/regulatory-report.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":37}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":25}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":19}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":53}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":69}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":35}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":11}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":18}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":4}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":12}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":30}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":23}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":36}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":40}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":20}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":58}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":24}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":22}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":36}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":21}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":16}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":19}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":37}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":1}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":25}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":23}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":23}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":24}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":25}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":32}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":27}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":33}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":13}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":22}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":69}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":27}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":41}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":46}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":40}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":1}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":19}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":23}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":62}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":17}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":17}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":1}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":13}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":38}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":69}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":76}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":74}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":14}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":45}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":79}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":58}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":50}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":37}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":45}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":41}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":7}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":41}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":51}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":77}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":27}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":29}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":25}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":23}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":18}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":29}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":22}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":70}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":25}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":56}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":10}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":8}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":7}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":36}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":46}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":69}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":27}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":25}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":26}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":26}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":18}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":29}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":10}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":23}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":70}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":25}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":24}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":24}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":40}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":48}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":10}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":8}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":7}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":42}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":51}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":61}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":38}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":31}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":78}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":22}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":25}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":30}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":67}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":10}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":8}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":7}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":36}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":45}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":65}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":38}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":29}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":25}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":20}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":23}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":20}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":24}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":10}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":22}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":61}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":25}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":26}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":50}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":10}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":8}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":37}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":51}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":76}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":27}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":27}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":25}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":26}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":26}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":26}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":18}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":10}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":69}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":25}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":30}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":65}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":10}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":8}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":6}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":37}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":54}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":7}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":20}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":68}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":6}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":3}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":23}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":23}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":20}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":18}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":26}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":32}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":20}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":106}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":6}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":58}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":20}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":66}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":61}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":16}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":14}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":19}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":6}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":80}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":29}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":58}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":42}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":25}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":24}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":6}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":38}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":34}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":17}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":37}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":58}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":14}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":39}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":24}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":30}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":22}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":6}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":0}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":20}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":85}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":6}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":18}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":3}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":41}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":18}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":26}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":40}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":33}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":18}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":24}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":22}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":8}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":6}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":59}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":70}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":28}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":46}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":46}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":8}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":5}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":44}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":28}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":34}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":7}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":3}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":0}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":70}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":61}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":71}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":17}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":17}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":27}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":6}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":53}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":3}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":40}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":43}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":35}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":47}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":47}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":34}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":47}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":47}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":54}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":46}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":32}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":37}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":53}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":54}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":52}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":66}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":8}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":3}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":74}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":78}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":51}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":5}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":48}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":3}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":0}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":70}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":8}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":35}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":47}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":7}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":55}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":60}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":76}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":36}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":39}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":55}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":37}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":10}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":38}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":61}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":9}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":7}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":22}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":3}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":73}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":37}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":40}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":5}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":13}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":3}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":39}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":40}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":15}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":37}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":0}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":8}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":35}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":54}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":7}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":76}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":5}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":23}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":43}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":43}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":34}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":67}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":43}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":43}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":63}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":51}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":8}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":56}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":57}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":65}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":15}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":57}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":69}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":15}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":58}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":70}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":15}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":28}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":65}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":0}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":20}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":40}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":40}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":20}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":21}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":21}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":22}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":23}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":67}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":33}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":10}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":37}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":39}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":9}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":5}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":0}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":19}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":3}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":33}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":40}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":20}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":14}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":12}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":53}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":75}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":72}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":6}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":3}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":0}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":41}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":43}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":13}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":54}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":42}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":6}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":0}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":45}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":15}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":5}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":0}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":64}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":69}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":10}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":0}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":52}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":27}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":38}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":42}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":34}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":50}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":75}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":73}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":54}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":63}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":13}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":26}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":27}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":59}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":12}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":0}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":43}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":44}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":8}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":6}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":76}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":0}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":12}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":24}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":18}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":17}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":21}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":17}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":16}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":6}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":3}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":0}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":38}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":88}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":3}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":0}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":67}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":54}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":18}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":55}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":5}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":65}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":52}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":22}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":82}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":8}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":5}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":0}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":53}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":42}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":15}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":19}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":44}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":24}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":30}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":6}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":0}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":9}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":73}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":55}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":17}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":24}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":8}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":0}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":38}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":37}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":0}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":34}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":41}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":0}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":22}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":87}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":8}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":21}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":35}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":39}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":71}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":18}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":5}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":0}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":51}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":22}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":3}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":0}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":71}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":21}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":18}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":47}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":17}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":41}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":17}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":41}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":17}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":41}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":14}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":22}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":5}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":3}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":0}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":58}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":32}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":50}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":19}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":23}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":35}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":10}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":59}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":53}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":11}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":11}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":80}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":59}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":71}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":12}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":22}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":3}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":0}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":58}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":21}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":23}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":13}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":23}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":23}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":20}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":14}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":17}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":26}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":6}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":49}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":22}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":27}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":22}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":22}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":19}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":25}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":17}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":25}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":7}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":0}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":69}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":3}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":0}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":58}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":58}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":36}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":51}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":3}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":0}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":37}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":29}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":14}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":19}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":75}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":12}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":24}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":37}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":42}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":6}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":3}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":0}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":42}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":88}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":3}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":0}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":75}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":62}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":16}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":3}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":0}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":27}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":39}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":34}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":62}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":14}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":3}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":0}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":28}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":25}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":39}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":54}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":3}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":0}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":42}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":53}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":3}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":0}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":73}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":48}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":3}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":0}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":51}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":64}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":0}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":39}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":53}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":36}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":5}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":3}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":0}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":58}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":27}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":22}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":0}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":33}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":19}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":64}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":14}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":20}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":68}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":14}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":21}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":69}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":14}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":23}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":69}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":14}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":20}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":70}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":14}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":14}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":64}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":5}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":0}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":22}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":45}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":57}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":42}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":0}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":20}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":71}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":6}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":3}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":0}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":40}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":29}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":20}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":9}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":33}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":77}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":0}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":47}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":20}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":18}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":16}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":30}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":8}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":41}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":0}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":22}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":81}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":8}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":21}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":24}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":64}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":14}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":8}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":5}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":3}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":0}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":70}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":24}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":19}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":65}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":20}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":69}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":21}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":70}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":23}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":70}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":20}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":71}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":14}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":65}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":5}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":3}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":720,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":720,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":720,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":720,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/cross-border/tariffs/customs-service.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/tariffs/customs-service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":26}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":29}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":17}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":20}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":1}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":37}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":17}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":20}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":25}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":1}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":33}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":15}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":15}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":17}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":30}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":17}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":29}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":30}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":30}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":26}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":22}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":1}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":13}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":60}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":70}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":72}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":43}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":18}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":10}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":11}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":12}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":14}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":53}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":33}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":34}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":41}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":57}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":29}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":43}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":21}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":29}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":48}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":10}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":20}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":9}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":29}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":37}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":21}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":48}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":10}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":8}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":12}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":9}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":29}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":40}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":21}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":29}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":48}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":10}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":8}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":13}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":29}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":30}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":21}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":29}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":48}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":8}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":14}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":9}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":29}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":37}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":21}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":29}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":48}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":10}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":8}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":13}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":9}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":29}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":21}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":29}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":48}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":10}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":8}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":6}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":72}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":48}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":20}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":87}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":6}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":3}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":42}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":34}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":7}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":28}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":28}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":34}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":27}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":25}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":26}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":70}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":75}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":10}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":50}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":28}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":34}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":32}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":27}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":10}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":58}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":8}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":7}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":28}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":28}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":34}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":26}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":70}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":76}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":10}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":49}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":28}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":34}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":26}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":32}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":10}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":63}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":8}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":7}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":28}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":28}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":34}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":27}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":25}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":26}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":70}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":80}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":10}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":65}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":28}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":34}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":32}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":27}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":10}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":56}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":8}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":28}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":28}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":34}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":27}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":24}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":26}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":70}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":78}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":10}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":52}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":28}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":34}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":38}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":32}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":10}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":53}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":8}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":6}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":31}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":64}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":40}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":39}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":7}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":44}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":5}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":20}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":68}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":6}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":35}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":26}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":26}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":19}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":21}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":23}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":22}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":34}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":33}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":20}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":107}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":6}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":9}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":78}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":73}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":69}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":50}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":15}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":22}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":22}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":8}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":52}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":46}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":21}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":22}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":22}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":19}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":8}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":73}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":64}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":21}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":22}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":22}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":19}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":8}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":56}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":22}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":22}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":8}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":64}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":22}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":22}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":19}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":8}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":72}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":42}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":15}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":24}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":21}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":36}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":15}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":14}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":56}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":23}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":17}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":21}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":26}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":47}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":8}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":22}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":70}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":8}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":20}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":21}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":62}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":18}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":3}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":56}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":45}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":30}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":30}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":22}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":24}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":23}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":24}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":26}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":29}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":26}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":6}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":45}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":3}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":29}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":19}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":21}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":22}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":29}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":20}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":5}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":0}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":9}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":77}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":19}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":41}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":67}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":10}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":51}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":19}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":31}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":9}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":7}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":21}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":77}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":47}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":16}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":16}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":17}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":16}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":17}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":16}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":16}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":16}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":6}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":42}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":25}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":3}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":30}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":19}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":26}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":26}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":26}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":52}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":45}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":36}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":58}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":17}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":16}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":17}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":56}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":32}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":29}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":36}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":10}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":7}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":5}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":12}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":13}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":44}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":17}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":25}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":32}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":6}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":3}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":0}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":31}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":25}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":26}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":26}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":23}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":32}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":52}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":45}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":39}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":49}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":5}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":39}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":26}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":0}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":49}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":49}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":0}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":36}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":12}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":55}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":52}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":11}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":19}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":9}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":7}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":0}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":18}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":27}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":27}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":15}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":41}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":9}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":5}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":17}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":3}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":0}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":68}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":60}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":11}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":79}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":8}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":11}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":79}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":8}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":11}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":79}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":8}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":6}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":0}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":45}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":3}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":0}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":40}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":25}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":26}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":26}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":23}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":22}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":17}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":0}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":59}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":40}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":5}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":59}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":41}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":5}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":58}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":55}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":5}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":0}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":56}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":3}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":0}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":34}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":26}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":26}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":23}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":24}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":52}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":45}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":0}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":39}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":16}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":5}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":0}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":38}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":26}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":0}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":44}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":0}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":35}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":79}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":5}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":0}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":32}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":59}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":5}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":0}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":24}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":3}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":0}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":37}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":26}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":26}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":23}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":24}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":52}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":45}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":0}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":23}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":30}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":27}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":21}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":6}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":36}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":52}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":5}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":0}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":8}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":78}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":7}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":53}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":5}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":0}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":35}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":21}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":37}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":39}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":8}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":5}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":0}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":35}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":3}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":0}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":64}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":50}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":3}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":0}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":31}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":26}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":26}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":20}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":52}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":44}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":3}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":0}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":65}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":62}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":19}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":5}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":0}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":36}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":50}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":19}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":5}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":0}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":16}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":3}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":0}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":39}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":42}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":3}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":0}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":31}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":26}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":26}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":23}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":22}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":58}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":0}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":59}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":76}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":5}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":0}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":59}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":76}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":5}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":0}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":35}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":47}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":5}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":0}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":58}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":51}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":5}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":0}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":20}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":3}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":596,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":596,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":596,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":596,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/cross-border/transactions/transaction-processor.service.ts": {"path":"/workspaces/CurrentDao-backend/src/cross-border/transactions/transaction-processor.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":63}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":25}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":19}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":53}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":20}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":42}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":8}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":38}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":60}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":77}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":35}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":38}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":38}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":45}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":20}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":25}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":37}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":28}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":33}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":25}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":30}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":28}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":42}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":73}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":60}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":30}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":26}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":27}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":25}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":14}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":45}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":79}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":58}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":54}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":52}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":27}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":49}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":32}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":20}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":78}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":6}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":9}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":72}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":56}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":59}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":65}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":55}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":58}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":56}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":11}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":34}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":63}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":59}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":7}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":53}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":48}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":7}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":67}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":39}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":8}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":57}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":75}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":73}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":69}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":51}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":61}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":70}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":63}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":24}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":25}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":22}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":8}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":30}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":59}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":59}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":52}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":14}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":62}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":50}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":50}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":56}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":30}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":64}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":52}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":62}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":14}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":37}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":38}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":25}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":25}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":22}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":55}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":8}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":21}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":24}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":74}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":14}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":8}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":50}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":14}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":33}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":32}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":47}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":8}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":34}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":38}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":29}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":53}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":51}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":55}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":51}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":51}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":37}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":41}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":35}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":23}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":39}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":38}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":32}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":50}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":25}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":25}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":39}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":18}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":6}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":3}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":42}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":38}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":39}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":8}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":33}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":62}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":7}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":18}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":5}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":48}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":18}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":20}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":45}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":6}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":3}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":40}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":38}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":19}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":58}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":25}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":25}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":20}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":39}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":25}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":6}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":3}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":31}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":49}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":46}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":23}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":13}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":72}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":24}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":41}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":49}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":17}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":3}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":75}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":31}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":23}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":42}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":27}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":46}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":28}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":47}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":14}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":47}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":5}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":3}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":73}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":47}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":21}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":52}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":56}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":21}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":50}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":59}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":43}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":54}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":51}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":10}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":3}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":27}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":26}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":45}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":76}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":3}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":32}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":30}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":40}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":66}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":3}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":35}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":26}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":26}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":40}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":44}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":46}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":35}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":7}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":62}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":41}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":31}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":26}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":32}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":69}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":23}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":64}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":5}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":0}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":58}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":78}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":52}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":47}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":51}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":47}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":47}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":33}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":37}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":31}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":6}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":46}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":3}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":26}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":26}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":20}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":38}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":69}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":23}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":64}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":5}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":8}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":74}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":27}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":7}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":7}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":22}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":68}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":8}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":53}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":30}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":59}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":26}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":56}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":35}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":20}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":18}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":40}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":44}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":14}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":47}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":8}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":35}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":7}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":3}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":0}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":33}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":22}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":40}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":44}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":14}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":43}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":8}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":32}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":7}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":3}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":79}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":44}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":14}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":58}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":7}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":3}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":0}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":33}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":48}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":34}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":79}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":45}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":78}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":6}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":34}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":35}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":22}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":11}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":27}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":37}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":44}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":30}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":12}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":6}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":3}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":381,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":381,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":381,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":381,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/database/sharding/partitioning.service.ts": {"path":"/workspaces/CurrentDao-backend/src/database/sharding/partitioning.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":58}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":65}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":36}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":3}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":38}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":72}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":54}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":32}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":17}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":32}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":49}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":126}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":66}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":6}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":82}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":119}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":46}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":60}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":46}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":74}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":12}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":29}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":38}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":36}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":42}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":71}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":100}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":24}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":58,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":58,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":58,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":58,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/database/sharding/rebalancing.service.ts": {"path":"/workspaces/CurrentDao-backend/src/database/sharding/rebalancing.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":60}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":33}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":64}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":42}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":61}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":5}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":54}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":5}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":71}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":40}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":78}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":63}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":60}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":33}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":46}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":60}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":42}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":6}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":20}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":97}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":41}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":18}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":41}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":48}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":78}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":26}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":45}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":45}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":76}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":34}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":23}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":100}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":8}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":59}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":58}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":60,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":60,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":60,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":60,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/database/sharding/shard-router.service.ts": {"path":"/workspaces/CurrentDao-backend/src/database/sharding/shard-router.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":25}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":29}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":33}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":19}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":15}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":19}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":1}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":57}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":64}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":22}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":38}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":40}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":8}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":67}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":30}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":22}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":67}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":62}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":8}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":52}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":5}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":47}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":45}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":37}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":68}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":73}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":29}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":5}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":42}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":37}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":64}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":33}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":66}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":53}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":38}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":66}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":6}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":41}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":44}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":44}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":88}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":28}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":79}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":71}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":64}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":29}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":82,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":82,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":82,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":82,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/database/sharding/sharding.module.ts": {"path":"/workspaces/CurrentDao-backend/src/database/sharding/sharding.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":71}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":60}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":61}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":59}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":71}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":61}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":14}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":23}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":4}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":12}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":23}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":4}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":2}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":25,"column":30}},"locations":[{"start":{"line":1,"column":0},"end":{"line":25,"column":30}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":25,"column":30}},"loc":{"start":{"line":1,"column":0},"end":{"line":25,"column":30}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/database/sharding/entities/shard-metadata.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/database/sharding/entities/shard-metadata.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":34}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":27}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":45}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":36}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":33}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":54}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":21}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":21}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":34,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":34,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/database/sharding/monitoring/shard-health.service.ts": {"path":"/workspaces/CurrentDao-backend/src/database/sharding/monitoring/shard-health.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":57}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":64}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":45}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":18}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":33}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":35}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":66}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":48}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":23}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":28}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":14}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":34}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":71}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":51}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":6}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":31}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":39}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":26}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":92}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":10}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":42}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":7}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":7}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":38}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":116}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":44}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":75}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":6}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":31}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":79}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":5}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":54}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":21}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":12}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":26}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":22}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":39}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":26}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":6}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":67,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":67,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":67,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":67,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/energy.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/energy.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":6}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":6}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":7}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":12}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":10}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":8}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":10}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":14}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":11}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":8}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":16}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":16}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":60}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":60}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":50}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":58}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":65}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":44}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":48}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":48}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":18}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":63}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":19}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":57}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":16}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":31}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":48}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":24}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":16}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":35}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":38}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":4}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":80}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":47}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":75}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":17}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":66}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":16}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":26}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":51}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":69}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":52}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":48}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":64}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":64}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":67}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":67}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":51}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":67}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":67}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":72}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":74}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":70}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":22}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":20}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":20}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":20}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":35}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":43}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":62}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":22}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":60}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":16}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":26}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":50}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":24}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":4}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":16}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":33}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":37}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":4}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":54}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":73}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":49}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":22}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":59}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":16}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":48}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":24}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":4}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":16}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":33}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":37}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":4}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":33}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":57}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":4}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":35}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":58}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":4}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":54}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":22}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":28}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":47}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":19}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":29}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":79}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":3}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":25}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":26}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":59}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":16}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":26}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":50}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":24}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":4}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":16}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":33}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":37}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":4}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":16}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":33}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":57}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":4}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":16}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":35}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":58}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":54}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":22}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":28}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":19}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":29}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":61}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":3}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":15}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":52}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":16}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":31}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":43}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":14}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":4}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":16}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":35}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":61}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":4}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":16}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":33}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":45}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":4}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":16}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":33}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":37}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":4}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":17}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":37}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":19}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":65}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":14}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":47}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":16}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":26}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":52}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":4}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":72}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":74}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":70}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":13}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":20}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":26}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":20}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":4}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":79}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":69}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":3}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":34}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":67}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":16}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":26}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":55}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":4}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":16}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":33}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":4}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":16}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":33}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":64}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":4}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":61}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":26}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":42}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":19}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":21}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":72}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":29}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":26}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":63}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":16}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":26}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":45}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":14}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":4}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":78}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":16}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":33}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":53}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":4}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":16}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":35}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":54}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":4}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":53}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":80}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":60}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":3}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":29}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":26}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":63}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":16}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":26}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":45}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":14}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":4}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":78}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":16}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":33}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":53}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":4}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":16}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":35}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":54}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":4}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":53}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":18}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":34}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":38}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":19}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":19}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":73}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":3}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":31}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":26}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":61}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":16}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":26}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":46}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":14}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":4}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":78}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":16}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":33}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":55}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":4}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":16}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":35}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":56}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":4}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":53}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":20}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":34}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":19}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":19}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":62}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":3}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":25}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":53}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":16}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":31}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":47}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":16}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":4}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":16}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":35}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":57}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":4}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":16}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":33}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":56}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":4}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":78}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":21}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":45}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":19}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":21}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":73}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":20}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":48}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":16}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":26}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":48}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":16}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":4}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":80}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":16}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":33}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":53}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":4}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":52}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":79}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":60}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":3}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":16}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":49}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":16}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":26}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":54}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":4}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":72}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":74}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":70}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":13}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":22}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":20}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":26}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":20}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":4}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":24}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":43}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":19}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":5}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":71}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":3}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":0}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":27}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":26}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":51}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":16}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":26}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":53}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":16}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":4}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":80}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":16}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":33}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":55}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":4}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":16}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":35}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":45}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":4}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":52}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":26}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":28}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":54}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":19}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":21}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":48}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":9}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":25}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":18}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":18}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":6}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":3}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":19}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":60}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":16}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":26}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":53}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":4}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":52}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":64}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":64}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":67}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":67}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":51}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":67}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":67}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":54}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":51}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":3}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":0}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":32}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":53}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":16}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":26}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":52}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":4}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":16}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":33}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":37}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":4}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":54}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":68}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":64}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":0}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":12}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":35}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":33}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":59}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":78}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":61}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":37}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":47}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":6}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":3}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":0}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":19}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":55}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":16}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":26}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":57}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":4}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":52}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":31}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":68}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":37}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":30}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":32}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":8}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":72}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":74}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":7}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":0}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":52}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":47}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":6}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":80}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":48}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":16}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":37}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":39}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":39}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":6}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":0}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":48}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":63}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":8}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":6}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":27}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":34}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":78}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":34}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":12}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":0}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":12}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":16}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":42}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":46}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":34}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":40}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":38}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":42}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":19}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":24}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":8}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":23}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":54}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":46}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":50}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":8}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":20}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":47}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":52}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":12}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":10}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":23}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":34}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":80}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":39}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":17}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":16}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":28}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":36}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":78}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":25}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":41}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":17}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":16}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":8}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":6}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":3}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":0}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":20}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":55}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":16}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":26}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":53}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":4}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":39}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":56}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":67}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":42}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":7}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":0}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":51}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":25}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":57}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":19}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":8}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":35}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":6}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":0}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":57}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":25}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":69}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":19}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":8}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":35}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":6}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":0}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":57}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":25}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":39}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":59}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":9}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":55}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":43}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":19}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":8}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":61}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":6}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":0}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":71}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":36}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":50}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":19}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":8}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":35}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":6}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":0}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":12}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":17}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":41}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":48}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":51}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":17}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":57}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":59}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":61}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":63}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":47}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":8}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":19}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":23}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":29}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":23}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":8}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":16}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":51}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":53}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":73}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":20}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":46}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":46}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":8}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":6}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":3}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":0}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":71}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":38}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":0}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":60}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":79}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":20}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":73}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":20}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":50}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":0}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":44}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":3}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":608,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":608,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":608,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":608,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/energy.module.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/energy.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":55}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":49}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":65}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":44}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":48}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":70}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":42}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":67}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":34}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":5}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":36}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":6}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":27}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":23,"column":28}},"locations":[{"start":{"line":1,"column":0},"end":{"line":23,"column":28}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":23,"column":28}},"loc":{"start":{"line":1,"column":0},"end":{"line":23,"column":28}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/energy.service.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/energy.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":20}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":22}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":51}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":10}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":11}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":17}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":16}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":16}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":14}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":42}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":55}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":8}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":8}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":14}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":17}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":60}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":60}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":50}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":58}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":21}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":20}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":20}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":14}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":22}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":19}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":23}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":23}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":1}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":36}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":18}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":29}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":37}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":16}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":16}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":21}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":19}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":13}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":59}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":14}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":36}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":66}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":26}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":52}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":28}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":56}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":44}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":22}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":39}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":29}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":71}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":51}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":26}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":24}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":35}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":19}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":7}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":37}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":63}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":40}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":69}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":45}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":79}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":43}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":75}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":5}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":68}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":59}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":24}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":20}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":31}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":59}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":46}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":20}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":108}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":6}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":47}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":36}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":48}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":53}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":22}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":75}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":5}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":28}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":65}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":38}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":9}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":5}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":24}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":57}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":30}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":9}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":26}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":59}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":34}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":9}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":5}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":26}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":59}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":34}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":9}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":29}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":65}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":40}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":5}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":29}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":65}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":40}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":9}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":5}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":63}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":36}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":9}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":5}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":42}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":65}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":38}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":9}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":5}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":42}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":65}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":38}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":9}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":30}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":67}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":42}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":9}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":31}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":68}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":44}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":9}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":5}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":26}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":28}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":247}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":9}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":45}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":47}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":41}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":10}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":8}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":5}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":52}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":53}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":57}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":58}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":51}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":0}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":67}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":59}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":12}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":21}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":28}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":30}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":17}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":44}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":35}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":6}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":3}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":60}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":58}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":20}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":36}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":7}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":19}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":69}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":5}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":38}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":19}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":3}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":22}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":15}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":39}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":29}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":50}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":39}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":76}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":5}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":8}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":48}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":48}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":7}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":36}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":60}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":8}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":5}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":45}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":31}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":0}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":37}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":63}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":5}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":40}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":69}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":5}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":45}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":79}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":5}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":43}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":75}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":5}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":0}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":70}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":65}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":26}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":3}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":75}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":50}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":39}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":76}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":5}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":50}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":36}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":55}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":8}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":5}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":53}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":68}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":5}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":45}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":37}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":31}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":72}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":51}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":67}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":28}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":3}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":74}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":20}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":76}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":6}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":69}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":39}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":73}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":5}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":50}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":71}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":5}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":62}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":69}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":5}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":50}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":36}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":54}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":8}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":5}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":67}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":36}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":71}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":8}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":67}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":36}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":69}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":8}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":5}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":0}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":8}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":49}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":68}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":7}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":36}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":84}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":8}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":5}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":8}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":49}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":68}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":7}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":36}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":81}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":8}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":5}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":0}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":58}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":14}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":41}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":25}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":34}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":8}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":7}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":0}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":22}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":36}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":57}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":8}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":5}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":43}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":21}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":23}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":32}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":59}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":24}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":7}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":32}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":54}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":5}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":0}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":56}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":0}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":56}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":20}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":72}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":6}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":20}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":3}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":22}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":19}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":59}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":36}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":57}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":43}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":32}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":50}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":51}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":52}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":53}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":53}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":0}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":58}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":51}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":0}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":63}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":0}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":59}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":12}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":17}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":12}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":28}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":30}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":17}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":44}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":35}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":6}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":3}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":0}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":78}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":57}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":0}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":39}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":35}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":55}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":8}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":5}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":0}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":36}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":27}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":29}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":35}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":7}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":3}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":0}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":64}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":50}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":27}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":29}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":7}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":0}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":15}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":68}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":5}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":0}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":43}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":35}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":57}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":8}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":5}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":0}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":43}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":68}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":5}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":54}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":67}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":5}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":0}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":65}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":38}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":34}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":31}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":30}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":0}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":48}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":40}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":38}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":0}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":74}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":0}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":78}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":17}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":7}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":3}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":0}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":18}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":18}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":19}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":20}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":19}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":50}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":27}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":29}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":7}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":0}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":15}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":68}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":5}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":0}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":43}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":35}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":57}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":8}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":5}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":0}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":43}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":68}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":5}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":0}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":36}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":32}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":29}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":0}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":45}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":25}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":28}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":25}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":13}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":56}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":40}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":36}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":7}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":0}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":59}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":0}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":76}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":23}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":3}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":0}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":66}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":75}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":0}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":15}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":68}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":5}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":0}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":34}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":74}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":5}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":0}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":43}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":70}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":5}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":0}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":37}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":33}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":27}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":0}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":60}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":0}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":48}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":0}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":65}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":24}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":3}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":0}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":21}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":37}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":19}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":21}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":20}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":77}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":6}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":0}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":50}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":43}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":29}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":7}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":0}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":15}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":34}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":57}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":8}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":5}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":0}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":44}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":80}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":5}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":0}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":58}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":58}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":0}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":8}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":45}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":52}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":7}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":35}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":55}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":8}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":5}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":0}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":62}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":46}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":7}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":0}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":24}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":73}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":5}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":0}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":57}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":60}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":18}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":0}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":50}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":0}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":55}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":53}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":59}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":0}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":76}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":0}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":47}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":25}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":31}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":20}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":62}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":64}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":29}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":23}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":17}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":31}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":31}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":34}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":43}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":45}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":24}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":7}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":0}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":56}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":31}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":43}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":77}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":25}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":80}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":76}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":10}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":8}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":5}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":0}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":58}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":30}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":42}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":76}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":26}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":24}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":48}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":13}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":10}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":8}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":5}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":0}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":57}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":29}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":41}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":34}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":56}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":10}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":8}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":5}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":0}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":59}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":32}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":44}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":33}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":58}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":10}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":8}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":5}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":0}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":37}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":73}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":21}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":45}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":46}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":45}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":22}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":10}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":5}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":0}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":62}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":0}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":20}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":75}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":6}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":22}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":3}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":0}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":66}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":54}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":20}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":36}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":7}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":0}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":17}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":67}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":5}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":0}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":64}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":35}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":55}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":8}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":5}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":0}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":17}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":3}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":0}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":24}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":19}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":59}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":38}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":59}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":0}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":45}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":34}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":52}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":44}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":80}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":0}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":52}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":53}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":55}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":0}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":58}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":51}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":0}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":65}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":0}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":59}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":0}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":12}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":19}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":12}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":28}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":30}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":17}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":44}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":35}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":6}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":3}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":0}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":26}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":15}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":24}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":19}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":20}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":21}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":54}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":0}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":74}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":45}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":36}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":62}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":8}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":5}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":0}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":40}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":26}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":29}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":0}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":49}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":27}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":28}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":31}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":13}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":77}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":21}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":24}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":7}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":0}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":21}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":33}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":39}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":35}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":14}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":33}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":39}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":14}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":33}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":39}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":35}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":14}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":32}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":38}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":34}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":32}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":37}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":14}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":5}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":0}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":64}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":0}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":20}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":68}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":6}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":24}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":3}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":0}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":59}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":31}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":32}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":14}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":29}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":30}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":31}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":32}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":26}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":27}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":21}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":6}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":6}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":59}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":61}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":0}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":55}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":35}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":16}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":19}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":24}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":26}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":9}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":36}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":16}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":19}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":24}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":25}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":9}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":7}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":0}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":51}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":43}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":8}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":6}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":53}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":43}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":8}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":6}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":0}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":23}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":31}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":71}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":31}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":12}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":0}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":24}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":32}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":72}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":32}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":12}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":0}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":46}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":0}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":12}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":32}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":34}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":16}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":40}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":42}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":25}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":26}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":20}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":21}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":15}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":8}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":6}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":3}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":0}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":70}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":78}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":3}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":0}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":69}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":77}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":3}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":0}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":69}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":77}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":3}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":0}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":40}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":22}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":19}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":20}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":55}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":54}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":7}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":0}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":36}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":38}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":34}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":31}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":41}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":5}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":3}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":0}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":42}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":22}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":26}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":29}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":20}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":42}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":14}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":18}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":34}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":31}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":8}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":7}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":0}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":34}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":38}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":34}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":30}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":5}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":3}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":0}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":80}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":61}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":76}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":80}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":34}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":30}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":29}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":30}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":8}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":54}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":34}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":31}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":30}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":30}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":29}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":8}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":33}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":6}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":0}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":44}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":3}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":957,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":957,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":957,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":957,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/config/swagger.config.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/config/swagger.config.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":35}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":38}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":35}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":111}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":5}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":50}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":7}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":25}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":28}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":39}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":8}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":5}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":15}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":7}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":26}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":56}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":8}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":61}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":65}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":70}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":27}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":39}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":31}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":61}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":75}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":80}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":30}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":49}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":13}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":62}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":25}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":30}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":5}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":50}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":33}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":35}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":19}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":27}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":33}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":27}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":34}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":33}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":6}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":67}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":34}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":16}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":46}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":57}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":21}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":22}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":7}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":35}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":42}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":7}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":32}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":23}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":7}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":30}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":14}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":109}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":49}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":12}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":31}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":36}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":12}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":16}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":47}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":12}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":35}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":40}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":6}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":40}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":39}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":6}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":48}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":6}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":22}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":21}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":8}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":19}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":23}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":21}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":8}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":6}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":14}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":22}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":23}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":21}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":23}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":27}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":25}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":12}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":20}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":35}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":12}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":18}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":27}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":42}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":12}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":26}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":20}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":29}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":27}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":24}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":33}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":18}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":26}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":33}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":58}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":18}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":16}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":14}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":12}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":22}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":27}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":32}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":48}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":12}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":17}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":27}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":44}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":12}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":10}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":8}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":26}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":23}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":21}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":17}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":26}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":20}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":29}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":14}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":12}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":18}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":27}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":25}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":12}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":17}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":27}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":23}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":12}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":18}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":27}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":24}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":12}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":27}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":24}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":12}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":28}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":26}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":12}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":20}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":28}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":27}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":12}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":10}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":8}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":6}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":4}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":9}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":21}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":18}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":73}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":5}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":23}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":58}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":6}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":5}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":19}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":47}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":6}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":21}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":63}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":6}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":24}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":56}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":6}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":5}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":24}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":62}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":6}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":4}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":10}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":29}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":12}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":37}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":70}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":20}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":101}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":35}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":21}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":11}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":25}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":24}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":50}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":21}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":29}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":36}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":14}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":12}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":11}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":31}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":24}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":49}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":21}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":29}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":21}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":24}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":23}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":24}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":26}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":25}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":26}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":29}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":14}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":12}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":11}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":25}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":24}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":54}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":21}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":30}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":25}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":25}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":14}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":12}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":11}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":26}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":24}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":52}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":21}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":30}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":25}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":27}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":26}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":14}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":12}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":10}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":20}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":16}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":59}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":22}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":35}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":25}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":65}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":18}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":16}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":14}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":16}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":39}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":35}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":25}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":61}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":18}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":16}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":14}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":12}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":10}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":19}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":11}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":27}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":12}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":11}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":27}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":12}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":10}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":8}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":13}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":37}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":45}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":77}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":37}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":22}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":25}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":20}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":33}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":23}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":62}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":16}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":14}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":12}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":10}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":20}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":16}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":56}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":22}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":35}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":25}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":61}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":18}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":16}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":14}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":12}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":16}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":46}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":22}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":35}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":25}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":61}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":18}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":16}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":14}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":12}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":16}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":40}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":22}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":35}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":25}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":61}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":18}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":16}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":14}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":12}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":10}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":19}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":11}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":27}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":12}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":11}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":27}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":12}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":10}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":8}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":6}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":4}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":2}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":380,"column":2}},"locations":[{"start":{"line":1,"column":0},"end":{"line":380,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":380,"column":2}},"loc":{"start":{"line":1,"column":0},"end":{"line":380,"column":2}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/dto/create-listing.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/dto/create-listing.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":10}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":6}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":6}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":15}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":67}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":8}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":15}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":43}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":36}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":11}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":10}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":36}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":12}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":11}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":50}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":47}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":13}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":16}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":41}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":13}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":18}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":42}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":44}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":15}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":13}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":22}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":39}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":40}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":13}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":9}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":19}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":39}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":9}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":21}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":55}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":12}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":27}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":39}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":15}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":9}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":11}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":24}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":39}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":15}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":13}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":9}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":11}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":31}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":40}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":15}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":13}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":9}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":27}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":1}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":30}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":52}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":15}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":13}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":18}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":39}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":15}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":13}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":9}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":41}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":14}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":27}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":42}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":15}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":14}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":1}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":31}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":39}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":15}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":13}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":9}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":20}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":39}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":15}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":13}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":29}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":24}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":58}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":4}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":15}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":12}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":27}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":28}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":41}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":15}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":25}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":1}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":30}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":40}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":13}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":9}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":30}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":42}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":15}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":13}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":9}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":30}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":39}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":15}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":13}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":9}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":24}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":77}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":15}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":12}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":27}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":29}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":56}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":15}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":12}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":27}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":28}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":41}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":15}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":14}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":33}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":1}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":26}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":55}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":15}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":13}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":58}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":15}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":13}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":26}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":41}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":15}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":13}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":9}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":27}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":40}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":15}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":13}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":9}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":24}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":41}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":15}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":13}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":9}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":11}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":22}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":24}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":61}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":4}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":15}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":12}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":27}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":33}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":71}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":15}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":27}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":28}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":74}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":15}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":12}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":27}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":18}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":1}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":31}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":62}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":13}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":24}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":12}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":94}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":4}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":15}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":13}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":23}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":64}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":22}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":20}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":63}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":21}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":25}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":33}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":13}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":12}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":19}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":34}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":13}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":9}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":16}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":41}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":15}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":13}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":9}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":20}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":41}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":15}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":13}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":9}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":20}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":78}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":15}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":23}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":30}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":63}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":15}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":17}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":24}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":63}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":15}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":17}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":29}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":63}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":15}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":17}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":27}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":24}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":15}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":19}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":26}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":25}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":40}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":15}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":13}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":9}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":31}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":24}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":15}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":19}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":39}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":51}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":24}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":15}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":19}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":30}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":33}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":24}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":15}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":19}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":31}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":35}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":24}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":15}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":19}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":30}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":33}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":0}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":24}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":15}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":19}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":26}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":25}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":0}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":63}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":15}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":17}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":21}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":41}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":15}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":14}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":23}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":41}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":15}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":14}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":22}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":358,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":358,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":358,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":358,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/dto/execute-trade.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/dto/execute-trade.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":10}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":15}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":67}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":53}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":16}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":17}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":19}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":23}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":55}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":17}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":16}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":19}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":18}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":16}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":44}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":13}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":51}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":13}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":26}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":44}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":79}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":15}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":13}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":31}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":32}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":44}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":13}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":17}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":34}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":13}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":19}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":16}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":26}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":20}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":62}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":27}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":42}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":15}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":27}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":38}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":15}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":13}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":24}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":53}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":13}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":24}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":1}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":31}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":57}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":15}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":13}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":22}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":71}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":15}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":13}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":25}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":63}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":17}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":62}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":15}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":13}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":29}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":39}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":15}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":13}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":46}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":15}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":13}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":24}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":24}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":58}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":4}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":15}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":12}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":27}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":28}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":1}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":34}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":41}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":14}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":31}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":42}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":15}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":32}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":63}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":15}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":17}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":26}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":24}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":42}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":20}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":15}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":53}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":39}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":15}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":13}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":24}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":56}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":15}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":12}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":27}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":26}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":55}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":15}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":12}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":27}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":31}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":1}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":28}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":62}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":15}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":27}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":28}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":41}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":15}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":14}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":31}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":41}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":15}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":14}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":36}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":41}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":15}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":14}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":29}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":0}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":24}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":15}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":12}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":31}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":17}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":16}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":22}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":24}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":5}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":1}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":27}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":52}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":13}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":13}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":52}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":13}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":15}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":65}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":13}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":22}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":55}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":17}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":18}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":63}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":15}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":17}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":25}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":24}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":60}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":25}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":4}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":15}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":60}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":62}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":52}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":15}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":13}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":22}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":54}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":15}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":12}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":27}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":26}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":1}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":30}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":44}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":13}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":16}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":72}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":15}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":20}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":19}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":41}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":15}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":13}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":9}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":9}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":30}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":41}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":15}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":13}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":9}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":22}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":41}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":15}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":13}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":9}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":21}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":40}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":15}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":13}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":9}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":24}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":0}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":24}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":15}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":19}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":33}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":39}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":24}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":15}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":19}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":32}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":37}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":24}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":15}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":19}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":31}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":35}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":0}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":24}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":15}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":19}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":34}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":41}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":24}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":15}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":19}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":28}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":29}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":24}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":15}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":12}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":33}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":27}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":30}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":24}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":68}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":4}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":15}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":13}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":17}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":0}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":59}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":15}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":12}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":27}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":16}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":41}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":15}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":14}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":31}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":345,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":345,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":345,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":345,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/dto/place-bid.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/dto/place-bid.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":10}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":15}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":67}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":49}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":63}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":15}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":15}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":22}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":44}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":15}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":26}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":40}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":15}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":9}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":38}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":15}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":9}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":30}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":52}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":13}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":18}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":51}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":15}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":22}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":39}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":13}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":9}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":11}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":41}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":14}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":27}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":39}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":13}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":9}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":37}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":15}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":9}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":11}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":26}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":55}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":12}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":27}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":28}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":41}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":15}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":28}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":41}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":15}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":14}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":31}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":39}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":15}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":13}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":9}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":26}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":46}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":13}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":24}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":62}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":15}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":12}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":28}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":61}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":15}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":27}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":29}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":1}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":26}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":55}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":15}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":13}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":18}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":24}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":48}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":20}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":48}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":51}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":39}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":15}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":13}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":9}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":11}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":22}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":24}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":13}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":22}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":24}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":23}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":4}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":76}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":15}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":12}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":27}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":34}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":1}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":26}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":48}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":13}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":32}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":13}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":12}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":35}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":13}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":9}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":68}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":18}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":17}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":76}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":4}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":15}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":13}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":24}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":15}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":19}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":31}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":35}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":0}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":24}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":15}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":19}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":30}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":33}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":24}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":15}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":37}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":47}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":0}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":24}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":15}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":19}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":33}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":39}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":24}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":15}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":26}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":25}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":63}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":15}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":17}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":21}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":41}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":15}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":14}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":23}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":40}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":15}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":13}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":9}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":9}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":31}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":241,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":241,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":241,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":241,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/dto/update-listing.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/dto/update-listing.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":56}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":70}}},"s":{"0":0,"1":0,"2":0,"3":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":70}},"locations":[{"start":{"line":1,"column":0},"end":{"line":4,"column":70}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":4,"column":70}},"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":70}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/entities/bid.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/entities/bid.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":69}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":23}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":22}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":1}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":33}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":20}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":19}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":55}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":54}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":70}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":22}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":11}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":31}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":11}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":17}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":30}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":43}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":19}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":43}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":18}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":24}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":24}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":24}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":6}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":28}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":26}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":43}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":17}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":20}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":24}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":28}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":25}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":43}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":24}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":30}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":30}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":33}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":4}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":43}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":20}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":28}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":30}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":43}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":20}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":53}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":22}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":26}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":25}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":6}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":4}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":70}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":22}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":70}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":32}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":70}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":28}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":70}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":24}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":55}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":26}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":54}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":25}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":53}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":24}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":52}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":50}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":22}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":11}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":34}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":13}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":19}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":4}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":31}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":67}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":19}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":69}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":21}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":68}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":20}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":68}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":20}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":69}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":21}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":33}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":20}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":49}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":21}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":51}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":23}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":43}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":21}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":20}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":20}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":20}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":31}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":26}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":43}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":14}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":23}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":26}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":33}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":26}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":22}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":20}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":27}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":7}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":28}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":22}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":7}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":4}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":0}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":43}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":18}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":43}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":18}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":62}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":24}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":4}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":37}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":25}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":0}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":43}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":42}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":20}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":43}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":41}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":220,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":220,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":220,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":220,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/entities/energy-listing.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/entities/energy-listing.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":12}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":13}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":17}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":25}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":14}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":24}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":16}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":28}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":20}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":20}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":22}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":26}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":1}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":26}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":43}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":11}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":4}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":11}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":21}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":4}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":25}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":55}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":54}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":16}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":70}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":20}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":70}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":11}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":17}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":34}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":11}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":17}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":23}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":35}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":29}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":47}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":22}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":47}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":27}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":47}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":25}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":43}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":13}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":21}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":22}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":18}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":20}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":4}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":70}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":31}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":43}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":21}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":23}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":29}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":26}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":33}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":29}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":4}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":43}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":17}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":20}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":29}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":29}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":4}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":43}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":18}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":22}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":31}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":30}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":4}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":43}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":32}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":32}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":26}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":31}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":30}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":35}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":4}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":43}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":13}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":20}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":28}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":29}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":26}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":24}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":35}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":30}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":20}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":4}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":48}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":20}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":47}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":33}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":20}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":49}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":67}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":19}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":66}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":69}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":21}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":45}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":20}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":44}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":19}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":50}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":22}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":50}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":22}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":49}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":21}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":11}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":29}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":20}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":17}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":13}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":17}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":4}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":26}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":11}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":24}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":20}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":17}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":13}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":19}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":4}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":22}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":43}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":14}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":19}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":20}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":20}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":28}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":25}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":18}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":18}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":18}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":6}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":4}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":43}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":18}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":43}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":18}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":45}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":14}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":51}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":18}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":241,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":241,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":241,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":241,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/entities/trade.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/entities/trade.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":56}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":35}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":22}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":26}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":24}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":24}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":44}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":20}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":26}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":33}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":13}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":33}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":29}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":31}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":18}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":32}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":55}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":19}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":54}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":16}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":55}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":22}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":70}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":22}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":71}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":11}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":22}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":33}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":22}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":20}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":32}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":4}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":18}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":11}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":17}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":24}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":35}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":4}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":31}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":11}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":17}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":25}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":36}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":4}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":70}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":30}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":70}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":22}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":70}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":21}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":70}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":24}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":43}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":20}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":22}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":23}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":24}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":22}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":19}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":22}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":25}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":6}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":23}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":21}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":18}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":16}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":6}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":21}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":33}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":43}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":19}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":19}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":28}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":28}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":29}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":7}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":29}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":26}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":26}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":4}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":43}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":24}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":25}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":27}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":27}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":31}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":28}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":26}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":30}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":4}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":43}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":21}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":32}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":34}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":55}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":28}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":33}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":4}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":43}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":15}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":29}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":32}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":37}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":30}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":32}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":19}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":18}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":24}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":24}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":7}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":4}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":43}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":21}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":15}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":17}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":24}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":18}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":25}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":63}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":24}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":28}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":43}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":19}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":54}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":26}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":35}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":31}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":29}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":31}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":4}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":43}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":13}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":20}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":53}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":22}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":20}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":21}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":25}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":19}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":18}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":19}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":7}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":4}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":69}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":21}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":69}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":21}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":69}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":21}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":68}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":20}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":68}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":20}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":78}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":29}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":77}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":28}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":33}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":20}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":49}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":21}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":51}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":23}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":51}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":23}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":50}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":22}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":0}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":43}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":21}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":20}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":19}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":20}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":20}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":33}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":28}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":18}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":5}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":43}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":14}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":27}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":35}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":26}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":34}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":20}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":19}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":26}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":24}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":24}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":7}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":26}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":30}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":27}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":33}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":28}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":6}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":4}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":50}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":22}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":0}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":53}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":25}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":57}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":29}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":11}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":18}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":13}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":19}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":4}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":24}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":11}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":27}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":20}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":18}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":13}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":19}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":4}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":25}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":11}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":25}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":20}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":18}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":13}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":19}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":4}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":23}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":43}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":18}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":43}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":18}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":64}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":24}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":4}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":37}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":25}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":48}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":33}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":11}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":349,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":349,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":349,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":349,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/filters/http-exception.filter.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/filters/http-exception.filter.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":18}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":8}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":16}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":13}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":9}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":24}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":44}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":47}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":61}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":65}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":63}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":56}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":36}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":49}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":46}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":41}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":54}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":79}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":42}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":24}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":29}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":60}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":6}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":78}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":23}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":8}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":80}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":79}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":47}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":35}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":56}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":27}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":28}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":10}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":44}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":41}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":35}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":8}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":53}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":48}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":3}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":21}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":23}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":49}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":57}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":60}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":13}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":9}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":16}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":13}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":24}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":42}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":6}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":39}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":59}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":31}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":32}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":9}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":46}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":58}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":19}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":32}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":9}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":12}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":59}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":19}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":32}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":9}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":104,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":104,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":104,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":104,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/energy/guards/auth.guard.ts": {"path":"/workspaces/CurrentDao-backend/src/energy/guards/auth.guard.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":47}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":46}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":51}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":56}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":55}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":5}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":9}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":46}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":18}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":5}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":68}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":74}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":49}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":43}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":12}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":32}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":32}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":6}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":37,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":37,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":37,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":37,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/forecasting/market-forecasting.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/market-forecasting.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":6}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":7}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":13}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":24}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":10}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":15}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":11}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":11}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":25}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":79}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":8}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":17}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":17}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":38}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":14}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":45}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":8}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":15}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":47}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":8}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":18}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":21}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":47}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":8}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":17}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":17}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":45}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":66}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":30}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":42}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":73}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":14}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":58}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":60}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":72}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":68}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":68}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":56}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":79}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":74}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":25}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":36}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":30}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":9}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":22}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":92}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":8}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":43}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":65}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":51}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":45}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":38}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":16}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":31}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":15}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":18}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":8}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":35}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":47}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":34}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":12}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":35}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":25}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":77}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":9}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":7}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":35}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":32}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":44}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":43}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":10}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":7}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":52}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":62}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":58}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":8}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":26}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":62}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":30}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":55}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":41}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":8}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":58}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":16}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":60}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":4}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":33}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":73}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":30}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":37}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":78}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":65}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":68}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":61}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":46}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":30}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":32}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":54}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":21}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":80}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":8}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":70}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":23}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":30}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":8}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":21}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":71}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":30}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":64}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":41}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":8}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":28}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":63}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":79}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":36}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":30}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":65}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":31}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":16}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":31}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":15}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":18}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":8}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":64}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":23}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":30}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":24}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":8}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":21}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":62}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":30}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":55}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":41}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":8}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":3}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":27}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":53}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":16}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":16}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":59}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":4}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":21}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":36}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":31}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":9}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":65}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":68}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":61}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":66}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":23}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":20}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":21}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":8}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":21}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":58}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":30}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":51}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":41}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":8}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":5}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":3}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":25}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":56}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":78}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":30}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":11}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":11}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":30}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":53}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":6}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":30}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":9}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":66}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":69}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":24}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":29}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":8}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":21}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":68}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":30}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":61}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":41}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":8}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":5}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":3}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":30}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":56}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":80}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":26}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":36}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":36}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":9}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":65}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":65}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":23}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":8}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":21}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":63}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":30}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":56}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":41}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":8}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":5}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":20}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":59}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":65}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":66}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":16}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":16}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":54}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":4}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":28}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":44}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":45}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":19}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":9}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":59}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":19}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":29}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":67}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":23}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":8}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":21}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":65}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":30}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":58}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":41}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":8}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":27}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":61}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":63}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":65}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":63}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":16}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":16}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":55}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":4}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":31}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":40}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":43}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":39}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":29}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":9}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":33}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":66}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":19}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":30}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":28}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":10}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":14}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":23}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":68}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":25}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":7}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":21}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":61}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":30}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":54}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":41}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":8}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":5}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":3}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":26}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":66}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":62}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":65}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":63}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":16}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":16}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":56}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":4}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":30}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":43}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":43}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":39}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":28}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":9}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":33}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":35}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":79}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":14}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":79}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":7}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":21}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":68}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":30}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":61}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":41}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":8}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":3}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":16}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":64}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":77}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":25}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":17}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":24}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":26}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":7}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":12}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":7}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":22}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":20}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":87}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":70}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":8}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":7}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":37}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":20}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":70}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":67}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":8}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":7}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":21}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":20}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":82}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":74}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":8}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":7}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":24}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":20}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":75}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":75}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":8}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":6}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":3}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":18}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":63}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":79}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":27}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":18}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":18}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":24}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":7}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":12}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":7}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":20}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":24}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":80}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":8}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":7}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":20}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":25}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":64}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":8}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":7}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":21}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":26}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":65}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":8}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":7}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":20}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":24}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":66}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":8}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":7}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":20}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":25}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":65}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":8}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":7}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":20}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":26}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":65}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":8}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":7}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":20}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":26}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":64}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":8}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":7}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":20}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":24}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":62}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":8}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":6}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":3}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":0}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":21}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":61}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":65}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":16}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":16}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":62}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":4}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":28}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":44}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":19}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":9}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":59}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":19}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":29}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":74}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":34}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":0}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":35}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":13}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":69}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":27}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":18}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":12}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":39}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":25}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":27}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":66}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":12}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":62}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":9}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":7}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":0}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":25}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":21}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":66}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":30}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":59}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":41}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":8}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":5}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":3}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":0}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":19}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":34}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":28}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":32}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":28}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":38}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":68}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":38}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":27}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":91}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":0}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":42}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":82}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":28}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":28}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":47}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":46}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":0}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":17}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":18}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":14}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":52}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":19}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":39}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":25}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":10}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":9}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":5}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":0}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":16}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":3}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":0}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":40}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":28}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":29}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":28}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":24}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":35}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":27}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":0}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":33}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":76}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":0}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":17}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":18}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":45}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":42}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":38}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":43}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":42}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":44}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":43}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":40}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":36}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":49}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":9}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":5}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":0}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":16}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":3}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":0}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":32}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":28}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":30}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":28}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":25}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":65}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":12}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":7}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":42}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":41}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":44}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":44}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":55}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":52}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":52}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":53}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":59}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":50}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":8}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":6}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":3}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":0}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":25}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":27}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":18}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":29}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":30}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":20}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":19}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":73}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":34}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":73}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":15}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":18}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":10}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":18}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":72}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":21}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":75}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":14}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":51}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":5}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":3}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":592,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":592,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":592,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":592,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/forecasting/market-forecasting.module.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/market-forecasting.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":43}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":48}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":46}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":55}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":63}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":65}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":73}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":81}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":79}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":77}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":78}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":15}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":44}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":45}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":4}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":45}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":14}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":29}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":27}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":12}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":29}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":27}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":2}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":39}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":36,"column":39}},"locations":[{"start":{"line":1,"column":0},"end":{"line":36,"column":39}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":36,"column":39}},"loc":{"start":{"line":1,"column":0},"end":{"line":36,"column":39}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/forecasting/analysis/economic-indicator.service.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/analysis/economic-indicator.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":44}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":38}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":36}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":16}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":18}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":17}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":1}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":31}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":23}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":31}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":29}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":29}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":20}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":17}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":48}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":42}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":39}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":70}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":57}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":74}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":59}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":26}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":20}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":35}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":9}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":44}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":29}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":64}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":11}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":53}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":39}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":71}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":67}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":32}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":14}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":12}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":10}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":8}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":60}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":20}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":42}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":29}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":38}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":21}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":59}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":61}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":26}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":18}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":35}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":9}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":44}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":29}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":64}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":59}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":39}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":71}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":67}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":32}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":14}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":12}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":10}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":8}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":60}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":26}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":42}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":38}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":15}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":10}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":21}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":65}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":67}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":28}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":35}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":9}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":44}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":29}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":64}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":11}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":21}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":62}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":39}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":71}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":67}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":14}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":10}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":8}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":60}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":29}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":42}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":24}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":38}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":23}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":15}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":21}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":68}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":70}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":5}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":3}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":28}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":26}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":20}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":18}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":35}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":9}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":44}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":29}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":64}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":11}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":21}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":62}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":39}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":71}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":67}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":32}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":14}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":12}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":10}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":8}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":60}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":30}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":42}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":24}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":38}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":23}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":15}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":21}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":69}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":70}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":5}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":24}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":26}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":20}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":18}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":35}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":9}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":44}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":44}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":67}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":19}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":37}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":49}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":44}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":12}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":11}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":8}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":49}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":14}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":9}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":52}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":22}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":32}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":34}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":17}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":10}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":8}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":21}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":64}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":66}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":5}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":3}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":75}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":31}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":33}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":50}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":11}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":14}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":20}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":23}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":23}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":27}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":50}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":56}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":59}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":59}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":55}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":7}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":12}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":40}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":52}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":58}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":58}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":63}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":59}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":59}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":45}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":58}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":55}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":6}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":30}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":79}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":30}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":39}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":17}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":18}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":23}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":45}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":50}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":27}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":8}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":56}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":71}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":27}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":7}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":23}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":18}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":29}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":45}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":49}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":33}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":8}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":68}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":77}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":29}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":7}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":27}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":18}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":33}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":45}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":49}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":36}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":8}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":74}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":72}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":29}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":7}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":26}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":18}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":32}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":45}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":50}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":36}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":8}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":74}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":76}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":29}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":7}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":0}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":27}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":18}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":33}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":45}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":49}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":36}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":8}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":73}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":76}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":27}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":7}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":19}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":3}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":30}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":33}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":38}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":46}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":56}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":24}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":12}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":18}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":21}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":21}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":29}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":27}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":27}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":20}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":21}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":25}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":6}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":39}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":38}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":50}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":8}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":56}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":7}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":18}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":3}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":50}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":47}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":16}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":29}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":19}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":23}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":20}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":6}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":38}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":3}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":56}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":47}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":21}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":31}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":28}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":28}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":28}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":6}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":43}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":59}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":47}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":19}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":25}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":24}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":28}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":28}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":6}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":41}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":3}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":59}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":47}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":21}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":18}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":20}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":25}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":25}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":6}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":43}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":3}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":51}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":47}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":30}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":32}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":17}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":17}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":17}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":6}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":39}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":3}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":67}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":79}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":3}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":0}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":66}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":58}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":23}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":54}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":54}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":65}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":61}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":61}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":0}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":46}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":34}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":60}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":6}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":59}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":3}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":0}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":51}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":51}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":46}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":65}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":3}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":0}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":63}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":68}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":34}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":39}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":3}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":61}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":75}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":38}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":37}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":69}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":48}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":45}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":48}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":3}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":0}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":61}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":50}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":42}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":41}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":3}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":0}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":19}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":20}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":21}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":45}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":49}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":41}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":42}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":20}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":3}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":0}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":54}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":49}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":31}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":28}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":58}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":59}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":67}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":63}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":0}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":72}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":48}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":0}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":33}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":3}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":0}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":35}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":25}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":19}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":20}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":18}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":26}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":41}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":40}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":0}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":32}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":17}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":20}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":44}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":29}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":37}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":23}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":15}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":9}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":47}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":5}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":0}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":16}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":3}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":0}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":31}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":19}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":20}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":18}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":26}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":41}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":40}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":0}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":32}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":17}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":26}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":37}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":24}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":37}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":23}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":15}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":9}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":47}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":5}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":0}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":16}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":3}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":0}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":34}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":19}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":20}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":18}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":26}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":41}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":40}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":0}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":32}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":17}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":29}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":37}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":24}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":37}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":23}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":15}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":9}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":47}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":5}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":0}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":16}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":3}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":0}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":34}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":19}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":20}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":18}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":26}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":41}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":40}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":0}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":32}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":17}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":30}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":37}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":24}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":37}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":23}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":15}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":9}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":47}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":5}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":0}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":16}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":3}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":0}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":30}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":19}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":20}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":18}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":26}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":41}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":40}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":0}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":32}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":17}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":30}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":39}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":20}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":37}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":23}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":15}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":9}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":47}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":5}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":0}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":16}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":3}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":0}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":49}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":36}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":3}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":0}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":47}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":35}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":3}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":0}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":47}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":35}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":3}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":0}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":40}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":43}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":3}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":0}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":45}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":35}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":3}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":617,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":617,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":617,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":617,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/forecasting/dto/forecast-query.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/dto/forecast-query.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":15}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":13}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":10}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":6}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":6}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":41}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":67}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":31}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":21}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":35}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":15}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":17}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":9}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":9}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":15}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":34}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":12}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":15}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":20}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":9}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":12}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":15}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":29}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":37}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":21}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":17}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":13}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":9}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":13}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":24}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":32}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":12}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":27}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":12}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":21}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":13}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":11}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":11}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":15}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":36}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":13}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":15}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":45}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":37}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":36}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":13}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":17}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":17}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":18}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":12}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":27}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":15}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":27}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":18}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":15}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":16}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":20}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":4}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":35}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":12}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":27}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":23}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":20}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":18}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":13}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":29}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":120,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":120,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":120,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":120,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/forecasting/ensemble/ensemble-methods.service.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/ensemble/ensemble-methods.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":20}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":17}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":17}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":39}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":67}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":70}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":67}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":33}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":30}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":52}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":61}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":33}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":27}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":40}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":42}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":20}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":13}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":21}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":4}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":35}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":19}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":14}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":15}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":19}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":22}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":1}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":37}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":68}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":71}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":27}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":27}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":32}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":34}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":30}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":9}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":38}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":73}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":13}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":16}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":22}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":20}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":21}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":8}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":45}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":24}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":68}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":7}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":53}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":57}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":28}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":15}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":8}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":56}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":28}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":16}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":42}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":8}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":35}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":69}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":58}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":28}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":25}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":8}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":58}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":28}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":16}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":8}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":14}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":35}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":28}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":33}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":23}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":19}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":52}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":43}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":66}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":72}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":10}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":8}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":21}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":69}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":27}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":29}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":30}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":34}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":30}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":34}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":72}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":49}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":51}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":38}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":58}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":18}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":16}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":24}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":8}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":38}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":89}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":34}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":59}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":74}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":8}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":14}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":31}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":16}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":32}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":33}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":40}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":8}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":21}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":62}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":18}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":24}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":27}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":29}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":21}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":30}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":30}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":54}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":46}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":34}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":63}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":50}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":66}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":24}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":18}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":47}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":10}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":58}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":7}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":38}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":32}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":61}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":14}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":37}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":48}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":76}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":63}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":68}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":74}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":19}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":28}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":35}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":65}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":71}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":10}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":8}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":21}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":68}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":18}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":3}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":25}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":27}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":29}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":31}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":30}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":9}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":34}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":52}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":40}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":47}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":38}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":66}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":22}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":18}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":47}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":10}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":30}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":50}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":22}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":35}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":10}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":49}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":69}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":56}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":61}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":7}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":38}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":55}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":25}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":21}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":8}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":32}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":46}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":68}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":61}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":79}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":53}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":27}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":23}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":10}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":29}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":36}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":63}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":69}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":10}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":8}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":21}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":69}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":18}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":5}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":3}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":25}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":27}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":29}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":25}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":33}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":30}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":9}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":37}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":61}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":42}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":39}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":61}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":33}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":37}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":35}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":69}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":20}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":18}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":21}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":10}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":0}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":50}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":69}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":19}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":18}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":21}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":10}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":45}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":68}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":86}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":58}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":7}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":25}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":51}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":21}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":20}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":18}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":8}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":41}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":72}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":13}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":16}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":19}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":8}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":48}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":27}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":25}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":16}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":8}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":0}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":14}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":32}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":48}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":76}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":63}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":61}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":29}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":24}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":10}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":53}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":29}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":27}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":10}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":19}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":29}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":40}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":65}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":71}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":10}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":8}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":21}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":69}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":18}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":5}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":3}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":36}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":38}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":33}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":14}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":28}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":27}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":24}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":24}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":6}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":9}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":41}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":16}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":29}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":28}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":25}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":25}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":10}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":7}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":45}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":45}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":8}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":50}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":42}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":8}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":77}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":0}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":29}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":74}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":35}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":60}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":31}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":31}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":78}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":56}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":25}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":78}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":0}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":62}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":52}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":24}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":19}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":8}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":14}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":24}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":46}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":20}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":20}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":8}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":21}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":74}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":18}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":5}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":3}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":44}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":27}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":29}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":21}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":32}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":34}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":32}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":43}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":33}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":11}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":37}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":0}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":24}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":23}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":66}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":19}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":22}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":14}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":18}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":38}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":22}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":72}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":21}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":24}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":16}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":18}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":22}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":80}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":18}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":25}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":68}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":19}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":22}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":14}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":18}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":18}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":66}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":21}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":9}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":0}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":59}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":42}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":58}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":21}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":24}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":25}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":12}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":9}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":0}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":33}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":23}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":26}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":60}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":16}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":10}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":7}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":5}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":0}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":21}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":3}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":0}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":42}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":29}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":32}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":34}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":21}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":23}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":0}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":22}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":33}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":50}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":21}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":66}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":29}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":67}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":31}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":5}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":0}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":23}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":34}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":67}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":88}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":30}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":5}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":0}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":12}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":18}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":65}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":25}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":12}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":61}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":8}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":6}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":3}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":0}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":40}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":32}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":27}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":38}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":71}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":29}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":49}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":42}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":52}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":9}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":21}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":5}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":0}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":42}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":76}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":47}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":0}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":37}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":66}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":7}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":0}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":19}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":3}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":0}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":30}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":32}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":36}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":19}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":21}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":21}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":22}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":56}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":22}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":46}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":20}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":44}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":14}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":56}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":5}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":3}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":0}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":26}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":32}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":36}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":21}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":33}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":14}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":26}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":51}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":20}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":26}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":42}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":19}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":37}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":24}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":22}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":10}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":8}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":5}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":0}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":26}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":29}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":24}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":0}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":37}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":50}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":56}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":53}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":28}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":7}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":0}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":28}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":35}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":21}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":65}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":25}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":24}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":77}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":22}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":5}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":0}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":54}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":60}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":0}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":46}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":58}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":52}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":39}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":0}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":12}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":36}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":27}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":45}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":45}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":8}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":33}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":24}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":36}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":17}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":35}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":37}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":17}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":8}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":6}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":3}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":0}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":71}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":33}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":14}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":26}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":51}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":20}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":35}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":42}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":8}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":5}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":0}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":40}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":48}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":52}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":6}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":0}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":35}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":63}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":56}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":0}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":33}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":23}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":75}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":0}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":12}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":24}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":28}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":33}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":17}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":34}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":37}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":8}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":6}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":3}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":0}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":69}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":33}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":14}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":26}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":51}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":20}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":33}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":42}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":8}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":5}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":0}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":30}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":48}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":40}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":6}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":0}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":56}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":26}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":24}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":0}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":50}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":63}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":56}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":28}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":7}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":0}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":54}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":23}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":75}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":0}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":12}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":36}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":27}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":36}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":36}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":8}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":28}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":31}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":36}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":17}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":32}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":37}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":8}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":6}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":3}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":0}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":67}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":39}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":0}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":58}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":52}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":75}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":0}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":44}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":38}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":3}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":0}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":34}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":42}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":37}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":13}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":43}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":15}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":5}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":0}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":30}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":73}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":33}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":56}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":0}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":34}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":15}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":5}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":0}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":20}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":8}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":64}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":6}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":3}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":0}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":38}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":32}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":36}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":13}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":46}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":61}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":8}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":6}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":78}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":0}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":66}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":3}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":0}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":67}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":39}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":0}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":58}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":75}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":52}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":0}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":50}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":53}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":3}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":0}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":74}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":58}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":42}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":3}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":0}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":55}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":38}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":0}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":75}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":20}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":69}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":20}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":0}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":20}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":3}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":0}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":31}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":32}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":37}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":29}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":21}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":34}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":48}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":0}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":33}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":11}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":45}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":64}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":20}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":18}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":18}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":10}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":0}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":44}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":0}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":40}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":53}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":77}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":0}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":46}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":51}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":26}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":46}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":63}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":40}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":48}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":45}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":10}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":56}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":0}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":27}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":16}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":19}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":14}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":15}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":15}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":15}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":19}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":22}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":11}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":23}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":70}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":7}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":5}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":0}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":24}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":3}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":0}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":27}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":37}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":18}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":15}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":23}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":46}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":22}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":27}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":3}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":0}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":42}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":37}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":15}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":79}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":63}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":3}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":0}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":75}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":47}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":43}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":66}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":44}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":5}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":30}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":62}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":6}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":3}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":0}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":38}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":32}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":21}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":58}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":75}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":52}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":23}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":75}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":0}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":12}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":27}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":27}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":49}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":49}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":8}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":28}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":34}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":36}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":17}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":40}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":17}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":8}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":6}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":3}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":0}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":36}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":32}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":29}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":47}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":40}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":55}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":7}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":19}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":3}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":0}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":43}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":32}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":13}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":33}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":75}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":28}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":75}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":0}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":20}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":8}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":73}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":6}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":3}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":0}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":77}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":80}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":3}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":0}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":29}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":27}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":29}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":15}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":62}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":3}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":0}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":28}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":27}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":24}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":23}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":51}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":61}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":32}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":11}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":74}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":8}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":3}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":0}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":32}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":32}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":22}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":21}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":43}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":57}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":8}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":6}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":63}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":23}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":75}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":0}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":12}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":50}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":27}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":52}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":52}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":8}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":28}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":32}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":36}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":17}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":27}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":37}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":8}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":6}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":3}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":0}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":26}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":21}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":22}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":29}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":49}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":34}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":41}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":7}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":21}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":3}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":0}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":80}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":39}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":0}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":48}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":66}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":0}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":71}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":3}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":0}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":38}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":32}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":22}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":13}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":46}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":51}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":8}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":6}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":63}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":66}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":3}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":0}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":37}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":27}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":21}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":65}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":77}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":9}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":56}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":0}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":40}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":38}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":77}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":0}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":52}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":76}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":0}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":34}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":5}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":0}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":17}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":3}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":0}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":25}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":25}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":22}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":19}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":15}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":21}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":20}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":61}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":19}},"1004":{"start":{"line":1005,"column":0},"end":{"line":1005,"column":60}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":19}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":60}},"1007":{"start":{"line":1008,"column":0},"end":{"line":1008,"column":14}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":61}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":5}},"1010":{"start":{"line":1011,"column":0},"end":{"line":1011,"column":3}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":0}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":32}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":25}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":22}},"1015":{"start":{"line":1016,"column":0},"end":{"line":1016,"column":15}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":35}},"1017":{"start":{"line":1018,"column":0},"end":{"line":1018,"column":43}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":30}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":28}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":0}},"1021":{"start":{"line":1022,"column":0},"end":{"line":1022,"column":70}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":65}},"1023":{"start":{"line":1024,"column":0},"end":{"line":1024,"column":0}},"1024":{"start":{"line":1025,"column":0},"end":{"line":1025,"column":38}},"1025":{"start":{"line":1026,"column":0},"end":{"line":1026,"column":74}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":8}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":6}},"1028":{"start":{"line":1029,"column":0},"end":{"line":1029,"column":40}},"1029":{"start":{"line":1030,"column":0},"end":{"line":1030,"column":55}},"1030":{"start":{"line":1031,"column":0},"end":{"line":1031,"column":8}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":6}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":0}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":66}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":53}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":0}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":30}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":3}},"1038":{"start":{"line":1039,"column":0},"end":{"line":1039,"column":0}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":31}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":25}},"1041":{"start":{"line":1042,"column":0},"end":{"line":1042,"column":22}},"1042":{"start":{"line":1043,"column":0},"end":{"line":1043,"column":15}},"1043":{"start":{"line":1044,"column":0},"end":{"line":1044,"column":34}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":66}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":22}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":47}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":3}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":0}},"1049":{"start":{"line":1050,"column":0},"end":{"line":1050,"column":31}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":25}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":22}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":15}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":34}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":66}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":22}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":79}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":3}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":0}},"1059":{"start":{"line":1060,"column":0},"end":{"line":1060,"column":25}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":32}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":22}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":29}},"1063":{"start":{"line":1064,"column":0},"end":{"line":1064,"column":21}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":60}},"1065":{"start":{"line":1066,"column":0},"end":{"line":1066,"column":68}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":0}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":23}},"1068":{"start":{"line":1069,"column":0},"end":{"line":1069,"column":75}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":0}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":12}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":33}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":27}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":33}},"1074":{"start":{"line":1075,"column":0},"end":{"line":1075,"column":33}},"1075":{"start":{"line":1076,"column":0},"end":{"line":1076,"column":8}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":28}},"1077":{"start":{"line":1078,"column":0},"end":{"line":1078,"column":33}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":14}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":17}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":27}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":16}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":8}},"1083":{"start":{"line":1084,"column":0},"end":{"line":1084,"column":6}},"1084":{"start":{"line":1085,"column":0},"end":{"line":1085,"column":3}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":0}},"1086":{"start":{"line":1087,"column":0},"end":{"line":1087,"column":42}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":36}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":33}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":13}},"1090":{"start":{"line":1091,"column":0},"end":{"line":1091,"column":27}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":61}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":27}},"1093":{"start":{"line":1094,"column":0},"end":{"line":1094,"column":20}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":8}},"1095":{"start":{"line":1096,"column":0},"end":{"line":1096,"column":66}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":6}},"1097":{"start":{"line":1098,"column":0},"end":{"line":1098,"column":3}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":0}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":38}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":36}},"1101":{"start":{"line":1102,"column":0},"end":{"line":1102,"column":22}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":13}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":27}},"1104":{"start":{"line":1105,"column":0},"end":{"line":1105,"column":61}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":27}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":38}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":49}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":6}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":57}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":3}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":0}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":31}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":38}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":33}},"1115":{"start":{"line":1116,"column":0},"end":{"line":1116,"column":13}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":67}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":65}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":71}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":0}},"1120":{"start":{"line":1121,"column":0},"end":{"line":1121,"column":62}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":3}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":0}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":66}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":58}},"1125":{"start":{"line":1126,"column":0},"end":{"line":1126,"column":0}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":23}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":54}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":54}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":65}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":61}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":61}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":0}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":46}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":34}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":60}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":6}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":0}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":59}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":3}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":14,"52":14,"53":14,"54":14,"55":14,"56":14,"57":14,"58":14,"59":14,"60":14,"61":14,"62":14,"63":14,"64":14,"65":14,"66":14,"67":14,"68":1,"69":1,"70":1,"71":1,"72":13,"73":13,"74":13,"75":13,"76":13,"77":13,"78":13,"79":13,"80":13,"81":13,"82":13,"83":14,"84":14,"85":14,"86":14,"87":14,"88":14,"89":14,"90":14,"91":14,"92":14,"93":14,"94":14,"95":14,"96":14,"97":14,"98":14,"99":14,"100":14,"101":14,"102":14,"103":14,"104":14,"105":14,"106":14,"107":14,"108":14,"109":14,"110":14,"111":14,"112":1,"113":1,"114":1,"115":14,"116":1,"117":1,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"133":2,"134":2,"135":2,"136":2,"137":2,"138":2,"139":2,"140":2,"141":2,"142":2,"143":2,"144":2,"145":2,"146":2,"147":2,"148":2,"149":2,"150":2,"151":2,"152":2,"153":0,"154":0,"155":0,"156":2,"157":1,"158":1,"159":2,"160":2,"161":2,"162":2,"163":2,"164":2,"165":2,"166":2,"167":2,"168":8,"169":8,"170":8,"171":8,"172":8,"173":8,"174":8,"175":8,"176":8,"177":8,"178":8,"179":8,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"187":2,"188":2,"189":2,"190":2,"191":2,"192":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"200":2,"201":0,"202":0,"203":0,"204":2,"205":1,"206":1,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":1,"267":1,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":1,"348":1,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"355":2,"356":2,"357":2,"358":2,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":2,"400":0,"401":0,"402":0,"403":2,"404":1,"405":1,"406":24,"407":24,"408":24,"409":24,"410":24,"411":24,"412":24,"413":24,"414":24,"415":36,"416":36,"417":36,"418":36,"419":36,"420":16,"421":16,"422":16,"423":16,"424":12,"425":36,"426":8,"427":8,"428":8,"429":8,"430":8,"431":5,"432":36,"433":8,"434":5,"435":36,"436":2,"437":2,"438":2,"439":2,"440":2,"441":36,"442":2,"443":2,"444":36,"445":24,"446":24,"447":36,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":24,"455":24,"456":36,"457":10,"458":10,"459":10,"460":10,"461":10,"462":36,"463":24,"464":24,"465":24,"466":1,"467":1,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":1,"501":1,"502":13,"503":13,"504":13,"505":13,"506":1,"507":1,"508":1,"509":3,"510":1,"511":1,"512":1,"513":12,"514":12,"515":12,"516":12,"517":12,"518":12,"519":19,"520":12,"521":12,"522":12,"523":12,"524":1,"525":1,"526":13,"527":13,"528":13,"529":13,"530":13,"531":13,"532":11,"533":13,"534":1,"535":13,"536":1,"537":13,"538":0,"539":13,"540":13,"541":1,"542":1,"543":11,"544":11,"545":11,"546":11,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":11,"561":11,"562":11,"563":11,"564":11,"565":11,"566":16,"567":16,"568":16,"569":16,"570":11,"571":11,"572":11,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":11,"582":11,"583":11,"584":11,"585":11,"586":11,"587":11,"588":11,"589":11,"590":11,"591":11,"592":11,"593":11,"594":11,"595":11,"596":11,"597":11,"598":11,"599":11,"600":11,"601":11,"602":11,"603":11,"604":11,"605":11,"606":1,"607":1,"608":1,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":1,"618":1,"619":1,"620":1,"621":1,"622":1,"623":1,"624":1,"625":1,"626":1,"627":1,"628":1,"629":1,"630":1,"631":1,"632":1,"633":1,"634":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":3,"664":3,"665":3,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":17,"690":8,"691":8,"692":8,"693":8,"694":8,"695":8,"696":8,"697":8,"698":1,"699":1,"700":13,"701":13,"702":13,"703":13,"704":0,"705":0,"706":13,"707":13,"708":13,"709":13,"710":13,"711":13,"712":13,"713":0,"714":0,"715":13,"716":13,"717":13,"718":13,"719":13,"720":13,"721":1,"722":1,"723":13,"724":13,"725":13,"726":13,"727":13,"728":13,"729":13,"730":13,"731":13,"732":13,"733":13,"734":1,"735":1,"736":16,"737":8,"738":8,"739":8,"740":8,"741":8,"742":8,"743":8,"744":8,"745":1,"746":1,"747":15,"748":15,"749":15,"750":1,"751":1,"752":47,"753":46,"754":46,"755":46,"756":46,"757":46,"758":46,"759":46,"760":46,"761":1,"762":1,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":10,"772":10,"773":10,"774":10,"775":10,"776":10,"777":10,"778":10,"779":10,"780":2,"781":2,"782":2,"783":10,"784":10,"785":10,"786":10,"787":10,"788":10,"789":10,"790":10,"791":10,"792":10,"793":10,"794":10,"795":10,"796":10,"797":10,"798":10,"799":10,"800":10,"801":10,"802":10,"803":10,"804":10,"805":10,"806":10,"807":2,"808":2,"809":10,"810":2,"811":2,"812":2,"813":1,"814":1,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":1,"824":1,"825":2,"826":2,"827":2,"828":2,"829":2,"830":1,"831":1,"832":8,"833":8,"834":40,"835":40,"836":40,"837":8,"838":8,"839":8,"840":8,"841":1,"842":1,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"850":2,"851":2,"852":2,"853":2,"854":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":1,"867":1,"868":2,"869":2,"870":2,"871":2,"872":8,"873":2,"874":2,"875":2,"876":1,"877":1,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"888":2,"889":2,"890":1,"891":1,"892":2,"893":2,"894":1,"895":1,"896":0,"897":0,"898":0,"899":0,"900":0,"901":1,"902":1,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":1,"914":1,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":1,"942":1,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":1,"953":1,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":1,"962":1,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":1,"974":1,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":0,"984":0,"985":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":1,"995":1,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":1,"1012":1,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":0,"1022":0,"1023":0,"1024":0,"1025":0,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":1,"1039":1,"1040":0,"1041":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":1,"1049":1,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":1,"1059":1,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1076":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":1,"1086":1,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":1,"1099":1,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":1,"1112":1,"1113":1,"1114":1,"1115":1,"1116":1,"1117":1,"1118":1,"1119":1,"1120":1,"1121":1,"1122":1,"1123":1,"1124":1,"1125":1,"1126":1,"1127":1,"1128":1,"1129":1,"1130":1,"1131":1,"1132":1,"1133":1,"1134":1,"1135":1,"1136":1,"1137":1,"1138":1,"1139":1,"1140":1},"branchMap":{"0":{"type":"branch","line":49,"loc":{"start":{"line":49,"column":2},"end":{"line":49,"column":71}},"locations":[{"start":{"line":49,"column":2},"end":{"line":49,"column":71}}]},"1":{"type":"branch","line":51,"loc":{"start":{"line":51,"column":2},"end":{"line":116,"column":3}},"locations":[{"start":{"line":51,"column":2},"end":{"line":116,"column":3}}]},"2":{"type":"branch","line":68,"loc":{"start":{"line":68,"column":44},"end":{"line":72,"column":7}},"locations":[{"start":{"line":68,"column":44},"end":{"line":72,"column":7}}]},"3":{"type":"branch","line":73,"loc":{"start":{"line":73,"column":-1},"end":{"line":84,"column":31}},"locations":[{"start":{"line":73,"column":-1},"end":{"line":84,"column":31}}]},"4":{"type":"branch","line":84,"loc":{"start":{"line":84,"column":27},"end":{"line":84,"column":41}},"locations":[{"start":{"line":84,"column":27},"end":{"line":84,"column":41}}]},"5":{"type":"branch","line":106,"loc":{"start":{"line":106,"column":37},"end":{"line":106,"column":51}},"locations":[{"start":{"line":106,"column":37},"end":{"line":106,"column":51}}]},"6":{"type":"branch","line":112,"loc":{"start":{"line":112,"column":6},"end":{"line":115,"column":5}},"locations":[{"start":{"line":112,"column":6},"end":{"line":115,"column":5}}]},"7":{"type":"branch","line":118,"loc":{"start":{"line":118,"column":2},"end":{"line":157,"column":3}},"locations":[{"start":{"line":118,"column":2},"end":{"line":157,"column":3}}]},"8":{"type":"branch","line":153,"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":5}},"locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":5}}]},"9":{"type":"branch","line":159,"loc":{"start":{"line":159,"column":2},"end":{"line":205,"column":3}},"locations":[{"start":{"line":159,"column":2},"end":{"line":205,"column":3}}]},"10":{"type":"branch","line":168,"loc":{"start":{"line":168,"column":45},"end":{"line":180,"column":7}},"locations":[{"start":{"line":168,"column":45},"end":{"line":180,"column":7}}]},"11":{"type":"branch","line":201,"loc":{"start":{"line":201,"column":6},"end":{"line":204,"column":5}},"locations":[{"start":{"line":201,"column":6},"end":{"line":204,"column":5}}]},"12":{"type":"branch","line":349,"loc":{"start":{"line":349,"column":2},"end":{"line":404,"column":3}},"locations":[{"start":{"line":349,"column":2},"end":{"line":404,"column":3}}]},"13":{"type":"branch","line":359,"loc":{"start":{"line":359,"column":40},"end":{"line":400,"column":13}},"locations":[{"start":{"line":359,"column":40},"end":{"line":400,"column":13}}]},"14":{"type":"branch","line":400,"loc":{"start":{"line":400,"column":6},"end":{"line":403,"column":5}},"locations":[{"start":{"line":400,"column":6},"end":{"line":403,"column":5}}]},"15":{"type":"branch","line":369,"loc":{"start":{"line":369,"column":8},"end":{"line":369,"column":44}},"locations":[{"start":{"line":369,"column":8},"end":{"line":369,"column":44}}]},"16":{"type":"branch","line":372,"loc":{"start":{"line":372,"column":8},"end":{"line":372,"column":41}},"locations":[{"start":{"line":372,"column":8},"end":{"line":372,"column":41}}]},"17":{"type":"branch","line":374,"loc":{"start":{"line":374,"column":46},"end":{"line":374,"column":75}},"locations":[{"start":{"line":374,"column":46},"end":{"line":374,"column":75}}]},"18":{"type":"branch","line":377,"loc":{"start":{"line":377,"column":26},"end":{"line":377,"column":49}},"locations":[{"start":{"line":377,"column":26},"end":{"line":377,"column":49}}]},"19":{"type":"branch","line":379,"loc":{"start":{"line":379,"column":31},"end":{"line":379,"column":54}},"locations":[{"start":{"line":379,"column":31},"end":{"line":379,"column":54}}]},"20":{"type":"branch","line":382,"loc":{"start":{"line":382,"column":27},"end":{"line":382,"column":52}},"locations":[{"start":{"line":382,"column":27},"end":{"line":382,"column":52}}]},"21":{"type":"branch","line":406,"loc":{"start":{"line":406,"column":10},"end":{"line":466,"column":3}},"locations":[{"start":{"line":406,"column":10},"end":{"line":466,"column":3}}]},"22":{"type":"branch","line":415,"loc":{"start":{"line":415,"column":32},"end":{"line":463,"column":5}},"locations":[{"start":{"line":415,"column":32},"end":{"line":463,"column":5}}]},"23":{"type":"branch","line":420,"loc":{"start":{"line":420,"column":10},"end":{"line":425,"column":18}},"locations":[{"start":{"line":420,"column":10},"end":{"line":425,"column":18}}]},"24":{"type":"branch","line":425,"loc":{"start":{"line":425,"column":-1},"end":{"line":425,"column":18}},"locations":[{"start":{"line":425,"column":-1},"end":{"line":425,"column":18}}]},"25":{"type":"branch","line":426,"loc":{"start":{"line":426,"column":10},"end":{"line":432,"column":18}},"locations":[{"start":{"line":426,"column":10},"end":{"line":432,"column":18}}]},"26":{"type":"branch","line":432,"loc":{"start":{"line":432,"column":-1},"end":{"line":432,"column":18}},"locations":[{"start":{"line":432,"column":-1},"end":{"line":432,"column":18}}]},"27":{"type":"branch","line":433,"loc":{"start":{"line":433,"column":10},"end":{"line":435,"column":18}},"locations":[{"start":{"line":433,"column":10},"end":{"line":435,"column":18}}]},"28":{"type":"branch","line":435,"loc":{"start":{"line":435,"column":-1},"end":{"line":435,"column":18}},"locations":[{"start":{"line":435,"column":-1},"end":{"line":435,"column":18}}]},"29":{"type":"branch","line":436,"loc":{"start":{"line":436,"column":10},"end":{"line":441,"column":18}},"locations":[{"start":{"line":436,"column":10},"end":{"line":441,"column":18}}]},"30":{"type":"branch","line":442,"loc":{"start":{"line":442,"column":10},"end":{"line":444,"column":21}},"locations":[{"start":{"line":442,"column":10},"end":{"line":444,"column":21}}]},"31":{"type":"branch","line":446,"loc":{"start":{"line":446,"column":-1},"end":{"line":448,"column":39}},"locations":[{"start":{"line":446,"column":-1},"end":{"line":448,"column":39}}]},"32":{"type":"branch","line":448,"loc":{"start":{"line":448,"column":41},"end":{"line":454,"column":9}},"locations":[{"start":{"line":448,"column":41},"end":{"line":454,"column":9}}]},"33":{"type":"branch","line":455,"loc":{"start":{"line":455,"column":-1},"end":{"line":457,"column":15}},"locations":[{"start":{"line":455,"column":-1},"end":{"line":457,"column":15}}]},"34":{"type":"branch","line":457,"loc":{"start":{"line":457,"column":8},"end":{"line":462,"column":7}},"locations":[{"start":{"line":457,"column":8},"end":{"line":462,"column":7}}]},"35":{"type":"branch","line":502,"loc":{"start":{"line":502,"column":10},"end":{"line":524,"column":3}},"locations":[{"start":{"line":502,"column":10},"end":{"line":524,"column":3}}]},"36":{"type":"branch","line":506,"loc":{"start":{"line":506,"column":22},"end":{"line":506,"column":68}},"locations":[{"start":{"line":506,"column":22},"end":{"line":506,"column":68}}]},"37":{"type":"branch","line":506,"loc":{"start":{"line":506,"column":70},"end":{"line":513,"column":5}},"locations":[{"start":{"line":506,"column":70},"end":{"line":513,"column":5}}]},"38":{"type":"branch","line":514,"loc":{"start":{"line":514,"column":-1},"end":{"line":524,"column":3}},"locations":[{"start":{"line":514,"column":-1},"end":{"line":524,"column":3}}]},"39":{"type":"branch","line":509,"loc":{"start":{"line":509,"column":24},"end":{"line":511,"column":7}},"locations":[{"start":{"line":509,"column":24},"end":{"line":511,"column":7}}]},"40":{"type":"branch","line":516,"loc":{"start":{"line":516,"column":43},"end":{"line":516,"column":71}},"locations":[{"start":{"line":516,"column":43},"end":{"line":516,"column":71}}]},"41":{"type":"branch","line":519,"loc":{"start":{"line":519,"column":22},"end":{"line":521,"column":5}},"locations":[{"start":{"line":519,"column":22},"end":{"line":521,"column":5}}]},"42":{"type":"branch","line":526,"loc":{"start":{"line":526,"column":10},"end":{"line":541,"column":3}},"locations":[{"start":{"line":526,"column":10},"end":{"line":541,"column":3}}]},"43":{"type":"branch","line":532,"loc":{"start":{"line":532,"column":6},"end":{"line":533,"column":56}},"locations":[{"start":{"line":532,"column":6},"end":{"line":533,"column":56}}]},"44":{"type":"branch","line":534,"loc":{"start":{"line":534,"column":6},"end":{"line":535,"column":46}},"locations":[{"start":{"line":534,"column":6},"end":{"line":535,"column":46}}]},"45":{"type":"branch","line":536,"loc":{"start":{"line":536,"column":6},"end":{"line":537,"column":44}},"locations":[{"start":{"line":536,"column":6},"end":{"line":537,"column":44}}]},"46":{"type":"branch","line":538,"loc":{"start":{"line":538,"column":6},"end":{"line":539,"column":56}},"locations":[{"start":{"line":538,"column":6},"end":{"line":539,"column":56}}]},"47":{"type":"branch","line":543,"loc":{"start":{"line":543,"column":10},"end":{"line":606,"column":3}},"locations":[{"start":{"line":543,"column":10},"end":{"line":606,"column":3}}]},"48":{"type":"branch","line":547,"loc":{"start":{"line":547,"column":32},"end":{"line":560,"column":5}},"locations":[{"start":{"line":547,"column":32},"end":{"line":560,"column":5}}]},"49":{"type":"branch","line":573,"loc":{"start":{"line":573,"column":27},"end":{"line":581,"column":5}},"locations":[{"start":{"line":573,"column":27},"end":{"line":581,"column":5}}]},"50":{"type":"branch","line":566,"loc":{"start":{"line":566,"column":22},"end":{"line":571,"column":5}},"locations":[{"start":{"line":566,"column":22},"end":{"line":571,"column":5}}]},"51":{"type":"branch","line":567,"loc":{"start":{"line":567,"column":44},"end":{"line":567,"column":49}},"locations":[{"start":{"line":567,"column":44},"end":{"line":567,"column":49}}]},"52":{"type":"branch","line":587,"loc":{"start":{"line":587,"column":33},"end":{"line":587,"column":56}},"locations":[{"start":{"line":587,"column":33},"end":{"line":587,"column":56}}]},"53":{"type":"branch","line":608,"loc":{"start":{"line":608,"column":10},"end":{"line":641,"column":3}},"locations":[{"start":{"line":608,"column":10},"end":{"line":641,"column":3}}]},"54":{"type":"branch","line":609,"loc":{"start":{"line":609,"column":32},"end":{"line":617,"column":5}},"locations":[{"start":{"line":609,"column":32},"end":{"line":617,"column":5}}]},"55":{"type":"branch","line":621,"loc":{"start":{"line":621,"column":6},"end":{"line":621,"column":51}},"locations":[{"start":{"line":621,"column":6},"end":{"line":621,"column":51}}]},"56":{"type":"branch","line":630,"loc":{"start":{"line":630,"column":23},"end":{"line":630,"column":51}},"locations":[{"start":{"line":630,"column":23},"end":{"line":630,"column":51}}]},"57":{"type":"branch","line":643,"loc":{"start":{"line":643,"column":10},"end":{"line":687,"column":3}},"locations":[{"start":{"line":643,"column":10},"end":{"line":687,"column":3}}]},"58":{"type":"branch","line":644,"loc":{"start":{"line":644,"column":32},"end":{"line":652,"column":5}},"locations":[{"start":{"line":644,"column":32},"end":{"line":652,"column":5}}]},"59":{"type":"branch","line":656,"loc":{"start":{"line":656,"column":6},"end":{"line":656,"column":39}},"locations":[{"start":{"line":656,"column":6},"end":{"line":656,"column":39}}]},"60":{"type":"branch","line":663,"loc":{"start":{"line":663,"column":28},"end":{"line":667,"column":5}},"locations":[{"start":{"line":663,"column":28},"end":{"line":667,"column":5}}]},"61":{"type":"branch","line":671,"loc":{"start":{"line":671,"column":23},"end":{"line":671,"column":51}},"locations":[{"start":{"line":671,"column":23},"end":{"line":671,"column":51}}]},"62":{"type":"branch","line":689,"loc":{"start":{"line":689,"column":10},"end":{"line":698,"column":3}},"locations":[{"start":{"line":689,"column":10},"end":{"line":698,"column":3}}]},"63":{"type":"branch","line":690,"loc":{"start":{"line":690,"column":30},"end":{"line":690,"column":39}},"locations":[{"start":{"line":690,"column":30},"end":{"line":690,"column":39}}]},"64":{"type":"branch","line":691,"loc":{"start":{"line":691,"column":-1},"end":{"line":698,"column":3}},"locations":[{"start":{"line":691,"column":-1},"end":{"line":698,"column":3}}]},"65":{"type":"branch","line":692,"loc":{"start":{"line":692,"column":33},"end":{"line":692,"column":56}},"locations":[{"start":{"line":692,"column":33},"end":{"line":692,"column":56}}]},"66":{"type":"branch","line":694,"loc":{"start":{"line":694,"column":31},"end":{"line":694,"column":54}},"locations":[{"start":{"line":694,"column":31},"end":{"line":694,"column":54}}]},"67":{"type":"branch","line":700,"loc":{"start":{"line":700,"column":10},"end":{"line":721,"column":3}},"locations":[{"start":{"line":700,"column":10},"end":{"line":721,"column":3}}]},"68":{"type":"branch","line":704,"loc":{"start":{"line":704,"column":42},"end":{"line":706,"column":5}},"locations":[{"start":{"line":704,"column":42},"end":{"line":706,"column":5}}]},"69":{"type":"branch","line":713,"loc":{"start":{"line":713,"column":33},"end":{"line":715,"column":5}},"locations":[{"start":{"line":713,"column":33},"end":{"line":715,"column":5}}]},"70":{"type":"branch","line":709,"loc":{"start":{"line":709,"column":33},"end":{"line":709,"column":67}},"locations":[{"start":{"line":709,"column":33},"end":{"line":709,"column":67}}]},"71":{"type":"branch","line":723,"loc":{"start":{"line":723,"column":10},"end":{"line":734,"column":3}},"locations":[{"start":{"line":723,"column":10},"end":{"line":734,"column":3}}]},"72":{"type":"branch","line":733,"loc":{"start":{"line":733,"column":60},"end":{"line":733,"column":65}},"locations":[{"start":{"line":733,"column":60},"end":{"line":733,"column":65}}]},"73":{"type":"branch","line":728,"loc":{"start":{"line":728,"column":6},"end":{"line":728,"column":60}},"locations":[{"start":{"line":728,"column":6},"end":{"line":728,"column":60}}]},"74":{"type":"branch","line":728,"loc":{"start":{"line":728,"column":54},"end":{"line":728,"column":59}},"locations":[{"start":{"line":728,"column":54},"end":{"line":728,"column":59}}]},"75":{"type":"branch","line":731,"loc":{"start":{"line":731,"column":54},"end":{"line":731,"column":73}},"locations":[{"start":{"line":731,"column":54},"end":{"line":731,"column":73}}]},"76":{"type":"branch","line":736,"loc":{"start":{"line":736,"column":10},"end":{"line":745,"column":3}},"locations":[{"start":{"line":736,"column":10},"end":{"line":745,"column":3}}]},"77":{"type":"branch","line":737,"loc":{"start":{"line":737,"column":30},"end":{"line":745,"column":3}},"locations":[{"start":{"line":737,"column":30},"end":{"line":745,"column":3}}]},"78":{"type":"branch","line":739,"loc":{"start":{"line":739,"column":33},"end":{"line":739,"column":56}},"locations":[{"start":{"line":739,"column":33},"end":{"line":739,"column":56}}]},"79":{"type":"branch","line":740,"loc":{"start":{"line":740,"column":31},"end":{"line":740,"column":54}},"locations":[{"start":{"line":740,"column":31},"end":{"line":740,"column":54}}]},"80":{"type":"branch","line":747,"loc":{"start":{"line":747,"column":10},"end":{"line":750,"column":3}},"locations":[{"start":{"line":747,"column":10},"end":{"line":750,"column":3}}]},"81":{"type":"branch","line":748,"loc":{"start":{"line":748,"column":33},"end":{"line":748,"column":56}},"locations":[{"start":{"line":748,"column":33},"end":{"line":748,"column":56}}]},"82":{"type":"branch","line":752,"loc":{"start":{"line":752,"column":10},"end":{"line":761,"column":3}},"locations":[{"start":{"line":752,"column":10},"end":{"line":761,"column":3}}]},"83":{"type":"branch","line":753,"loc":{"start":{"line":753,"column":29},"end":{"line":753,"column":38}},"locations":[{"start":{"line":753,"column":29},"end":{"line":753,"column":38}}]},"84":{"type":"branch","line":754,"loc":{"start":{"line":754,"column":-1},"end":{"line":761,"column":3}},"locations":[{"start":{"line":754,"column":-1},"end":{"line":761,"column":3}}]},"85":{"type":"branch","line":755,"loc":{"start":{"line":755,"column":31},"end":{"line":755,"column":54}},"locations":[{"start":{"line":755,"column":31},"end":{"line":755,"column":54}}]},"86":{"type":"branch","line":757,"loc":{"start":{"line":757,"column":20},"end":{"line":757,"column":63}},"locations":[{"start":{"line":757,"column":20},"end":{"line":757,"column":63}}]},"87":{"type":"branch","line":763,"loc":{"start":{"line":763,"column":10},"end":{"line":813,"column":3}},"locations":[{"start":{"line":763,"column":10},"end":{"line":813,"column":3}}]},"88":{"type":"branch","line":771,"loc":{"start":{"line":771,"column":32},"end":{"line":810,"column":5}},"locations":[{"start":{"line":771,"column":32},"end":{"line":810,"column":5}}]},"89":{"type":"branch","line":780,"loc":{"start":{"line":780,"column":35},"end":{"line":780,"column":44}},"locations":[{"start":{"line":780,"column":35},"end":{"line":780,"column":44}}]},"90":{"type":"branch","line":781,"loc":{"start":{"line":781,"column":-1},"end":{"line":784,"column":64}},"locations":[{"start":{"line":781,"column":-1},"end":{"line":784,"column":64}}]},"91":{"type":"branch","line":784,"loc":{"start":{"line":784,"column":64},"end":{"line":784,"column":71}},"locations":[{"start":{"line":784,"column":64},"end":{"line":784,"column":71}}]},"92":{"type":"branch","line":784,"loc":{"start":{"line":784,"column":71},"end":{"line":784,"column":76}},"locations":[{"start":{"line":784,"column":71},"end":{"line":784,"column":76}}]},"93":{"type":"branch","line":790,"loc":{"start":{"line":790,"column":34},"end":{"line":790,"column":58}},"locations":[{"start":{"line":790,"column":34},"end":{"line":790,"column":58}}]},"94":{"type":"branch","line":790,"loc":{"start":{"line":790,"column":59},"end":{"line":790,"column":62}},"locations":[{"start":{"line":790,"column":59},"end":{"line":790,"column":62}}]},"95":{"type":"branch","line":807,"loc":{"start":{"line":807,"column":8},"end":{"line":809,"column":7}},"locations":[{"start":{"line":807,"column":8},"end":{"line":809,"column":7}}]},"96":{"type":"branch","line":815,"loc":{"start":{"line":815,"column":10},"end":{"line":823,"column":3}},"locations":[{"start":{"line":815,"column":10},"end":{"line":823,"column":3}}]},"97":{"type":"branch","line":825,"loc":{"start":{"line":825,"column":10},"end":{"line":830,"column":3}},"locations":[{"start":{"line":825,"column":10},"end":{"line":830,"column":3}}]},"98":{"type":"branch","line":832,"loc":{"start":{"line":832,"column":10},"end":{"line":841,"column":3}},"locations":[{"start":{"line":832,"column":10},"end":{"line":841,"column":3}}]},"99":{"type":"branch","line":834,"loc":{"start":{"line":834,"column":42},"end":{"line":837,"column":5}},"locations":[{"start":{"line":834,"column":42},"end":{"line":837,"column":5}}]},"100":{"type":"branch","line":839,"loc":{"start":{"line":839,"column":6},"end":{"line":839,"column":61}},"locations":[{"start":{"line":839,"column":6},"end":{"line":839,"column":61}}]},"101":{"type":"branch","line":843,"loc":{"start":{"line":843,"column":10},"end":{"line":866,"column":3}},"locations":[{"start":{"line":843,"column":10},"end":{"line":866,"column":3}}]},"102":{"type":"branch","line":846,"loc":{"start":{"line":846,"column":33},"end":{"line":846,"column":56}},"locations":[{"start":{"line":846,"column":33},"end":{"line":846,"column":56}}]},"103":{"type":"branch","line":847,"loc":{"start":{"line":847,"column":31},"end":{"line":847,"column":54}},"locations":[{"start":{"line":847,"column":31},"end":{"line":847,"column":54}}]},"104":{"type":"branch","line":850,"loc":{"start":{"line":850,"column":23},"end":{"line":850,"column":51}},"locations":[{"start":{"line":850,"column":23},"end":{"line":850,"column":51}}]},"105":{"type":"branch","line":868,"loc":{"start":{"line":868,"column":10},"end":{"line":876,"column":3}},"locations":[{"start":{"line":868,"column":10},"end":{"line":876,"column":3}}]},"106":{"type":"branch","line":872,"loc":{"start":{"line":872,"column":22},"end":{"line":874,"column":5}},"locations":[{"start":{"line":872,"column":22},"end":{"line":874,"column":5}}]},"107":{"type":"branch","line":878,"loc":{"start":{"line":878,"column":10},"end":{"line":890,"column":3}},"locations":[{"start":{"line":878,"column":10},"end":{"line":890,"column":3}}]},"108":{"type":"branch","line":882,"loc":{"start":{"line":882,"column":23},"end":{"line":882,"column":51}},"locations":[{"start":{"line":882,"column":23},"end":{"line":882,"column":51}}]},"109":{"type":"branch","line":884,"loc":{"start":{"line":884,"column":23},"end":{"line":884,"column":51}},"locations":[{"start":{"line":884,"column":23},"end":{"line":884,"column":51}}]},"110":{"type":"branch","line":892,"loc":{"start":{"line":892,"column":10},"end":{"line":894,"column":3}},"locations":[{"start":{"line":892,"column":10},"end":{"line":894,"column":3}}]},"111":{"type":"branch","line":893,"loc":{"start":{"line":893,"column":28},"end":{"line":893,"column":56}},"locations":[{"start":{"line":893,"column":28},"end":{"line":893,"column":56}}]},"112":{"type":"branch","line":1113,"loc":{"start":{"line":1113,"column":10},"end":{"line":1122,"column":3}},"locations":[{"start":{"line":1113,"column":10},"end":{"line":1122,"column":3}}]},"113":{"type":"branch","line":1118,"loc":{"start":{"line":1118,"column":44},"end":{"line":1118,"column":63}},"locations":[{"start":{"line":1118,"column":44},"end":{"line":1118,"column":63}}]},"114":{"type":"branch","line":1119,"loc":{"start":{"line":1119,"column":43},"end":{"line":1119,"column":69}},"locations":[{"start":{"line":1119,"column":43},"end":{"line":1119,"column":69}}]},"115":{"type":"branch","line":1124,"loc":{"start":{"line":1124,"column":10},"end":{"line":1140,"column":3}},"locations":[{"start":{"line":1124,"column":10},"end":{"line":1140,"column":3}}]},"116":{"type":"branch","line":1125,"loc":{"start":{"line":1125,"column":49},"end":{"line":1125,"column":58}},"locations":[{"start":{"line":1125,"column":49},"end":{"line":1125,"column":58}}]},"117":{"type":"branch","line":1139,"loc":{"start":{"line":1139,"column":29},"end":{"line":1139,"column":32}},"locations":[{"start":{"line":1139,"column":29},"end":{"line":1139,"column":32}}]},"118":{"type":"branch","line":1128,"loc":{"start":{"line":1128,"column":26},"end":{"line":1128,"column":49}},"locations":[{"start":{"line":1128,"column":26},"end":{"line":1128,"column":49}}]},"119":{"type":"branch","line":1129,"loc":{"start":{"line":1129,"column":26},"end":{"line":1129,"column":49}},"locations":[{"start":{"line":1129,"column":26},"end":{"line":1129,"column":49}}]},"120":{"type":"branch","line":1130,"loc":{"start":{"line":1130,"column":27},"end":{"line":1130,"column":60}},"locations":[{"start":{"line":1130,"column":27},"end":{"line":1130,"column":60}}]},"121":{"type":"branch","line":1131,"loc":{"start":{"line":1131,"column":27},"end":{"line":1131,"column":56}},"locations":[{"start":{"line":1131,"column":27},"end":{"line":1131,"column":56}}]},"122":{"type":"branch","line":1132,"loc":{"start":{"line":1132,"column":27},"end":{"line":1132,"column":56}},"locations":[{"start":{"line":1132,"column":27},"end":{"line":1132,"column":56}}]}},"b":{"0":[18],"1":[14],"2":[1],"3":[13],"4":[0],"5":[0],"6":[1],"7":[2],"8":[0],"9":[2],"10":[8],"11":[0],"12":[2],"13":[1],"14":[0],"15":[2],"16":[2],"17":[2],"18":[2],"19":[2],"20":[2],"21":[24],"22":[36],"23":[16],"24":[12],"25":[8],"26":[5],"27":[8],"28":[5],"29":[2],"30":[2],"31":[24],"32":[0],"33":[24],"34":[10],"35":[13],"36":[1],"37":[1],"38":[12],"39":[3],"40":[19],"41":[19],"42":[13],"43":[11],"44":[1],"45":[1],"46":[0],"47":[11],"48":[0],"49":[0],"50":[16],"51":[0],"52":[16],"53":[1],"54":[0],"55":[3],"56":[3],"57":[1],"58":[0],"59":[4],"60":[3],"61":[3],"62":[17],"63":[9],"64":[8],"65":[25],"66":[25],"67":[13],"68":[0],"69":[0],"70":[22],"71":[13],"72":[0],"73":[22],"74":[0],"75":[22],"76":[16],"77":[8],"78":[25],"79":[25],"80":[15],"81":[30],"82":[47],"83":[1],"84":[46],"85":[111],"86":[111],"87":[2],"88":[10],"89":[8],"90":[2],"91":[0],"92":[0],"93":[0],"94":[0],"95":[2],"96":[2],"97":[2],"98":[8],"99":[40],"100":[64],"101":[2],"102":[8],"103":[8],"104":[8],"105":[2],"106":[8],"107":[2],"108":[8],"109":[8],"110":[2],"111":[8],"112":[1],"113":[2],"114":[2],"115":[1],"116":[0],"117":[0],"118":[2],"119":[2],"120":[2],"121":[2],"122":[2]},"fnMap":{"0":{"name":"EnsembleMethodsService","decl":{"start":{"line":49,"column":2},"end":{"line":49,"column":71}},"loc":{"start":{"line":49,"column":2},"end":{"line":49,"column":71}},"line":49},"1":{"name":"createEnsembleForecast","decl":{"start":{"line":51,"column":2},"end":{"line":116,"column":3}},"loc":{"start":{"line":51,"column":2},"end":{"line":116,"column":3}},"line":51},"2":{"name":"optimizeEnsemble","decl":{"start":{"line":118,"column":2},"end":{"line":157,"column":3}},"loc":{"start":{"line":118,"column":2},"end":{"line":157,"column":3}},"line":118},"3":{"name":"baggingEnsemble","decl":{"start":{"line":159,"column":2},"end":{"line":205,"column":3}},"loc":{"start":{"line":159,"column":2},"end":{"line":205,"column":3}},"line":159},"4":{"name":"boostingEnsemble","decl":{"start":{"line":207,"column":2},"end":{"line":266,"column":3}},"loc":{"start":{"line":207,"column":2},"end":{"line":266,"column":3}},"line":207},"5":{"name":"stackingEnsemble","decl":{"start":{"line":268,"column":2},"end":{"line":347,"column":3}},"loc":{"start":{"line":268,"column":2},"end":{"line":347,"column":3}},"line":268},"6":{"name":"evaluateEnsemblePerformance","decl":{"start":{"line":349,"column":2},"end":{"line":404,"column":3}},"loc":{"start":{"line":349,"column":2},"end":{"line":404,"column":3}},"line":349},"7":{"name":"generateIndividualForecasts","decl":{"start":{"line":406,"column":10},"end":{"line":466,"column":3}},"loc":{"start":{"line":406,"column":10},"end":{"line":466,"column":3}},"line":406},"8":{"name":"enhanceForecastWithExternalData","decl":{"start":{"line":468,"column":10},"end":{"line":500,"column":3}},"loc":{"start":{"line":468,"column":10},"end":{"line":500,"column":3}},"line":468},"9":{"name":"calculateOptimalWeights","decl":{"start":{"line":502,"column":10},"end":{"line":524,"column":3}},"loc":{"start":{"line":502,"column":10},"end":{"line":524,"column":3}},"line":502},"10":{"name":"applyEnsembleMethod","decl":{"start":{"line":526,"column":10},"end":{"line":541,"column":3}},"loc":{"start":{"line":526,"column":10},"end":{"line":541,"column":3}},"line":526},"11":{"name":"weightedAverage","decl":{"start":{"line":543,"column":10},"end":{"line":606,"column":3}},"loc":{"start":{"line":543,"column":10},"end":{"line":606,"column":3}},"line":543},"12":{"name":"majorityVoting","decl":{"start":{"line":608,"column":10},"end":{"line":641,"column":3}},"loc":{"start":{"line":608,"column":10},"end":{"line":641,"column":3}},"line":608},"13":{"name":"rankedVoting","decl":{"start":{"line":643,"column":10},"end":{"line":687,"column":3}},"loc":{"start":{"line":643,"column":10},"end":{"line":687,"column":3}},"line":643},"14":{"name":"calculateDiversity","decl":{"start":{"line":689,"column":10},"end":{"line":698,"column":3}},"loc":{"start":{"line":689,"column":10},"end":{"line":698,"column":3}},"line":689},"15":{"name":"calculateErrorReduction","decl":{"start":{"line":700,"column":10},"end":{"line":721,"column":3}},"loc":{"start":{"line":700,"column":10},"end":{"line":721,"column":3}},"line":700},"16":{"name":"calculateEnsembleConfidence","decl":{"start":{"line":723,"column":10},"end":{"line":734,"column":3}},"loc":{"start":{"line":723,"column":10},"end":{"line":734,"column":3}},"line":723},"17":{"name":"calculateAgreement","decl":{"start":{"line":736,"column":10},"end":{"line":745,"column":3}},"loc":{"start":{"line":736,"column":10},"end":{"line":745,"column":3}},"line":736},"18":{"name":"calculateForecastVariance","decl":{"start":{"line":747,"column":10},"end":{"line":750,"column":3}},"loc":{"start":{"line":747,"column":10},"end":{"line":750,"column":3}},"line":747},"19":{"name":"calculateVariance","decl":{"start":{"line":752,"column":10},"end":{"line":761,"column":3}},"loc":{"start":{"line":752,"column":10},"end":{"line":761,"column":3}},"line":752},"20":{"name":"evaluateModels","decl":{"start":{"line":763,"column":10},"end":{"line":813,"column":3}},"loc":{"start":{"line":763,"column":10},"end":{"line":813,"column":3}},"line":763},"21":{"name":"selectBestModels","decl":{"start":{"line":815,"column":10},"end":{"line":823,"column":3}},"loc":{"start":{"line":815,"column":10},"end":{"line":823,"column":3}},"line":815},"22":{"name":"calculateWeightsFromPerformance","decl":{"start":{"line":825,"column":10},"end":{"line":830,"column":3}},"loc":{"start":{"line":825,"column":10},"end":{"line":830,"column":3}},"line":825},"23":{"name":"createBootstrapSample","decl":{"start":{"line":832,"column":10},"end":{"line":841,"column":3}},"loc":{"start":{"line":832,"column":10},"end":{"line":841,"column":3}},"line":832},"24":{"name":"aggregateBootstrapForecasts","decl":{"start":{"line":843,"column":10},"end":{"line":866,"column":3}},"loc":{"start":{"line":843,"column":10},"end":{"line":866,"column":3}},"line":843},"25":{"name":"calculateBootstrapWeights","decl":{"start":{"line":868,"column":10},"end":{"line":876,"column":3}},"loc":{"start":{"line":868,"column":10},"end":{"line":876,"column":3}},"line":868},"26":{"name":"calculateBootstrapErrorReduction","decl":{"start":{"line":878,"column":10},"end":{"line":890,"column":3}},"loc":{"start":{"line":878,"column":10},"end":{"line":890,"column":3}},"line":878},"27":{"name":"calculateBootstrapConfidence","decl":{"start":{"line":892,"column":10},"end":{"line":894,"column":3}},"loc":{"start":{"line":892,"column":10},"end":{"line":894,"column":3}},"line":892},"28":{"name":"calculateResiduals","decl":{"start":{"line":896,"column":10},"end":{"line":901,"column":3}},"loc":{"start":{"line":896,"column":10},"end":{"line":901,"column":3}},"line":896},"29":{"name":"updateDataWeights","decl":{"start":{"line":903,"column":10},"end":{"line":913,"column":3}},"loc":{"start":{"line":903,"column":10},"end":{"line":913,"column":3}},"line":903},"30":{"name":"createBoostedForecast","decl":{"start":{"line":915,"column":10},"end":{"line":941,"column":3}},"loc":{"start":{"line":915,"column":10},"end":{"line":941,"column":3}},"line":915},"31":{"name":"createWeightMap","decl":{"start":{"line":943,"column":10},"end":{"line":952,"column":3}},"loc":{"start":{"line":943,"column":10},"end":{"line":952,"column":3}},"line":943},"32":{"name":"calculateBoostingErrorReduction","decl":{"start":{"line":954,"column":10},"end":{"line":961,"column":3}},"loc":{"start":{"line":954,"column":10},"end":{"line":961,"column":3}},"line":954},"33":{"name":"calculateBoostingConfidence","decl":{"start":{"line":963,"column":10},"end":{"line":973,"column":3}},"loc":{"start":{"line":963,"column":10},"end":{"line":973,"column":3}},"line":963},"34":{"name":"createCrossValidationFolds","decl":{"start":{"line":975,"column":10},"end":{"line":994,"column":3}},"loc":{"start":{"line":975,"column":10},"end":{"line":994,"column":3}},"line":975},"35":{"name":"trainMetaModel","decl":{"start":{"line":996,"column":10},"end":{"line":1011,"column":3}},"loc":{"start":{"line":996,"column":10},"end":{"line":1011,"column":3}},"line":996},"36":{"name":"trainLinearRegression","decl":{"start":{"line":1013,"column":10},"end":{"line":1038,"column":3}},"loc":{"start":{"line":1013,"column":10},"end":{"line":1038,"column":3}},"line":1013},"37":{"name":"trainRidgeRegression","decl":{"start":{"line":1040,"column":10},"end":{"line":1048,"column":3}},"loc":{"start":{"line":1040,"column":10},"end":{"line":1048,"column":3}},"line":1040},"38":{"name":"trainLassoRegression","decl":{"start":{"line":1050,"column":10},"end":{"line":1058,"column":3}},"loc":{"start":{"line":1050,"column":10},"end":{"line":1058,"column":3}},"line":1050},"39":{"name":"applyMetaModel","decl":{"start":{"line":1060,"column":10},"end":{"line":1085,"column":3}},"loc":{"start":{"line":1060,"column":10},"end":{"line":1085,"column":3}},"line":1060},"40":{"name":"calculateStackingErrorReduction","decl":{"start":{"line":1087,"column":10},"end":{"line":1098,"column":3}},"loc":{"start":{"line":1087,"column":10},"end":{"line":1098,"column":3}},"line":1087},"41":{"name":"calculateStackingConfidence","decl":{"start":{"line":1100,"column":10},"end":{"line":1111,"column":3}},"loc":{"start":{"line":1100,"column":10},"end":{"line":1111,"column":3}},"line":1100},"42":{"name":"calculateReliability","decl":{"start":{"line":1113,"column":10},"end":{"line":1122,"column":3}},"loc":{"start":{"line":1113,"column":10},"end":{"line":1122,"column":3}},"line":1113},"43":{"name":"calculateCorrelation","decl":{"start":{"line":1124,"column":10},"end":{"line":1140,"column":3}},"loc":{"start":{"line":1124,"column":10},"end":{"line":1140,"column":3}},"line":1124}},"f":{"0":18,"1":14,"2":2,"3":2,"4":0,"5":0,"6":2,"7":24,"8":0,"9":13,"10":13,"11":11,"12":1,"13":1,"14":17,"15":13,"16":13,"17":16,"18":15,"19":47,"20":2,"21":2,"22":2,"23":8,"24":2,"25":2,"26":2,"27":2,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":1,"43":1}} +,"/workspaces/CurrentDao-backend/src/forecasting/entities/forecast-data.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/entities/forecast-data.entity.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":29}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":18}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":28}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":28}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":26}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":54}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":33}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":13}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":42}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":21}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":50}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":35}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":55}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":71}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":34}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":71}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":34}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":54}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":19}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":39}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":43}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":33}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":11}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":25}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":36}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":25}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":43}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":23}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":48}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":19}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":21}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":18}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":18}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2,"19":1,"20":2,"21":2,"22":2,"23":2,"24":2,"25":2,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1},"branchMap":{"0":{"type":"branch","line":10,"loc":{"start":{"line":10,"column":0},"end":{"line":19,"column":1}},"locations":[{"start":{"line":10,"column":0},"end":{"line":19,"column":1}}]},"1":{"type":"branch","line":21,"loc":{"start":{"line":21,"column":0},"end":{"line":26,"column":1}},"locations":[{"start":{"line":21,"column":0},"end":{"line":26,"column":1}}]}},"b":{"0":[2],"1":[2]},"fnMap":{},"f":{}} +,"/workspaces/CurrentDao-backend/src/forecasting/integrations/weather-data.service.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/integrations/weather-data.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":44}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":38}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":30}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":19}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":20}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":24}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":34}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":16}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":16}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":4}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":20}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":24}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":19}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":18}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":21}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":33}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":64}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":63}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":71}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":59}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":67}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":9}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":44}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":57}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":38}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":28}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":12}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":8}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":33}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":30}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":36}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":37}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":41}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":43}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":67}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":37}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":60}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":36}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":73}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":8}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":24}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":58}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":14}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":8}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":18}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":29}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":18}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":29}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":9}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":44}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":46}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":38}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":67}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":62}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":64}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":46}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":71}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":35}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":35}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":28}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":40}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":30}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":14}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":13}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":10}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":35}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":37}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":26}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":49}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":36}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":37}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":40}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":42}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":75}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":37}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":48}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":37}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":31}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":19}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":11}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":55}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":7}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":25}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":24}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":61}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":14}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":8}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":18}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":27}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":21}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":21}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":33}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":9}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":62}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":44}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":57}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":19}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":33}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":33}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":38}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":28}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":39}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":12}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":11}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":8}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":33}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":59}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":43}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":22}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":32}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":28}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":10}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":31}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":34}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":36}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":24}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":31}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":60}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":10}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":31}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":31}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":25}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":47}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":10}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":21}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":24}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":59}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":14}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":8}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":18}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":5}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":3}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":80}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":51}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":21}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":23}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":6}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":55}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":51}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":19}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":62}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":25}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":73}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":41}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":79}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":71}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":50}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":24}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":80}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":69}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":55}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":50}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":40}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":8}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":6}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":33}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":60}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":45}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":25}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":61}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":25}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":72}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":25}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":3}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":35}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":31}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":54}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":29}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":52}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":30}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":75}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":33}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":14}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":23}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":20}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":21}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":25}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":8}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":5}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":29}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":57}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":44}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":39}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":6}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":54}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":41}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":39}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":6}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":55}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":42}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":39}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":6}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":59}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":46}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":39}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":6}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":56}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":43}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":39}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":6}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":24}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":3}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":31}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":21}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":44}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":9}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":44}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":57}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":19}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":24}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":38}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":12}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":11}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":8}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":14}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":37}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":37}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":8}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":21}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":76}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":18}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":5}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":3}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":67}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":50}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":56}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":27}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":58}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":61}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":3}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":61}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":45}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":24}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":55}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":5}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":13}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":3}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":58}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":48}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":50}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":44}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":72}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":5}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":57}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":3}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":0}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":71}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":53}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":74}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":3}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":60}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":43}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":73}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":3}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":31}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":31}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":54}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":46}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":64}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":38}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":37}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":14}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":73}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":35}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":8}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":19}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":60}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":7}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":7}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":19}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":3}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":66}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":58}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":0}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":23}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":54}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":54}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":65}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":61}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":61}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":46}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":34}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":60}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":6}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":59}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":3}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":60}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":9}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":62}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":44}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":57}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":19}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":33}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":33}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":38}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":45}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":12}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":11}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":8}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":40}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":21}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":24}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":57}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":14}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":8}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":16}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":5}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":3}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":402,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":402,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":402,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":402,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/forecasting/models/time-series.service.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/models/time-series.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":67}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":33}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":18}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":33}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":1}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":33}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":25}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":4}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":19}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":16}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":27}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":37}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":41}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":49}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":26}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":63}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":22}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":27}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":30}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":9}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":30}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":50}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":57}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":61}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":62}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":14}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":39}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":62}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":62}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":10}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":23}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":16}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":49}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":8}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":21}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":56}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":5}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":37}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":27}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":29}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":30}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":9}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":30}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":65}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":36}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":54}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":52}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":13}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":14}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":13}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":14}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":16}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":8}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":62}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":14}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":39}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":29}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":62}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":62}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":10}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":17}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":38}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":16}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":41}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":8}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":21}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":72}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":18}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":21}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":27}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":30}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":9}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":30}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":49}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":51}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":62}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":39}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":29}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":62}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":62}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":10}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":17}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":22}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":16}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":34}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":34}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":30}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":10}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":8}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":21}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":55}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":18}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":3}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":24}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":27}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":29}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":30}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":9}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":30}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":52}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":54}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":62}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":14}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":39}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":29}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":32}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":32}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":10}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":25}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":16}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":19}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":44}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":38}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":46}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":10}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":8}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":21}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":58}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":18}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":22}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":27}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":18}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":28}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":59}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":52}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":47}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":43}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":32}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":77}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":37}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":33}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":47}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":69}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":43}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":23}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":14}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":33}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":8}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":48}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":38}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":55}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":3}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":25}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":27}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":29}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":30}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":19}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":55}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":34}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":70}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":54}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":21}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":57}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":14}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":51}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":3}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":56}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":14}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":14}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":14}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":5}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":14}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":46}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":59}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":32}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":3}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":19}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":27}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":14}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":14}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":14}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":29}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":10}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":31}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":56}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":50}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":44}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":52}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":12}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":41}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":32}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":6}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":71}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":18}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":17}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":18}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":5}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":14}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":40}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":49}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":34}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":27}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":18}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":17}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":18}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":29}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":10}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":50}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":44}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":52}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":12}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":49}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":6}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":74}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":37}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":50}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":50}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":44}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":52}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":12}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":47}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":16}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":18}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":17}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":6}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":3}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":77}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":40}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":41}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":50}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":44}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":52}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":55}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":12}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":28}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":35}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":35}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":36}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":19}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":22}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":6}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":3}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":58}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":34}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":0}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":37}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":50}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":20}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":78}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":46}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":44}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":3}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":63}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":22}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":36}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":17}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":37}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":17}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":45}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":18}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":36}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":19}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":37}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":19}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":40}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":20}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":38}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":20}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":36}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":20}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":14}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":17}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":5}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":76}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":14}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":18}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":38}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":61}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":77}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":3}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":27}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":22}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":26}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":19}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":29}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":71}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":76}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":27}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":64}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":6}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":16}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":22}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":63}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":10}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":9}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":12}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":10}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":61}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":80}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":77}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":60}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":35}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":3}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":60}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":38}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":15}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":14}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":76}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":7}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":68}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":20}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":13}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":37}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":18}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":41}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":10}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":10}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":3}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":69}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":43}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":43}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":24}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":38}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":38}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":0}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":46}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":46}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":17}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":3}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":0}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":59}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":56}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":50}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":36}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":35}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":29}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":65}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":3}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":31}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":27}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":20}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":22}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":11}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":32}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":22}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":102}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":8}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":5}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":3}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":17,"32":17,"33":17,"34":4,"35":4,"36":4,"37":4,"38":4,"39":4,"40":4,"41":4,"42":4,"43":4,"44":4,"45":4,"46":4,"47":4,"48":4,"49":4,"50":4,"51":4,"52":4,"53":4,"54":4,"55":4,"56":1,"57":1,"58":1,"59":4,"60":17,"61":17,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":0,"92":0,"93":0,"94":1,"95":17,"96":17,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":0,"123":0,"124":0,"125":1,"126":17,"127":17,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":0,"154":0,"155":0,"156":1,"157":17,"158":17,"159":2,"160":2,"161":2,"162":2,"163":2,"164":2,"165":2,"166":2,"167":2,"168":2,"169":0,"170":0,"171":1,"172":1,"173":1,"174":1,"175":2,"176":2,"177":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":1,"186":1,"187":1,"188":17,"189":17,"190":2,"191":2,"192":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":0,"199":2,"200":0,"201":2,"202":0,"203":2,"204":0,"205":2,"206":2,"207":17,"208":17,"209":3,"210":3,"211":3,"212":3,"213":3,"214":3,"215":3,"216":3,"217":3,"218":17,"219":17,"220":3,"221":3,"222":3,"223":3,"224":3,"225":3,"226":3,"227":3,"228":3,"229":3,"230":3,"231":3,"232":3,"233":3,"234":3,"235":3,"236":3,"237":17,"238":17,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":17,"248":17,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":17,"264":17,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":17,"279":17,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":17,"297":17,"298":8,"299":7,"300":7,"301":7,"302":7,"303":7,"304":7,"305":7,"306":7,"307":7,"308":17,"309":17,"310":11,"311":11,"312":7,"313":11,"314":1,"315":11,"316":1,"317":11,"318":1,"319":11,"320":0,"321":11,"322":0,"323":11,"324":0,"325":11,"326":1,"327":11,"328":0,"329":11,"330":11,"331":17,"332":17,"333":6,"334":6,"335":6,"336":6,"337":6,"338":6,"339":17,"340":17,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":17,"367":17,"368":2,"369":2,"370":2,"371":2,"372":2,"373":2,"374":2,"375":4,"376":4,"377":4,"378":4,"379":4,"380":2,"381":2,"382":17,"383":17,"384":6,"385":6,"386":6,"387":6,"388":6,"389":6,"390":6,"391":6,"392":5,"393":5,"394":17,"395":17,"396":16,"397":16,"398":16,"399":16,"400":16,"401":16,"402":16,"403":16,"404":17,"405":17,"406":9,"407":9,"408":9,"409":9,"410":9,"411":2,"412":2,"413":2,"414":2,"415":9,"416":17},"branchMap":{"0":{"type":"branch","line":31,"loc":{"start":{"line":31,"column":7},"end":{"line":417,"column":1}},"locations":[{"start":{"line":31,"column":7},"end":{"line":417,"column":1}}]},"1":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":2},"end":{"line":60,"column":3}},"locations":[{"start":{"line":34,"column":2},"end":{"line":60,"column":3}}]},"2":{"type":"branch","line":56,"loc":{"start":{"line":56,"column":6},"end":{"line":59,"column":5}},"locations":[{"start":{"line":56,"column":6},"end":{"line":59,"column":5}}]},"3":{"type":"branch","line":62,"loc":{"start":{"line":62,"column":2},"end":{"line":95,"column":3}},"locations":[{"start":{"line":62,"column":2},"end":{"line":95,"column":3}}]},"4":{"type":"branch","line":91,"loc":{"start":{"line":91,"column":6},"end":{"line":94,"column":5}},"locations":[{"start":{"line":91,"column":6},"end":{"line":94,"column":5}}]},"5":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":2},"end":{"line":126,"column":3}},"locations":[{"start":{"line":97,"column":2},"end":{"line":126,"column":3}}]},"6":{"type":"branch","line":122,"loc":{"start":{"line":122,"column":6},"end":{"line":125,"column":5}},"locations":[{"start":{"line":122,"column":6},"end":{"line":125,"column":5}}]},"7":{"type":"branch","line":128,"loc":{"start":{"line":128,"column":2},"end":{"line":157,"column":3}},"locations":[{"start":{"line":128,"column":2},"end":{"line":157,"column":3}}]},"8":{"type":"branch","line":153,"loc":{"start":{"line":153,"column":6},"end":{"line":156,"column":5}},"locations":[{"start":{"line":153,"column":6},"end":{"line":156,"column":5}}]},"9":{"type":"branch","line":159,"loc":{"start":{"line":159,"column":2},"end":{"line":188,"column":3}},"locations":[{"start":{"line":159,"column":2},"end":{"line":188,"column":3}}]},"10":{"type":"branch","line":169,"loc":{"start":{"line":169,"column":31},"end":{"line":171,"column":5}},"locations":[{"start":{"line":169,"column":31},"end":{"line":171,"column":5}}]},"11":{"type":"branch","line":172,"loc":{"start":{"line":172,"column":-1},"end":{"line":176,"column":46}},"locations":[{"start":{"line":172,"column":-1},"end":{"line":176,"column":46}}]},"12":{"type":"branch","line":186,"loc":{"start":{"line":186,"column":-1},"end":{"line":188,"column":3}},"locations":[{"start":{"line":186,"column":-1},"end":{"line":188,"column":3}}]},"13":{"type":"branch","line":190,"loc":{"start":{"line":190,"column":10},"end":{"line":207,"column":3}},"locations":[{"start":{"line":190,"column":10},"end":{"line":207,"column":3}}]},"14":{"type":"branch","line":198,"loc":{"start":{"line":198,"column":6},"end":{"line":199,"column":70}},"locations":[{"start":{"line":198,"column":6},"end":{"line":199,"column":70}}]},"15":{"type":"branch","line":200,"loc":{"start":{"line":200,"column":6},"end":{"line":201,"column":54}},"locations":[{"start":{"line":200,"column":6},"end":{"line":201,"column":54}}]},"16":{"type":"branch","line":202,"loc":{"start":{"line":202,"column":6},"end":{"line":203,"column":57}},"locations":[{"start":{"line":202,"column":6},"end":{"line":203,"column":57}}]},"17":{"type":"branch","line":204,"loc":{"start":{"line":204,"column":6},"end":{"line":205,"column":51}},"locations":[{"start":{"line":204,"column":6},"end":{"line":205,"column":51}}]},"18":{"type":"branch","line":209,"loc":{"start":{"line":209,"column":10},"end":{"line":218,"column":3}},"locations":[{"start":{"line":209,"column":10},"end":{"line":218,"column":3}}]},"19":{"type":"branch","line":220,"loc":{"start":{"line":220,"column":10},"end":{"line":237,"column":3}},"locations":[{"start":{"line":220,"column":10},"end":{"line":237,"column":3}}]},"20":{"type":"branch","line":239,"loc":{"start":{"line":239,"column":10},"end":{"line":247,"column":3}},"locations":[{"start":{"line":239,"column":10},"end":{"line":247,"column":3}}]},"21":{"type":"branch","line":249,"loc":{"start":{"line":249,"column":10},"end":{"line":263,"column":3}},"locations":[{"start":{"line":249,"column":10},"end":{"line":263,"column":3}}]},"22":{"type":"branch","line":265,"loc":{"start":{"line":265,"column":10},"end":{"line":278,"column":3}},"locations":[{"start":{"line":265,"column":10},"end":{"line":278,"column":3}}]},"23":{"type":"branch","line":280,"loc":{"start":{"line":280,"column":10},"end":{"line":296,"column":3}},"locations":[{"start":{"line":280,"column":10},"end":{"line":296,"column":3}}]},"24":{"type":"branch","line":298,"loc":{"start":{"line":298,"column":10},"end":{"line":308,"column":3}},"locations":[{"start":{"line":298,"column":10},"end":{"line":308,"column":3}}]},"25":{"type":"branch","line":299,"loc":{"start":{"line":299,"column":25},"end":{"line":299,"column":34}},"locations":[{"start":{"line":299,"column":25},"end":{"line":299,"column":34}}]},"26":{"type":"branch","line":300,"loc":{"start":{"line":300,"column":-1},"end":{"line":308,"column":3}},"locations":[{"start":{"line":300,"column":-1},"end":{"line":308,"column":3}}]},"27":{"type":"branch","line":310,"loc":{"start":{"line":310,"column":10},"end":{"line":331,"column":3}},"locations":[{"start":{"line":310,"column":10},"end":{"line":331,"column":3}}]},"28":{"type":"branch","line":312,"loc":{"start":{"line":312,"column":6},"end":{"line":313,"column":17}},"locations":[{"start":{"line":312,"column":6},"end":{"line":313,"column":17}}]},"29":{"type":"branch","line":314,"loc":{"start":{"line":314,"column":6},"end":{"line":315,"column":17}},"locations":[{"start":{"line":314,"column":6},"end":{"line":315,"column":17}}]},"30":{"type":"branch","line":316,"loc":{"start":{"line":316,"column":6},"end":{"line":317,"column":18}},"locations":[{"start":{"line":316,"column":6},"end":{"line":317,"column":18}}]},"31":{"type":"branch","line":318,"loc":{"start":{"line":318,"column":6},"end":{"line":319,"column":19}},"locations":[{"start":{"line":318,"column":6},"end":{"line":319,"column":19}}]},"32":{"type":"branch","line":320,"loc":{"start":{"line":320,"column":6},"end":{"line":321,"column":19}},"locations":[{"start":{"line":320,"column":6},"end":{"line":321,"column":19}}]},"33":{"type":"branch","line":322,"loc":{"start":{"line":322,"column":6},"end":{"line":323,"column":20}},"locations":[{"start":{"line":322,"column":6},"end":{"line":323,"column":20}}]},"34":{"type":"branch","line":324,"loc":{"start":{"line":324,"column":6},"end":{"line":325,"column":20}},"locations":[{"start":{"line":324,"column":6},"end":{"line":325,"column":20}}]},"35":{"type":"branch","line":326,"loc":{"start":{"line":326,"column":6},"end":{"line":327,"column":20}},"locations":[{"start":{"line":326,"column":6},"end":{"line":327,"column":20}}]},"36":{"type":"branch","line":328,"loc":{"start":{"line":328,"column":6},"end":{"line":329,"column":17}},"locations":[{"start":{"line":328,"column":6},"end":{"line":329,"column":17}}]},"37":{"type":"branch","line":333,"loc":{"start":{"line":333,"column":10},"end":{"line":339,"column":3}},"locations":[{"start":{"line":333,"column":10},"end":{"line":339,"column":3}}]},"38":{"type":"branch","line":341,"loc":{"start":{"line":341,"column":10},"end":{"line":366,"column":3}},"locations":[{"start":{"line":341,"column":10},"end":{"line":366,"column":3}}]},"39":{"type":"branch","line":363,"loc":{"start":{"line":363,"column":29},"end":{"line":363,"column":32}},"locations":[{"start":{"line":363,"column":29},"end":{"line":363,"column":32}}]},"40":{"type":"branch","line":346,"loc":{"start":{"line":346,"column":31},"end":{"line":346,"column":69}},"locations":[{"start":{"line":346,"column":31},"end":{"line":346,"column":69}}]},"41":{"type":"branch","line":348,"loc":{"start":{"line":348,"column":30},"end":{"line":348,"column":67}},"locations":[{"start":{"line":348,"column":30},"end":{"line":348,"column":67}}]},"42":{"type":"branch","line":350,"loc":{"start":{"line":350,"column":20},"end":{"line":350,"column":55}},"locations":[{"start":{"line":350,"column":20},"end":{"line":350,"column":55}}]},"43":{"type":"branch","line":354,"loc":{"start":{"line":354,"column":8},"end":{"line":354,"column":62}},"locations":[{"start":{"line":354,"column":8},"end":{"line":354,"column":62}}]},"44":{"type":"branch","line":360,"loc":{"start":{"line":360,"column":33},"end":{"line":360,"column":52}},"locations":[{"start":{"line":360,"column":33},"end":{"line":360,"column":52}}]},"45":{"type":"branch","line":361,"loc":{"start":{"line":361,"column":35},"end":{"line":361,"column":75}},"locations":[{"start":{"line":361,"column":35},"end":{"line":361,"column":75}}]},"46":{"type":"branch","line":362,"loc":{"start":{"line":362,"column":37},"end":{"line":362,"column":72}},"locations":[{"start":{"line":362,"column":37},"end":{"line":362,"column":72}}]},"47":{"type":"branch","line":368,"loc":{"start":{"line":368,"column":2},"end":{"line":382,"column":3}},"locations":[{"start":{"line":368,"column":2},"end":{"line":382,"column":3}}]},"48":{"type":"branch","line":372,"loc":{"start":{"line":372,"column":8},"end":{"line":372,"column":75}},"locations":[{"start":{"line":372,"column":8},"end":{"line":372,"column":75}}]},"49":{"type":"branch","line":372,"loc":{"start":{"line":372,"column":31},"end":{"line":372,"column":56}},"locations":[{"start":{"line":372,"column":31},"end":{"line":372,"column":56}}]},"50":{"type":"branch","line":372,"loc":{"start":{"line":372,"column":56},"end":{"line":372,"column":75}},"locations":[{"start":{"line":372,"column":56},"end":{"line":372,"column":75}}]},"51":{"type":"branch","line":374,"loc":{"start":{"line":374,"column":12},"end":{"line":374,"column":67}},"locations":[{"start":{"line":374,"column":12},"end":{"line":374,"column":67}}]},"52":{"type":"branch","line":375,"loc":{"start":{"line":375,"column":11},"end":{"line":381,"column":8}},"locations":[{"start":{"line":375,"column":11},"end":{"line":381,"column":8}}]},"53":{"type":"branch","line":379,"loc":{"start":{"line":379,"column":19},"end":{"line":379,"column":39}},"locations":[{"start":{"line":379,"column":19},"end":{"line":379,"column":39}}]},"54":{"type":"branch","line":384,"loc":{"start":{"line":384,"column":10},"end":{"line":394,"column":3}},"locations":[{"start":{"line":384,"column":10},"end":{"line":394,"column":3}}]},"55":{"type":"branch","line":391,"loc":{"start":{"line":391,"column":28},"end":{"line":391,"column":46}},"locations":[{"start":{"line":391,"column":28},"end":{"line":391,"column":46}}]},"56":{"type":"branch","line":392,"loc":{"start":{"line":392,"column":28},"end":{"line":392,"column":46}},"locations":[{"start":{"line":392,"column":28},"end":{"line":392,"column":46}}]},"57":{"type":"branch","line":393,"loc":{"start":{"line":393,"column":-1},"end":{"line":394,"column":3}},"locations":[{"start":{"line":393,"column":-1},"end":{"line":394,"column":3}}]},"58":{"type":"branch","line":396,"loc":{"start":{"line":396,"column":10},"end":{"line":404,"column":3}},"locations":[{"start":{"line":396,"column":10},"end":{"line":404,"column":3}}]},"59":{"type":"branch","line":397,"loc":{"start":{"line":397,"column":39},"end":{"line":397,"column":54}},"locations":[{"start":{"line":397,"column":39},"end":{"line":397,"column":54}}]},"60":{"type":"branch","line":406,"loc":{"start":{"line":406,"column":10},"end":{"line":416,"column":3}},"locations":[{"start":{"line":406,"column":10},"end":{"line":416,"column":3}}]},"61":{"type":"branch","line":411,"loc":{"start":{"line":411,"column":31},"end":{"line":415,"column":5}},"locations":[{"start":{"line":411,"column":31},"end":{"line":415,"column":5}}]}},"b":{"0":[17],"1":[4],"2":[1],"3":[1],"4":[0],"5":[1],"6":[0],"7":[1],"8":[0],"9":[2],"10":[0],"11":[1],"12":[1],"13":[2],"14":[0],"15":[0],"16":[0],"17":[0],"18":[3],"19":[3],"20":[1],"21":[1],"22":[1],"23":[1],"24":[8],"25":[1],"26":[7],"27":[11],"28":[7],"29":[1],"30":[1],"31":[1],"32":[0],"33":[0],"34":[0],"35":[1],"36":[0],"37":[6],"38":[1],"39":[0],"40":[2],"41":[2],"42":[2],"43":[2],"44":[2],"45":[2],"46":[2],"47":[2],"48":[5],"49":[4],"50":[4],"51":[5],"52":[4],"53":[20],"54":[6],"55":[0],"56":[1],"57":[5],"58":[16],"59":[135],"60":[9],"61":[2]},"fnMap":{"0":{"name":"TimeSeriesService","decl":{"start":{"line":31,"column":7},"end":{"line":417,"column":1}},"loc":{"start":{"line":31,"column":7},"end":{"line":417,"column":1}},"line":31},"1":{"name":"arimaForecast","decl":{"start":{"line":34,"column":2},"end":{"line":60,"column":3}},"loc":{"start":{"line":34,"column":2},"end":{"line":60,"column":3}},"line":34},"2":{"name":"exponentialSmoothingForecast","decl":{"start":{"line":62,"column":2},"end":{"line":95,"column":3}},"loc":{"start":{"line":62,"column":2},"end":{"line":95,"column":3}},"line":62},"3":{"name":"lstmForecast","decl":{"start":{"line":97,"column":2},"end":{"line":126,"column":3}},"loc":{"start":{"line":97,"column":2},"end":{"line":126,"column":3}},"line":97},"4":{"name":"prophetForecast","decl":{"start":{"line":128,"column":2},"end":{"line":157,"column":3}},"loc":{"start":{"line":128,"column":2},"end":{"line":157,"column":3}},"line":128},"5":{"name":"evaluateModel","decl":{"start":{"line":159,"column":2},"end":{"line":188,"column":3}},"loc":{"start":{"line":159,"column":2},"end":{"line":188,"column":3}},"line":159},"6":{"name":"runModel","decl":{"start":{"line":190,"column":10},"end":{"line":207,"column":3}},"loc":{"start":{"line":190,"column":10},"end":{"line":207,"column":3}},"line":190},"7":{"name":"optimizeARIMAParams","decl":{"start":{"line":209,"column":10},"end":{"line":218,"column":3}},"loc":{"start":{"line":209,"column":10},"end":{"line":218,"column":3}},"line":209},"8":{"name":"fitARIMA","decl":{"start":{"line":220,"column":10},"end":{"line":237,"column":3}},"loc":{"start":{"line":220,"column":10},"end":{"line":237,"column":3}},"line":220},"9":{"name":"optimizeExponentialSmoothingParams","decl":{"start":{"line":239,"column":10},"end":{"line":247,"column":3}},"loc":{"start":{"line":239,"column":10},"end":{"line":247,"column":3}},"line":239},"10":{"name":"fitExponentialSmoothing","decl":{"start":{"line":249,"column":10},"end":{"line":263,"column":3}},"loc":{"start":{"line":249,"column":10},"end":{"line":263,"column":3}},"line":249},"11":{"name":"fitLSTM","decl":{"start":{"line":265,"column":10},"end":{"line":278,"column":3}},"loc":{"start":{"line":265,"column":10},"end":{"line":278,"column":3}},"line":265},"12":{"name":"fitProphet","decl":{"start":{"line":280,"column":10},"end":{"line":296,"column":3}},"loc":{"start":{"line":280,"column":10},"end":{"line":296,"column":3}},"line":280},"13":{"name":"calculateTrend","decl":{"start":{"line":298,"column":10},"end":{"line":308,"column":3}},"loc":{"start":{"line":298,"column":10},"end":{"line":308,"column":3}},"line":298},"14":{"name":"getHorizonPeriods","decl":{"start":{"line":310,"column":10},"end":{"line":331,"column":3}},"loc":{"start":{"line":310,"column":10},"end":{"line":331,"column":3}},"line":310},"15":{"name":"calculateAccuracy","decl":{"start":{"line":333,"column":10},"end":{"line":339,"column":3}},"loc":{"start":{"line":333,"column":10},"end":{"line":339,"column":3}},"line":333},"16":{"name":"calculateMetrics","decl":{"start":{"line":341,"column":10},"end":{"line":366,"column":3}},"loc":{"start":{"line":341,"column":10},"end":{"line":366,"column":3}},"line":341},"17":{"name":"preprocessData","decl":{"start":{"line":368,"column":2},"end":{"line":382,"column":3}},"loc":{"start":{"line":368,"column":2},"end":{"line":382,"column":3}},"line":368},"18":{"name":"outlierDetection","decl":{"start":{"line":384,"column":10},"end":{"line":394,"column":3}},"loc":{"start":{"line":384,"column":10},"end":{"line":394,"column":3}},"line":384},"19":{"name":"percentile","decl":{"start":{"line":396,"column":10},"end":{"line":404,"column":3}},"loc":{"start":{"line":396,"column":10},"end":{"line":404,"column":3}},"line":396},"20":{"name":"ensureSufficientData","decl":{"start":{"line":406,"column":10},"end":{"line":416,"column":3}},"loc":{"start":{"line":406,"column":10},"end":{"line":416,"column":3}},"line":406}},"f":{"0":17,"1":4,"2":1,"3":1,"4":1,"5":2,"6":2,"7":3,"8":3,"9":1,"10":1,"11":1,"12":1,"13":8,"14":11,"15":6,"16":1,"17":2,"18":6,"19":16,"20":9}} +,"/workspaces/CurrentDao-backend/src/forecasting/prediction/trend-prediction.service.ts": {"path":"/workspaces/CurrentDao-backend/src/forecasting/prediction/trend-prediction.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":63}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":67}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":70}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":28}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":1}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":27}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":34}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":28}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":25}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":26}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":19}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":1}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":37}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":22}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":23}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":1}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":37}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":68}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":27}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":37}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":32}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":34}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":31}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":9}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":30}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":79}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":40}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":48}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":42}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":50}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":15}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":50}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":25}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":24}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":8}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":61}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":14}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":45}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":43}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":47}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":59}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":55}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":73}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":44}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":27}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":25}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":10}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":51}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":25}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":26}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":10}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":67}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":73}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":21}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":65}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":5}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":26}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":37}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":28}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":13}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":22}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":24}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":25}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":7}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":28}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":24}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":24}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":25}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":13}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":62}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":61}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":50}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":27}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":23}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":8}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":61}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":34}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":24}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":21}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":49}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":32}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":37}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":11}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":7}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":5}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":18}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":30}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":37}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":51}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":30}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":28}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":39}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":46}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":53}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":22}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":22}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":6}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":32}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":30}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":66}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":33}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":53}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":68}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":34}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":19}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":37}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":36}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":28}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":46}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":25}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":73}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":58}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":24}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":67}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":52}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":24}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":71}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":56}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":23}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":69}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":54}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":71}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":56}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":20}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":3}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":28}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":37}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":28}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":20}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":20}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":50}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":6}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":28}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":45}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":57}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":58}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":62}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":14}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":17}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":68}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":19}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":60}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":31}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":78}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":39}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":3}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":67}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":44}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":51}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":0}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":24}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":43}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":43}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":45}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":12}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":41}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":13}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":39}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":24}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":61}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":24}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":52}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":17}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":51}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":6}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":65}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":46}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":0}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":63}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":64}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":27}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":24}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":62}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":27}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":52}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":40}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":8}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":6}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":12}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":66}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":57}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":26}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":62}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":71}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":6}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":3}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":0}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":68}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":47}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":57}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":69}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":12}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":67}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":53}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":25}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":27}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":8}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":51}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":28}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":30}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":8}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":59}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":28}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":30}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":8}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":75}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":6}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":3}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":76}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":21}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":21}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":19}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":20}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":6}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":56}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":16}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":14}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":15}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":14}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":6}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":54}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":16}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":14}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":15}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":14}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":6}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":58}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":16}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":14}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":15}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":6}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":12}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":55}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":52}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":34}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":51}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":23}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":22}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":8}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":6}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":3}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":0}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":74}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":51}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":14}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":14}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":3}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":62}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":20}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":78}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":50}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":36}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":39}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":40}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":23}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":3}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":30}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":17}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":35}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":15}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":31}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":77}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":48}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":40}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":35}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":49}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":47}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":7}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":7}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":17}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":29}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":19}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":17}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":18}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":15}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":33}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":57}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":37}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":5}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":59}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":41}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":5}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":0}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":61}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":42}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":5}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":19}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":3}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":79}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":17}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":33}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":44}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":0}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":77}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":50}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":49}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":58}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":23}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":42}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":7}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":5}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":0}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":21}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":3}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":68}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":44}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":34}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":41}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":51}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":50}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":46}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":33}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":7}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":5}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":33}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":68}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":3}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":0}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":71}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":44}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":37}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":0}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":45}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":51}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":50}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":46}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":36}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":7}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":5}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":33}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":71}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":3}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":0}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":22}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":29}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":37}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":10}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":21}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":66}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":23}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":59}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":28}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":0}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":59}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":0}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":12}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":49}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":34}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":53}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":6}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":3}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":0}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":32}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":27}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":29}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":19}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":38}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":23}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":8}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":46}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":43}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":7}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":58}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":39}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":15}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":48}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":43}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":7}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":58}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":41}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":12}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":20}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":40}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":5}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":12}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":11}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":33}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":13}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":33}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":35}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":6}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":3}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":0}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":71}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":39}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":0}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":33}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":20}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":21}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":22}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":56}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":35}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":24}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":9}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":5}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":0}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":39}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":20}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":21}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":22}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":51}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":35}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":24}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":9}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":5}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":0}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":19}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":3}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":0}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":72}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":39}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":0}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":28}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":44}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":20}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":20}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":22}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":49}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":32}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":24}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":9}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":7}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":0}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":31}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":47}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":20}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":21}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":22}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":52}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":32}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":24}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":9}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":7}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":0}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":19}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":3}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":0}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":37}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":66}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":41}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":77}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":24}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":3}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":0}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":66}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":46}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":0}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":42}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":71}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":6}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":62}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":26}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":27}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":30}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":22}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":0}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":19}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":69}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":19}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":71}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":0}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":34}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":33}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":32}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":3}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":0}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":48}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":48}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":48}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":35}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":56}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":0}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":12}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":21}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":25}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":39}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":6}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":3}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":0}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":66}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":38}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":46}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":0}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":40}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":24}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":0}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":45}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":60}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":5}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":0}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":15}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":3}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":0}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":34}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":21}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":19}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":19}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":10}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":73}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":0}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":53}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":47}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":20}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":26}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":58}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":10}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":17}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":50}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":0}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":12}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":49}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":13}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":49}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":6}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":3}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":0}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":54}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":21}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":66}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":24}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":63}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":0}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":12}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":28}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":25}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":70}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":6}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":3}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":0}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":71}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":45}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":46}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":56}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":51}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":3}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":0}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":62}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":33}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":43}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":25}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":64}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":32}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":5}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":19}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":3}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":0}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":37}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":22}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":23}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":15}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":38}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":0}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":55}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":54}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":77}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":22}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":71}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":22}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":76}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":5}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":0}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":24}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":3}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":0}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":35}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":31}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":45}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":53}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":0}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":38}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":63}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":42}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":0}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":42}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":43}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":20}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":3}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":0}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":30}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":33}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":27}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":32}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":46}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":44}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":40}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":0}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":54}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":37}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":57}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":50}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":60}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":0}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":8}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":28}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":29}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":65}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":7}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":14}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":38}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":24}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":57}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":52}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":33}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":8}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":5}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":0}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":16}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":3}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":0}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":30}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":27}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":32}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":44}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":40}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":0}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":37}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":41}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":0}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":28}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":48}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":49}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":0}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":10}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":72}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":12}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":9}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":16}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":32}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":26}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":50}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":51}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":34}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":10}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":7}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":5}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":0}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":16}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":3}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":0}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":32}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":27}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":32}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":44}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":14}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":16}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":3}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":0}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":31}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":27}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":32}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":43}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":14}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":16}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":3}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":0}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":32}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":27}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":32}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":44}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":14}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":16}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":3}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":0}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":80}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":62}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":0}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":49}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":67}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":51}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":7}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":5}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":0}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":17}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":3}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":0}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":72}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":35}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":43}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":45}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":0}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":17}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":70}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":17}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":70}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":0}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":26}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":3}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":0}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":42}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":34}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":19}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":17}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":18}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":17}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":13}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":18}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":0}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":20}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":65}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":5}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":0}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":18}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":55}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":5}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":0}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":19}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":57}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":5}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":0}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":44}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":3}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":0}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":33}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":19}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":17}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":18}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":17}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":13}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":21}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":0}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":20}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":74}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":5}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":0}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":18}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":68}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":5}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":0}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":19}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":70}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":5}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":0}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":46}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":3}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":0}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":35}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":19}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":17}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":18}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":13}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":44}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":20}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":0}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":20}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":24}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":16}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":5}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":0}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":18}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":24}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":16}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":5}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":0}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":19}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":24}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":16}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":5}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":0}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":63}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":3}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":0}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":59}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":46}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":49}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":62}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":35}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":3}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":0}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":57}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":54}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":49}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":51}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":30}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":3}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":0}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":34}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":27}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":26}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":13}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":67}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":3}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":0}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":32}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":60}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":57}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":47}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":62}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":3}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":0}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":58}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":44}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":66}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":5}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":13}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":3}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":0}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":71}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":62}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":3}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":0}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":77}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":36}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":12}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":56}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":47}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":59}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":6}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":77}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":3}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":0}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":33}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":73}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":51}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":24}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":3}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":0}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":79}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":38}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":25}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":3}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":0}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":78}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":38}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":26}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":3}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":0}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":38}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":20}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":21}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":13}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":38}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":26}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":3}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":0}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":41}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":26}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":27}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":13}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":21}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":57}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":75}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":80}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":39}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":29}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":30}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":8}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":6}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":77}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":3}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":961,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":961,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":961,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":961,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/fraud/fraud-detection.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/fraud-detection.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":6}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":7}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":11}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":24}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":10}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":15}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":11}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":11}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":25}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":80}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":84}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":79}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":55}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":83}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":8}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":25}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":31}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":61}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":14}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":60}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":65}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":63}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":47}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":63}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":6}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":78}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":18}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":26}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":68}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":78}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":66}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":57}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":62}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":27}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":26}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":64}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":71}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":59}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":65}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":56}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":41}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":34}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":46}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":30}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":27}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":34}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":53}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":26}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":25}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":7}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":74}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":78}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":15}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":17}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":65}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":69}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":58}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":54}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":74}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":13}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":58}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":4}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":58}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":57}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":32}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":73}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":59}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":74}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":78}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":25}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":40}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":28}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":31}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":50}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":15}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":20}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":6}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":19}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":54}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":59}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":66}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":62}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":46}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":49}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":3}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":78}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":21}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":65}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":63}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":63}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":45}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":31}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":7}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":39}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":73}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":13}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":53}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":74}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":54}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":57}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":3}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":79}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":27}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":26}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":71}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":61}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":55}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":26}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":26}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":70}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":60}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":55}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":55}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":27}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":17}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":65}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":4}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":31}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":53}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":3}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":79}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":55}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":20}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":39}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":35}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":50}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":39}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":15}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":13}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":25}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":20}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":6}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":51}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":29}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":26}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":48}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":59}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":67}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":12}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":78}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":15}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":6}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":3}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":28}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":63}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":29}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":54}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":3}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":35}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":26}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":61}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":60}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":52}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":62}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":3}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":38}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":26}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":66}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":65}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":57}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":66}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":3}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":79}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":17}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":66}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":72}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":22}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":73}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":41}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":67}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":56}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":7}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":12}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":30}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":25}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":34}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":20}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":60}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":6}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":3}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":79}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":18}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":17}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":66}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":4}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":67}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":23}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":12}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":63}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":67}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":6}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":3}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":79}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":64}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":64}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":24}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":44}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":3}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":267,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":267,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":267,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":267,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/fraud/fraud-detection.module.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/fraud-detection.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":63}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":83}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":80}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":84}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":79}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":72}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":57}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":42}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":30}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":27}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":30}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":36}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":36}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/fraud/dto/fraud-alert.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/dto/fraud-alert.dto.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":10}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":6}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":6}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":15}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":12}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":25}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":67}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":12}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":16}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":39}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":79}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":53}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":80}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":65}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":62}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":66}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":15}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":26}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":79}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":13}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":16}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":70}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":4}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":70}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":55}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":13}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":59}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":21}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":58}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":23}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":66}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":38}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":41}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":71}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":32}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":38}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":76}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":15}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":26}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":68}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":15}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":13}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":37}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":1}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":80}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":36}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":16}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":28}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":46}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":12}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":28}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":1}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":79}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":31}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":16}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":13}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":16}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":13}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":17}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":16}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":13}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":15}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":19}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":16}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":13}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":15}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":16}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":26}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":23}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":24}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":15}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":13}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":26}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":80}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":37}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":41}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":26}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":26}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":61}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":15}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":13}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":18}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":30}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":67}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":15}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":13}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":22}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":78}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":15}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":13}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":18}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":31}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":64}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":15}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":13}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":22}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":1}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":80}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":34}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":43}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":15}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":20}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":47}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":15}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":24}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":27}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":49}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":15}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":62}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":15}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":13}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":20}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":64}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":15}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":17}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":21}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":62}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":15}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":17}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":19}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":66}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":15}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":13}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":9}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":16}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":70}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":15}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":13}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":9}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":11}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":17}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":72}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":15}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":13}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":9}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":9}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":22}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":74}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":15}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":14}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":31}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":1}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":80}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":38}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":17}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":18}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":24}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":26}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":26}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":40}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":27}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":28}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":27}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":1}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":37}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":20}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":22}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":19}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":19}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":21}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":19}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":1}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":31}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":15}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":22}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":17}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":18}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":1}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":38}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":19}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":20}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":20}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":50}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":1}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":31}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":21}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":20}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":24}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":25}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":28}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":24}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":26}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":23}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":25}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":38}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":42}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":37}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1},"branchMap":{"0":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":9},"end":{"line":24,"column":18}},"locations":[{"start":{"line":24,"column":9},"end":{"line":24,"column":18}}]},"1":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":20},"end":{"line":24,"column":33}},"locations":[{"start":{"line":24,"column":20},"end":{"line":24,"column":33}}]}},"b":{"0":[44],"1":[125]},"fnMap":{"0":{"name":"get","decl":{"start":{"line":24,"column":9},"end":{"line":24,"column":18}},"loc":{"start":{"line":24,"column":9},"end":{"line":24,"column":18}},"line":24},"1":{"name":"get","decl":{"start":{"line":24,"column":20},"end":{"line":24,"column":33}},"loc":{"start":{"line":24,"column":20},"end":{"line":24,"column":33}},"line":24},"2":{"name":"get","decl":{"start":{"line":24,"column":35},"end":{"line":24,"column":50}},"loc":{"start":{"line":24,"column":35},"end":{"line":24,"column":50}},"line":24}},"f":{"0":44,"1":125,"2":0}} +,"/workspaces/CurrentDao-backend/src/fraud/entities/fraud-case.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/entities/fraud-case.entity.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":23}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":32}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":24}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":24}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":46}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":34}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":58}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":38}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":42}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":42}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":42}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":40}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":46}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":36}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":27}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":16}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":24}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":16}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":34}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":36}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":46}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":1}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":22}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":30}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":30}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":33}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":13}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":44}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":47}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":18}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":32}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":10}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":54}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":25}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":11}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":23}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":17}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":20}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":31}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":4}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":23}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":11}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":31}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":26}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":11}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":17}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":26}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":34}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":26}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":11}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":21}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":20}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":17}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":13}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":54}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":70}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":30}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":60}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":63}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":64}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":21}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":11}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":32}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":4}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":30}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":11}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":31}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":4}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":29}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":56}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":34}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":50}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":72}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":29}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":11}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":34}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":4}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":30}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":50}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":21}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":50}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":19}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":52}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":23}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":45}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":17}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":49}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":11}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":24}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":20}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":18}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":13}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":19}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":4}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":21}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":43}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":18}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":43}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":18}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":5,"10":5,"11":5,"12":5,"13":5,"14":5,"15":5,"16":5,"17":5,"18":5,"19":5,"20":5,"21":5,"22":5,"23":5,"24":5,"25":5,"26":5,"27":1,"28":5,"29":5,"30":5,"31":5,"32":5,"33":5,"34":1,"35":5,"36":5,"37":5,"38":5,"39":5,"40":5,"41":5,"42":5,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1},"branchMap":{"0":{"type":"branch","line":10,"loc":{"start":{"line":10,"column":0},"end":{"line":27,"column":1}},"locations":[{"start":{"line":10,"column":0},"end":{"line":27,"column":1}}]},"1":{"type":"branch","line":29,"loc":{"start":{"line":29,"column":0},"end":{"line":34,"column":1}},"locations":[{"start":{"line":29,"column":0},"end":{"line":34,"column":1}}]},"2":{"type":"branch","line":36,"loc":{"start":{"line":36,"column":0},"end":{"line":43,"column":1}},"locations":[{"start":{"line":36,"column":0},"end":{"line":43,"column":1}}]}},"b":{"0":[5],"1":[5],"2":[5]},"fnMap":{},"f":{}} +,"/workspaces/CurrentDao-backend/src/fraud/ml/fraud-ml.service.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/ml/fraud-ml.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":64}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":15}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":12}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":26}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":28}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":31}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":27}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":25}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":36}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":28}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":28}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":23}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":27}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":60}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":69}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":71}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":58}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":36}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":51}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":54}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":48}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":74}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":47}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":14}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":38}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":70}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":6}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":82}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":36}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":5}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":76}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":33}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":68}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":43}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":71}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":32}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":62}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":77}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":53}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":25}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":49}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":44}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":62}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":30}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":70}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":64}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":54}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":52}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":22}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":101}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":6}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":33}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":76}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":12}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":12}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":15}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":15}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":22}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":23}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":6}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":3}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":78}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":26}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":30}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":29}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":17}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":12}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":76}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":63}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":58}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":65}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":59}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":57}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":32}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":56}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":67}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":70}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":41}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":54}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":14}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":6}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":31}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":21}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":29}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":13}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":71}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":45}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":48}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":59}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":20}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":8}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":70}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":6}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":3}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":69}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":72}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":53}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":48}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":40}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":39}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":39}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":39}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":45}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":3}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":65}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":46}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":71}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":42}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":41}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":41}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":47}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":70}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":60}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":79}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":3}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":68}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":72}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":60}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":8}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":32}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":51}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":7}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":31}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":5}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":61}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":16}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":3}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":66}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":50}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":36}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":8}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":63}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":6}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":3}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":0}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":79}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":67}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":64}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":49}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":3}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":72}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":71}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":46}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":65}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":66}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":75}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":16}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":3}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":30}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":30}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":29}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":13}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":51}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":77}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":42}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":3}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":78}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":72}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":72}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":61}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":55}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":59}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":26}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":52}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":29}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":30}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":29}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":38}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":30}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":31}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":26}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":6}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":18}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":62}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":69}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":5}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":96}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":55}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":53}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":3}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":57}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":53}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":49}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":50}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":29}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":62}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":35}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":36}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":18}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":23}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":3}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":78}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":24}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":25}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":30}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":29}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":21}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":37}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":27}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":40}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":18}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":37}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":78}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":39}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":23}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":9}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":39}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":18}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":31}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":151}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":16}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":41}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":42}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":10}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":23}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":9}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":5}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":42}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":39}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":20}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":82}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":41}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":23}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":9}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":5}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":42}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":18}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":34}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":99}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":37}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":23}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":9}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":5}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":42}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":18}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":35}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":114}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":35}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":23}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":9}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":5}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":17}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":78}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":0}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":80}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":45}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":48}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":5}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":43}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":65}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":26}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":35}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":16}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":7}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":38}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":15}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":57}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":22}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":30}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":32}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":41}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":30}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":6}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":49}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":20}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":3}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":0}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":65}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":25}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":29}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":30}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":25}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":11}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":42}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":24}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":67}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":27}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":43}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":44}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":32}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":48}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":40}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":29}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":38}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":3}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":78}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":94}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":66}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":26}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":27}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":12}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":28}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":74}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":77}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":5}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":3}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":29}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":59}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":65}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":12}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":38}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":40}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":42}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":50}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":49}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":6}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":3}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":13,"64":13,"65":13,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":125,"73":125,"74":125,"75":125,"76":125,"77":125,"78":125,"79":125,"80":125,"81":125,"82":125,"83":125,"84":125,"85":125,"86":125,"87":125,"88":125,"89":125,"90":125,"91":125,"92":125,"93":125,"94":125,"95":125,"96":125,"97":125,"98":125,"99":125,"100":125,"101":125,"102":0,"103":0,"104":125,"105":125,"106":125,"107":125,"108":125,"109":125,"110":125,"111":125,"112":125,"113":125,"114":1,"115":1,"116":1,"117":1,"118":125,"119":125,"120":125,"121":125,"122":125,"123":125,"124":125,"125":125,"126":125,"127":125,"128":125,"129":125,"130":125,"131":125,"132":125,"133":125,"134":125,"135":125,"136":125,"137":125,"138":1,"139":1,"140":125,"141":125,"142":125,"143":125,"144":125,"145":9,"146":9,"147":9,"148":9,"149":9,"150":9,"151":9,"152":1,"153":1,"154":125,"155":9,"156":9,"157":125,"158":125,"159":125,"160":125,"161":9,"162":9,"163":1,"164":1,"165":125,"166":125,"167":125,"168":125,"169":125,"170":123,"171":123,"172":1,"173":1,"174":125,"175":125,"176":125,"177":1,"178":1,"179":125,"180":125,"181":125,"182":125,"183":1,"184":125,"185":1,"186":1,"187":124,"188":124,"189":124,"190":1,"191":1,"192":125,"193":125,"194":125,"195":125,"196":125,"197":125,"198":125,"199":1,"200":1,"201":125,"202":125,"203":125,"204":125,"205":1,"206":1,"207":125,"208":125,"209":0,"210":0,"211":125,"212":0,"213":0,"214":1,"215":1,"216":125,"217":125,"218":125,"219":125,"220":125,"221":125,"222":125,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":125,"232":125,"233":125,"234":125,"235":125,"236":125,"237":125,"238":125,"239":125,"240":125,"241":125,"242":125,"243":125,"244":125,"245":125,"246":1250,"247":1250,"248":125,"249":125,"250":125,"251":125,"252":125,"253":125,"254":1,"255":1,"256":125,"257":125,"258":125,"259":125,"260":125,"261":1,"262":1,"263":125,"264":125,"265":125,"266":125,"267":125,"268":1,"269":1,"270":1,"271":1,"272":125,"273":125,"274":125,"275":125,"276":125,"277":125,"278":125,"279":125,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":125,"289":125,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"299":2,"300":125,"301":125,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":125,"311":125,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":125,"320":125,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":125,"329":125,"330":125,"331":1,"332":1,"333":1,"334":1,"335":125,"336":17,"337":17,"338":108,"339":108,"340":108,"341":108,"342":108,"343":108,"344":108,"345":108,"346":108,"347":108,"348":125,"349":125,"350":125,"351":125,"352":125,"353":125,"354":125,"355":125,"356":125,"357":125,"358":125,"359":1,"360":1,"361":1,"362":125,"363":125,"364":125,"365":125,"366":125,"367":125,"368":125,"369":125,"370":125,"371":125,"372":125,"373":125,"374":125,"375":125,"376":125,"377":125,"378":1,"379":1,"380":1,"381":1,"382":1,"383":2,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":2,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1},"branchMap":{"0":{"type":"branch","line":63,"loc":{"start":{"line":63,"column":2},"end":{"line":66,"column":6}},"locations":[{"start":{"line":63,"column":2},"end":{"line":66,"column":6}}]},"1":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":2},"end":{"line":114,"column":3}},"locations":[{"start":{"line":72,"column":2},"end":{"line":114,"column":3}}]},"2":{"type":"branch","line":102,"loc":{"start":{"line":102,"column":32},"end":{"line":104,"column":5}},"locations":[{"start":{"line":102,"column":32},"end":{"line":104,"column":5}}]},"3":{"type":"branch","line":118,"loc":{"start":{"line":118,"column":10},"end":{"line":138,"column":3}},"locations":[{"start":{"line":118,"column":10},"end":{"line":138,"column":3}}]},"4":{"type":"branch","line":136,"loc":{"start":{"line":136,"column":10},"end":{"line":136,"column":13}},"locations":[{"start":{"line":136,"column":10},"end":{"line":136,"column":13}}]},"5":{"type":"branch","line":140,"loc":{"start":{"line":140,"column":10},"end":{"line":152,"column":3}},"locations":[{"start":{"line":140,"column":10},"end":{"line":152,"column":3}}]},"6":{"type":"branch","line":144,"loc":{"start":{"line":144,"column":60},"end":{"line":144,"column":71}},"locations":[{"start":{"line":144,"column":60},"end":{"line":144,"column":71}}]},"7":{"type":"branch","line":145,"loc":{"start":{"line":145,"column":-1},"end":{"line":145,"column":41}},"locations":[{"start":{"line":145,"column":-1},"end":{"line":145,"column":41}}]},"8":{"type":"branch","line":145,"loc":{"start":{"line":145,"column":34},"end":{"line":145,"column":45}},"locations":[{"start":{"line":145,"column":34},"end":{"line":145,"column":45}}]},"9":{"type":"branch","line":146,"loc":{"start":{"line":146,"column":-1},"end":{"line":152,"column":3}},"locations":[{"start":{"line":146,"column":-1},"end":{"line":152,"column":3}}]},"10":{"type":"branch","line":154,"loc":{"start":{"line":154,"column":10},"end":{"line":163,"column":3}},"locations":[{"start":{"line":154,"column":10},"end":{"line":163,"column":3}}]},"11":{"type":"branch","line":155,"loc":{"start":{"line":155,"column":60},"end":{"line":155,"column":72}},"locations":[{"start":{"line":155,"column":60},"end":{"line":155,"column":72}}]},"12":{"type":"branch","line":156,"loc":{"start":{"line":156,"column":-1},"end":{"line":158,"column":36}},"locations":[{"start":{"line":156,"column":-1},"end":{"line":158,"column":36}}]},"13":{"type":"branch","line":158,"loc":{"start":{"line":158,"column":29},"end":{"line":158,"column":40}},"locations":[{"start":{"line":158,"column":29},"end":{"line":158,"column":40}}]},"14":{"type":"branch","line":159,"loc":{"start":{"line":159,"column":-1},"end":{"line":159,"column":35}},"locations":[{"start":{"line":159,"column":-1},"end":{"line":159,"column":35}}]},"15":{"type":"branch","line":159,"loc":{"start":{"line":159,"column":28},"end":{"line":159,"column":39}},"locations":[{"start":{"line":159,"column":28},"end":{"line":159,"column":39}}]},"16":{"type":"branch","line":160,"loc":{"start":{"line":160,"column":-1},"end":{"line":160,"column":35}},"locations":[{"start":{"line":160,"column":-1},"end":{"line":160,"column":35}}]},"17":{"type":"branch","line":160,"loc":{"start":{"line":160,"column":28},"end":{"line":160,"column":39}},"locations":[{"start":{"line":160,"column":28},"end":{"line":160,"column":39}}]},"18":{"type":"branch","line":161,"loc":{"start":{"line":161,"column":-1},"end":{"line":161,"column":35}},"locations":[{"start":{"line":161,"column":-1},"end":{"line":161,"column":35}}]},"19":{"type":"branch","line":161,"loc":{"start":{"line":161,"column":28},"end":{"line":161,"column":39}},"locations":[{"start":{"line":161,"column":28},"end":{"line":161,"column":39}}]},"20":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":-1},"end":{"line":163,"column":3}},"locations":[{"start":{"line":162,"column":-1},"end":{"line":163,"column":3}}]},"21":{"type":"branch","line":165,"loc":{"start":{"line":165,"column":10},"end":{"line":172,"column":3}},"locations":[{"start":{"line":165,"column":10},"end":{"line":172,"column":3}}]},"22":{"type":"branch","line":168,"loc":{"start":{"line":168,"column":31},"end":{"line":168,"column":42}},"locations":[{"start":{"line":168,"column":31},"end":{"line":168,"column":42}}]},"23":{"type":"branch","line":169,"loc":{"start":{"line":169,"column":30},"end":{"line":169,"column":41}},"locations":[{"start":{"line":169,"column":30},"end":{"line":169,"column":41}}]},"24":{"type":"branch","line":170,"loc":{"start":{"line":170,"column":30},"end":{"line":170,"column":41}},"locations":[{"start":{"line":170,"column":30},"end":{"line":170,"column":41}}]},"25":{"type":"branch","line":171,"loc":{"start":{"line":171,"column":-1},"end":{"line":172,"column":3}},"locations":[{"start":{"line":171,"column":-1},"end":{"line":172,"column":3}}]},"26":{"type":"branch","line":174,"loc":{"start":{"line":174,"column":10},"end":{"line":177,"column":3}},"locations":[{"start":{"line":174,"column":10},"end":{"line":177,"column":3}}]},"27":{"type":"branch","line":179,"loc":{"start":{"line":179,"column":10},"end":{"line":190,"column":3}},"locations":[{"start":{"line":179,"column":10},"end":{"line":190,"column":3}}]},"28":{"type":"branch","line":183,"loc":{"start":{"line":183,"column":29},"end":{"line":184,"column":51}},"locations":[{"start":{"line":183,"column":29},"end":{"line":184,"column":51}}]},"29":{"type":"branch","line":185,"loc":{"start":{"line":185,"column":6},"end":{"line":187,"column":5}},"locations":[{"start":{"line":185,"column":6},"end":{"line":187,"column":5}}]},"30":{"type":"branch","line":188,"loc":{"start":{"line":188,"column":-1},"end":{"line":190,"column":3}},"locations":[{"start":{"line":188,"column":-1},"end":{"line":190,"column":3}}]},"31":{"type":"branch","line":192,"loc":{"start":{"line":192,"column":10},"end":{"line":199,"column":3}},"locations":[{"start":{"line":192,"column":10},"end":{"line":199,"column":3}}]},"32":{"type":"branch","line":201,"loc":{"start":{"line":201,"column":10},"end":{"line":205,"column":3}},"locations":[{"start":{"line":201,"column":10},"end":{"line":205,"column":3}}]},"33":{"type":"branch","line":204,"loc":{"start":{"line":204,"column":35},"end":{"line":204,"column":41}},"locations":[{"start":{"line":204,"column":35},"end":{"line":204,"column":41}}]},"34":{"type":"branch","line":204,"loc":{"start":{"line":204,"column":42},"end":{"line":204,"column":48}},"locations":[{"start":{"line":204,"column":42},"end":{"line":204,"column":48}}]},"35":{"type":"branch","line":207,"loc":{"start":{"line":207,"column":10},"end":{"line":214,"column":3}},"locations":[{"start":{"line":207,"column":10},"end":{"line":214,"column":3}}]},"36":{"type":"branch","line":210,"loc":{"start":{"line":210,"column":-1},"end":{"line":212,"column":31}},"locations":[{"start":{"line":210,"column":-1},"end":{"line":212,"column":31}}]},"37":{"type":"branch","line":212,"loc":{"start":{"line":212,"column":32},"end":{"line":212,"column":62}},"locations":[{"start":{"line":212,"column":32},"end":{"line":212,"column":62}}]},"38":{"type":"branch","line":212,"loc":{"start":{"line":212,"column":64},"end":{"line":214,"column":3}},"locations":[{"start":{"line":212,"column":64},"end":{"line":214,"column":3}}]},"39":{"type":"branch","line":216,"loc":{"start":{"line":216,"column":10},"end":{"line":223,"column":3}},"locations":[{"start":{"line":216,"column":10},"end":{"line":223,"column":3}}]},"40":{"type":"branch","line":231,"loc":{"start":{"line":231,"column":10},"end":{"line":254,"column":3}},"locations":[{"start":{"line":231,"column":10},"end":{"line":254,"column":3}}]},"41":{"type":"branch","line":246,"loc":{"start":{"line":246,"column":61},"end":{"line":248,"column":5}},"locations":[{"start":{"line":246,"column":61},"end":{"line":248,"column":5}}]},"42":{"type":"branch","line":247,"loc":{"start":{"line":247,"column":53},"end":{"line":247,"column":58}},"locations":[{"start":{"line":247,"column":53},"end":{"line":247,"column":58}}]},"43":{"type":"branch","line":251,"loc":{"start":{"line":251,"column":21},"end":{"line":251,"column":55}},"locations":[{"start":{"line":251,"column":21},"end":{"line":251,"column":55}}]},"44":{"type":"branch","line":256,"loc":{"start":{"line":256,"column":10},"end":{"line":261,"column":3}},"locations":[{"start":{"line":256,"column":10},"end":{"line":261,"column":3}}]},"45":{"type":"branch","line":257,"loc":{"start":{"line":257,"column":23},"end":{"line":257,"column":53}},"locations":[{"start":{"line":257,"column":23},"end":{"line":257,"column":53}}]},"46":{"type":"branch","line":258,"loc":{"start":{"line":258,"column":23},"end":{"line":258,"column":49}},"locations":[{"start":{"line":258,"column":23},"end":{"line":258,"column":49}}]},"47":{"type":"branch","line":259,"loc":{"start":{"line":259,"column":22},"end":{"line":259,"column":50}},"locations":[{"start":{"line":259,"column":22},"end":{"line":259,"column":50}}]},"48":{"type":"branch","line":263,"loc":{"start":{"line":263,"column":10},"end":{"line":268,"column":3}},"locations":[{"start":{"line":263,"column":10},"end":{"line":268,"column":3}}]},"49":{"type":"branch","line":265,"loc":{"start":{"line":265,"column":12},"end":{"line":265,"column":35}},"locations":[{"start":{"line":265,"column":12},"end":{"line":265,"column":35}}]},"50":{"type":"branch","line":267,"loc":{"start":{"line":267,"column":11},"end":{"line":267,"column":21}},"locations":[{"start":{"line":267,"column":11},"end":{"line":267,"column":21}}]},"51":{"type":"branch","line":272,"loc":{"start":{"line":272,"column":10},"end":{"line":331,"column":3}},"locations":[{"start":{"line":272,"column":10},"end":{"line":331,"column":3}}]},"52":{"type":"branch","line":280,"loc":{"start":{"line":280,"column":39},"end":{"line":288,"column":5}},"locations":[{"start":{"line":280,"column":39},"end":{"line":288,"column":5}}]},"53":{"type":"branch","line":290,"loc":{"start":{"line":290,"column":38},"end":{"line":300,"column":5}},"locations":[{"start":{"line":290,"column":38},"end":{"line":300,"column":5}}]},"54":{"type":"branch","line":302,"loc":{"start":{"line":302,"column":41},"end":{"line":310,"column":5}},"locations":[{"start":{"line":302,"column":41},"end":{"line":310,"column":5}}]},"55":{"type":"branch","line":312,"loc":{"start":{"line":312,"column":41},"end":{"line":319,"column":5}},"locations":[{"start":{"line":312,"column":41},"end":{"line":319,"column":5}}]},"56":{"type":"branch","line":321,"loc":{"start":{"line":321,"column":41},"end":{"line":328,"column":5}},"locations":[{"start":{"line":321,"column":41},"end":{"line":328,"column":5}}]},"57":{"type":"branch","line":335,"loc":{"start":{"line":335,"column":10},"end":{"line":359,"column":3}},"locations":[{"start":{"line":335,"column":10},"end":{"line":359,"column":3}}]},"58":{"type":"branch","line":336,"loc":{"start":{"line":336,"column":44},"end":{"line":338,"column":5}},"locations":[{"start":{"line":336,"column":44},"end":{"line":338,"column":5}}]},"59":{"type":"branch","line":339,"loc":{"start":{"line":339,"column":-1},"end":{"line":349,"column":44}},"locations":[{"start":{"line":339,"column":-1},"end":{"line":349,"column":44}}]},"60":{"type":"branch","line":349,"loc":{"start":{"line":349,"column":44},"end":{"line":349,"column":50}},"locations":[{"start":{"line":349,"column":44},"end":{"line":349,"column":50}}]},"61":{"type":"branch","line":349,"loc":{"start":{"line":349,"column":51},"end":{"line":349,"column":56}},"locations":[{"start":{"line":349,"column":51},"end":{"line":349,"column":56}}]},"62":{"type":"branch","line":362,"loc":{"start":{"line":362,"column":10},"end":{"line":378,"column":3}},"locations":[{"start":{"line":362,"column":10},"end":{"line":378,"column":3}}]},"63":{"type":"branch","line":383,"loc":{"start":{"line":383,"column":2},"end":{"line":391,"column":3}},"locations":[{"start":{"line":383,"column":2},"end":{"line":391,"column":3}}]},"64":{"type":"branch","line":384,"loc":{"start":{"line":384,"column":25},"end":{"line":390,"column":5}},"locations":[{"start":{"line":384,"column":25},"end":{"line":390,"column":5}}]},"65":{"type":"branch","line":393,"loc":{"start":{"line":393,"column":2},"end":{"line":403,"column":3}},"locations":[{"start":{"line":393,"column":2},"end":{"line":403,"column":3}}]},"66":{"type":"branch","line":395,"loc":{"start":{"line":395,"column":32},"end":{"line":395,"column":60}},"locations":[{"start":{"line":395,"column":32},"end":{"line":395,"column":60}}]}},"b":{"0":[13],"1":[125],"2":[0],"3":[125],"4":[0],"5":[125],"6":[116],"7":[9],"8":[0],"9":[9],"10":[125],"11":[116],"12":[9],"13":[0],"14":[9],"15":[0],"16":[9],"17":[0],"18":[9],"19":[0],"20":[9],"21":[125],"22":[0],"23":[0],"24":[2],"25":[123],"26":[125],"27":[125],"28":[1],"29":[1],"30":[124],"31":[125],"32":[125],"33":[1],"34":[124],"35":[125],"36":[0],"37":[0],"38":[0],"39":[125],"40":[125],"41":[1250],"42":[0],"43":[0],"44":[125],"45":[0],"46":[0],"47":[0],"48":[125],"49":[2756],"50":[375],"51":[125],"52":[1],"53":[2],"54":[0],"55":[0],"56":[0],"57":[125],"58":[17],"59":[108],"60":[0],"61":[108],"62":[125],"63":[2],"64":[1],"65":[1],"66":[0]},"fnMap":{"0":{"name":"FraudMlService","decl":{"start":{"line":63,"column":2},"end":{"line":66,"column":6}},"loc":{"start":{"line":63,"column":2},"end":{"line":66,"column":6}},"line":63},"1":{"name":"analyzeTrade","decl":{"start":{"line":72,"column":2},"end":{"line":114,"column":3}},"loc":{"start":{"line":72,"column":2},"end":{"line":114,"column":3}},"line":72},"2":{"name":"extractFeatures","decl":{"start":{"line":118,"column":10},"end":{"line":138,"column":3}},"loc":{"start":{"line":118,"column":10},"end":{"line":138,"column":3}},"line":118},"3":{"name":"computeVolumeAnomaly","decl":{"start":{"line":140,"column":10},"end":{"line":152,"column":3}},"loc":{"start":{"line":140,"column":10},"end":{"line":152,"column":3}},"line":140},"4":{"name":"computeFrequencyAnomaly","decl":{"start":{"line":154,"column":10},"end":{"line":163,"column":3}},"loc":{"start":{"line":154,"column":10},"end":{"line":163,"column":3}},"line":154},"5":{"name":"computePriceImpact","decl":{"start":{"line":165,"column":10},"end":{"line":172,"column":3}},"loc":{"start":{"line":165,"column":10},"end":{"line":172,"column":3}},"line":165},"6":{"name":"computeOrderToTradeRatio","decl":{"start":{"line":174,"column":10},"end":{"line":177,"column":3}},"loc":{"start":{"line":174,"column":10},"end":{"line":177,"column":3}},"line":174},"7":{"name":"computeRoundTripScore","decl":{"start":{"line":179,"column":10},"end":{"line":190,"column":3}},"loc":{"start":{"line":179,"column":10},"end":{"line":190,"column":3}},"line":179},"8":{"name":"computeVelocityScore","decl":{"start":{"line":192,"column":10},"end":{"line":199,"column":3}},"loc":{"start":{"line":192,"column":10},"end":{"line":199,"column":3}},"line":192},"9":{"name":"computeCounterpartyConcentration","decl":{"start":{"line":201,"column":10},"end":{"line":205,"column":3}},"loc":{"start":{"line":201,"column":10},"end":{"line":205,"column":3}},"line":201},"10":{"name":"computeTimePatternAnomaly","decl":{"start":{"line":207,"column":10},"end":{"line":214,"column":3}},"loc":{"start":{"line":207,"column":10},"end":{"line":214,"column":3}},"line":207},"11":{"name":"computeMarketImpact","decl":{"start":{"line":216,"column":10},"end":{"line":223,"column":3}},"loc":{"start":{"line":216,"column":10},"end":{"line":223,"column":3}},"line":216},"12":{"name":"computeAnomalyScore","decl":{"start":{"line":231,"column":10},"end":{"line":254,"column":3}},"loc":{"start":{"line":231,"column":10},"end":{"line":254,"column":3}},"line":231},"13":{"name":"scoreToSeverity","decl":{"start":{"line":256,"column":10},"end":{"line":261,"column":3}},"loc":{"start":{"line":256,"column":10},"end":{"line":261,"column":3}},"line":256},"14":{"name":"getTopContributors","decl":{"start":{"line":263,"column":10},"end":{"line":268,"column":3}},"loc":{"start":{"line":263,"column":10},"end":{"line":268,"column":3}},"line":263},"15":{"name":"buildEvidence","decl":{"start":{"line":272,"column":10},"end":{"line":331,"column":3}},"loc":{"start":{"line":272,"column":10},"end":{"line":331,"column":3}},"line":272},"16":{"name":"getOrCreateBaseline","decl":{"start":{"line":335,"column":10},"end":{"line":359,"column":3}},"loc":{"start":{"line":335,"column":10},"end":{"line":359,"column":3}},"line":335},"17":{"name":"updateBaseline","decl":{"start":{"line":362,"column":10},"end":{"line":378,"column":3}},"loc":{"start":{"line":362,"column":10},"end":{"line":378,"column":3}},"line":362},"18":{"name":"recordFeedback","decl":{"start":{"line":383,"column":2},"end":{"line":391,"column":3}},"loc":{"start":{"line":383,"column":2},"end":{"line":391,"column":3}},"line":383},"19":{"name":"getModelMetrics","decl":{"start":{"line":393,"column":2},"end":{"line":403,"column":3}},"loc":{"start":{"line":393,"column":2},"end":{"line":403,"column":3}},"line":393}},"f":{"0":13,"1":125,"2":125,"3":125,"4":125,"5":125,"6":125,"7":125,"8":125,"9":125,"10":125,"11":125,"12":125,"13":125,"14":125,"15":125,"16":125,"17":125,"18":2,"19":1}} +,"/workspaces/CurrentDao-backend/src/fraud/monitoring/real-time-monitor.service.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/monitoring/real-time-monitor.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":40}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":39}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":56}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":84}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":85}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":80}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":78}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":36}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":18}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":34}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":21}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":13}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":37}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":68}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":53}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":73}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":78}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":57}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":71}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":44}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":67}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":51}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":53}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":42}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":59}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":14}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":38}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":70}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":47}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":63}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":65}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":63}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":6}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":78}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":68}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":36}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":5}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":30}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":35}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":71}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":74}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":77}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":39}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":50}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":61}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":28}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":65}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":26}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":68}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":48}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":46}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":8}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":7}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":62}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":56}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":78}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":33}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":63}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":49}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":76}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":28}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":57}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":74}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":25}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":23}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":51}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":22}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":17}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":26}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":8}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":37}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":52}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":41}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":32}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":34}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":29}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":15}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":17}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":39}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":34}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":76}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":23}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":6}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":33}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":79}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":18}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":57}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":49}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":46}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":77}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":13}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":5}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":38}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":15}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":28}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":23}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":20}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":30}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":6}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":49}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":62}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":42}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":48}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":49}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":64}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":5}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":3}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":37}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":33}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":40}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":55}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":42}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":36}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":20}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":85}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":6}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":3}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":36}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":32}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":34}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":45}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":37}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":57}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":5}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":3}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":33}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":12}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":50}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":55}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":52}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":65}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":46}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":43}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":6}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":78}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":68}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":25}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":49}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":76}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":13}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":0}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":22}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":69}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":6}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":78}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":52}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":32}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":11}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":47}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":76}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":7}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":5}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":44}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":62}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":48}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":3}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":42}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":51}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":51}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":34}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":60}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":46}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":7}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":91}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":6}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":3}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":43}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":43}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":55}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":63}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":80}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":7}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":36}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":51}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":42}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":9}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":23}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":70}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":8}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":5}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":3}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":78}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":28}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":21}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":29}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":20}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":70}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":61}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":37}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":50}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":62}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":56}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":38}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":6}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":38}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":23}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":98}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":8}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":27}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":5}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":3}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":70}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":64}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":56}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":52}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":5}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":65}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":40}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":35}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":65}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":35}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":3}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":76}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":56}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":38}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":39}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":3}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":63}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":46}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":17}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":30}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":25}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":22}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":32}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":7}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":6}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":3}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":24}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":20}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":46}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":13}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":53}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":27}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":61}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":29}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":46}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":59}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":28}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":67}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":66}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":57}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":53}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":49}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":50}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":29}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":3}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":0}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":80}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":62}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":71}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":42}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":82}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":44}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":79}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":5}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":67}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":3}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":36}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":73}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":65}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":3}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":32}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":30}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":18}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":28}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":22}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":20}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":20}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":31}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":41}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":55}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":13}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":32}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":34}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":46}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":44}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":15}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":35}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":21}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":55}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":58}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":15}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":18}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":32}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":38}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":36}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":30}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":28}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":8}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":30}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":36}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":38}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":32}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":61}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":23}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":66}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":7}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":65}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":0}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":42}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":8}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":40}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":41}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":7}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":53}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":5}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":21}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":111}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":6}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":0}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":17}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":3}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":27}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":32}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":34}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":3}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":14,"47":14,"48":14,"49":14,"50":14,"51":14,"52":14,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":6,"62":6,"63":6,"64":6,"65":6,"66":6,"67":6,"68":6,"69":6,"70":6,"71":6,"72":6,"73":6,"74":6,"75":6,"76":6,"77":6,"78":6,"79":6,"80":6,"81":6,"82":6,"83":6,"84":6,"85":6,"86":6,"87":6,"88":6,"89":6,"90":6,"91":6,"92":6,"93":6,"94":6,"95":6,"96":6,"97":6,"98":6,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":6,"110":6,"111":6,"112":6,"113":6,"114":6,"115":6,"116":6,"117":6,"118":6,"119":6,"120":6,"121":6,"122":6,"123":6,"124":6,"125":6,"126":6,"127":0,"128":0,"129":6,"130":6,"131":6,"132":1,"133":1,"134":1,"135":10,"136":1,"137":1,"138":1,"139":9,"140":9,"141":9,"142":9,"143":9,"144":9,"145":9,"146":9,"147":9,"148":9,"149":9,"150":9,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":4,"162":3,"163":3,"164":0,"165":3,"166":3,"167":3,"168":3,"169":3,"170":3,"171":1,"172":1,"173":1,"174":16,"175":3,"176":3,"177":3,"178":3,"179":16,"180":1,"181":1,"182":7,"183":7,"184":7,"185":7,"186":7,"187":7,"188":7,"189":7,"190":7,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":1,"220":1,"221":1,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":1,"234":1,"235":1,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":1,"252":1,"253":1,"254":1,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":1,"278":1,"279":1,"280":6,"281":6,"282":6,"283":6,"284":6,"285":6,"286":6,"287":6,"288":6,"289":0,"290":0,"291":6,"292":1,"293":1,"294":1,"295":0,"296":0,"297":0,"298":1,"299":1,"300":6,"301":6,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":6,"309":6,"310":1,"311":1,"312":6,"313":6,"314":6,"315":6,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":6,"326":6,"327":6,"328":6,"329":1,"330":1,"331":6,"332":6,"333":6,"334":5,"335":5,"336":1,"337":1,"338":6,"339":1,"340":1,"341":6,"342":0,"343":0,"344":6,"345":0,"346":0,"347":5,"348":5,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":15,"412":15,"413":15,"414":1},"branchMap":{"0":{"type":"branch","line":46,"loc":{"start":{"line":46,"column":2},"end":{"line":53,"column":6}},"locations":[{"start":{"line":46,"column":2},"end":{"line":53,"column":6}}]},"1":{"type":"branch","line":61,"loc":{"start":{"line":61,"column":2},"end":{"line":132,"column":3}},"locations":[{"start":{"line":61,"column":2},"end":{"line":132,"column":3}}]},"2":{"type":"branch","line":99,"loc":{"start":{"line":99,"column":22},"end":{"line":109,"column":5}},"locations":[{"start":{"line":99,"column":22},"end":{"line":109,"column":5}}]},"3":{"type":"branch","line":127,"loc":{"start":{"line":127,"column":32},"end":{"line":129,"column":5}},"locations":[{"start":{"line":127,"column":32},"end":{"line":129,"column":5}}]},"4":{"type":"branch","line":80,"loc":{"start":{"line":80,"column":8},"end":{"line":80,"column":45}},"locations":[{"start":{"line":80,"column":8},"end":{"line":80,"column":45}}]},"5":{"type":"branch","line":83,"loc":{"start":{"line":83,"column":44},"end":{"line":83,"column":60}},"locations":[{"start":{"line":83,"column":44},"end":{"line":83,"column":60}}]},"6":{"type":"branch","line":135,"loc":{"start":{"line":135,"column":2},"end":{"line":151,"column":3}},"locations":[{"start":{"line":135,"column":2},"end":{"line":151,"column":3}}]},"7":{"type":"branch","line":136,"loc":{"start":{"line":136,"column":45},"end":{"line":139,"column":5}},"locations":[{"start":{"line":136,"column":45},"end":{"line":139,"column":5}}]},"8":{"type":"branch","line":140,"loc":{"start":{"line":140,"column":-1},"end":{"line":151,"column":3}},"locations":[{"start":{"line":140,"column":-1},"end":{"line":151,"column":3}}]},"9":{"type":"branch","line":154,"loc":{"start":{"line":154,"column":2},"end":{"line":158,"column":3}},"locations":[{"start":{"line":154,"column":2},"end":{"line":158,"column":3}}]},"10":{"type":"branch","line":161,"loc":{"start":{"line":161,"column":2},"end":{"line":171,"column":3}},"locations":[{"start":{"line":161,"column":2},"end":{"line":171,"column":3}}]},"11":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":33},"end":{"line":162,"column":40}},"locations":[{"start":{"line":162,"column":33},"end":{"line":162,"column":40}}]},"12":{"type":"branch","line":163,"loc":{"start":{"line":163,"column":-1},"end":{"line":171,"column":3}},"locations":[{"start":{"line":163,"column":-1},"end":{"line":171,"column":3}}]},"13":{"type":"branch","line":174,"loc":{"start":{"line":174,"column":2},"end":{"line":180,"column":3}},"locations":[{"start":{"line":174,"column":2},"end":{"line":180,"column":3}}]},"14":{"type":"branch","line":175,"loc":{"start":{"line":175,"column":33},"end":{"line":179,"column":5}},"locations":[{"start":{"line":175,"column":33},"end":{"line":179,"column":5}}]},"15":{"type":"branch","line":182,"loc":{"start":{"line":182,"column":2},"end":{"line":191,"column":3}},"locations":[{"start":{"line":182,"column":2},"end":{"line":191,"column":3}}]},"16":{"type":"branch","line":280,"loc":{"start":{"line":280,"column":10},"end":{"line":292,"column":3}},"locations":[{"start":{"line":280,"column":10},"end":{"line":292,"column":3}}]},"17":{"type":"branch","line":289,"loc":{"start":{"line":289,"column":64},"end":{"line":291,"column":5}},"locations":[{"start":{"line":289,"column":64},"end":{"line":291,"column":5}}]},"18":{"type":"branch","line":300,"loc":{"start":{"line":300,"column":10},"end":{"line":310,"column":3}},"locations":[{"start":{"line":300,"column":10},"end":{"line":310,"column":3}}]},"19":{"type":"branch","line":302,"loc":{"start":{"line":302,"column":41},"end":{"line":308,"column":7}},"locations":[{"start":{"line":302,"column":41},"end":{"line":308,"column":7}}]},"20":{"type":"branch","line":312,"loc":{"start":{"line":312,"column":10},"end":{"line":329,"column":3}},"locations":[{"start":{"line":312,"column":10},"end":{"line":329,"column":3}}]},"21":{"type":"branch","line":316,"loc":{"start":{"line":316,"column":38},"end":{"line":316,"column":53}},"locations":[{"start":{"line":316,"column":38},"end":{"line":316,"column":53}}]},"22":{"type":"branch","line":317,"loc":{"start":{"line":317,"column":-1},"end":{"line":326,"column":56}},"locations":[{"start":{"line":317,"column":-1},"end":{"line":326,"column":56}}]},"23":{"type":"branch","line":326,"loc":{"start":{"line":326,"column":57},"end":{"line":326,"column":62}},"locations":[{"start":{"line":326,"column":57},"end":{"line":326,"column":62}}]},"24":{"type":"branch","line":326,"loc":{"start":{"line":326,"column":63},"end":{"line":326,"column":66}},"locations":[{"start":{"line":326,"column":63},"end":{"line":326,"column":66}}]},"25":{"type":"branch","line":319,"loc":{"start":{"line":319,"column":29},"end":{"line":319,"column":55}},"locations":[{"start":{"line":319,"column":29},"end":{"line":319,"column":55}}]},"26":{"type":"branch","line":331,"loc":{"start":{"line":331,"column":10},"end":{"line":336,"column":3}},"locations":[{"start":{"line":331,"column":10},"end":{"line":336,"column":3}}]},"27":{"type":"branch","line":332,"loc":{"start":{"line":332,"column":23},"end":{"line":332,"column":53}},"locations":[{"start":{"line":332,"column":23},"end":{"line":332,"column":53}}]},"28":{"type":"branch","line":333,"loc":{"start":{"line":333,"column":-1},"end":{"line":333,"column":30}},"locations":[{"start":{"line":333,"column":-1},"end":{"line":333,"column":30}}]},"29":{"type":"branch","line":333,"loc":{"start":{"line":333,"column":23},"end":{"line":333,"column":49}},"locations":[{"start":{"line":333,"column":23},"end":{"line":333,"column":49}}]},"30":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":-1},"end":{"line":334,"column":29}},"locations":[{"start":{"line":334,"column":-1},"end":{"line":334,"column":29}}]},"31":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":22},"end":{"line":334,"column":50}},"locations":[{"start":{"line":334,"column":22},"end":{"line":334,"column":50}}]},"32":{"type":"branch","line":335,"loc":{"start":{"line":335,"column":-1},"end":{"line":336,"column":3}},"locations":[{"start":{"line":335,"column":-1},"end":{"line":336,"column":3}}]},"33":{"type":"branch","line":338,"loc":{"start":{"line":338,"column":10},"end":{"line":349,"column":3}},"locations":[{"start":{"line":338,"column":10},"end":{"line":349,"column":3}}]},"34":{"type":"branch","line":339,"loc":{"start":{"line":339,"column":43},"end":{"line":339,"column":59}},"locations":[{"start":{"line":339,"column":43},"end":{"line":339,"column":59}}]},"35":{"type":"branch","line":339,"loc":{"start":{"line":339,"column":61},"end":{"line":341,"column":5}},"locations":[{"start":{"line":339,"column":61},"end":{"line":341,"column":5}}]},"36":{"type":"branch","line":342,"loc":{"start":{"line":342,"column":-1},"end":{"line":342,"column":41}},"locations":[{"start":{"line":342,"column":-1},"end":{"line":342,"column":41}}]},"37":{"type":"branch","line":342,"loc":{"start":{"line":342,"column":41},"end":{"line":344,"column":5}},"locations":[{"start":{"line":342,"column":41},"end":{"line":344,"column":5}}]},"38":{"type":"branch","line":345,"loc":{"start":{"line":345,"column":-1},"end":{"line":345,"column":43}},"locations":[{"start":{"line":345,"column":-1},"end":{"line":345,"column":43}}]},"39":{"type":"branch","line":345,"loc":{"start":{"line":345,"column":43},"end":{"line":347,"column":5}},"locations":[{"start":{"line":345,"column":43},"end":{"line":347,"column":5}}]},"40":{"type":"branch","line":348,"loc":{"start":{"line":348,"column":-1},"end":{"line":349,"column":3}},"locations":[{"start":{"line":348,"column":-1},"end":{"line":349,"column":3}}]},"41":{"type":"branch","line":351,"loc":{"start":{"line":351,"column":10},"end":{"line":354,"column":3}},"locations":[{"start":{"line":351,"column":10},"end":{"line":354,"column":3}}]},"42":{"type":"branch","line":356,"loc":{"start":{"line":356,"column":10},"end":{"line":409,"column":3}},"locations":[{"start":{"line":356,"column":10},"end":{"line":409,"column":3}}]},"43":{"type":"branch","line":371,"loc":{"start":{"line":371,"column":30},"end":{"line":371,"column":43}},"locations":[{"start":{"line":371,"column":30},"end":{"line":371,"column":43}}]},"44":{"type":"branch","line":375,"loc":{"start":{"line":375,"column":46},"end":{"line":375,"column":54}},"locations":[{"start":{"line":375,"column":46},"end":{"line":375,"column":54}}]},"45":{"type":"branch","line":391,"loc":{"start":{"line":391,"column":59},"end":{"line":391,"column":65}},"locations":[{"start":{"line":391,"column":59},"end":{"line":391,"column":65}}]},"46":{"type":"branch","line":376,"loc":{"start":{"line":376,"column":38},"end":{"line":376,"column":56}},"locations":[{"start":{"line":376,"column":38},"end":{"line":376,"column":56}}]},"47":{"type":"branch","line":411,"loc":{"start":{"line":411,"column":2},"end":{"line":414,"column":3}},"locations":[{"start":{"line":411,"column":2},"end":{"line":414,"column":3}}]}},"b":{"0":[14],"1":[6],"2":[1],"3":[0],"4":[6],"5":[1],"6":[10],"7":[1],"8":[9],"9":[1],"10":[4],"11":[1],"12":[3],"13":[16],"14":[3],"15":[7],"16":[6],"17":[0],"18":[6],"19":[0],"20":[6],"21":[5],"22":[1],"23":[1],"24":[0],"25":[1],"26":[6],"27":[1],"28":[5],"29":[0],"30":[5],"31":[0],"32":[5],"33":[6],"34":[5],"35":[1],"36":[5],"37":[0],"38":[5],"39":[0],"40":[5],"41":[1],"42":[1],"43":[0],"44":[0],"45":[0],"46":[1],"47":[15]},"fnMap":{"0":{"name":"RealTimeMonitorService","decl":{"start":{"line":46,"column":2},"end":{"line":53,"column":6}},"loc":{"start":{"line":46,"column":2},"end":{"line":53,"column":6}},"line":46},"1":{"name":"analyzeIncomingTrade","decl":{"start":{"line":61,"column":2},"end":{"line":132,"column":3}},"loc":{"start":{"line":61,"column":2},"end":{"line":132,"column":3}},"line":61},"2":{"name":"startTraderMonitoring","decl":{"start":{"line":135,"column":2},"end":{"line":151,"column":3}},"loc":{"start":{"line":135,"column":2},"end":{"line":151,"column":3}},"line":135},"3":{"name":"stopTraderMonitoring","decl":{"start":{"line":154,"column":2},"end":{"line":158,"column":3}},"loc":{"start":{"line":154,"column":2},"end":{"line":158,"column":3}},"line":154},"4":{"name":"startGlobalMonitoring","decl":{"start":{"line":161,"column":2},"end":{"line":171,"column":3}},"loc":{"start":{"line":161,"column":2},"end":{"line":171,"column":3}},"line":161},"5":{"name":"stopGlobalMonitoring","decl":{"start":{"line":174,"column":2},"end":{"line":180,"column":3}},"loc":{"start":{"line":174,"column":2},"end":{"line":180,"column":3}},"line":174},"6":{"name":"getMonitoringStatus","decl":{"start":{"line":182,"column":2},"end":{"line":191,"column":3}},"loc":{"start":{"line":182,"column":2},"end":{"line":191,"column":3}},"line":182},"7":{"name":"processMonitoringCycle","decl":{"start":{"line":197,"column":8},"end":{"line":219,"column":3}},"loc":{"start":{"line":197,"column":8},"end":{"line":219,"column":3}},"line":197},"8":{"name":"generateMonitoringReport","decl":{"start":{"line":222,"column":8},"end":{"line":233,"column":3}},"loc":{"start":{"line":222,"column":8},"end":{"line":233,"column":3}},"line":222},"9":{"name":"hourlyEscalation","decl":{"start":{"line":236,"column":8},"end":{"line":251,"column":3}},"loc":{"start":{"line":236,"column":8},"end":{"line":251,"column":3}},"line":236},"10":{"name":"sweepTrader","decl":{"start":{"line":255,"column":10},"end":{"line":277,"column":3}},"loc":{"start":{"line":255,"column":10},"end":{"line":277,"column":3}},"line":255},"11":{"name":"updateTraderContext","decl":{"start":{"line":280,"column":10},"end":{"line":292,"column":3}},"loc":{"start":{"line":280,"column":10},"end":{"line":292,"column":3}},"line":280},"12":{"name":"enqueuePendingTrade","decl":{"start":{"line":295,"column":2},"end":{"line":298,"column":3}},"loc":{"start":{"line":295,"column":2},"end":{"line":298,"column":3}},"line":295},"13":{"name":"getTraderContext","decl":{"start":{"line":300,"column":10},"end":{"line":310,"column":3}},"loc":{"start":{"line":300,"column":10},"end":{"line":310,"column":3}},"line":300},"14":{"name":"combineScores","decl":{"start":{"line":312,"column":10},"end":{"line":329,"column":3}},"loc":{"start":{"line":312,"column":10},"end":{"line":329,"column":3}},"line":312},"15":{"name":"scoreToSeverity","decl":{"start":{"line":331,"column":10},"end":{"line":336,"column":3}},"loc":{"start":{"line":331,"column":10},"end":{"line":336,"column":3}},"line":331},"16":{"name":"getRecommendedAction","decl":{"start":{"line":338,"column":10},"end":{"line":349,"column":3}},"loc":{"start":{"line":338,"column":10},"end":{"line":349,"column":3}},"line":338},"17":{"name":"generateCaseId","decl":{"start":{"line":351,"column":10},"end":{"line":354,"column":3}},"loc":{"start":{"line":351,"column":10},"end":{"line":354,"column":3}},"line":351},"18":{"name":"createFraudCase","decl":{"start":{"line":356,"column":10},"end":{"line":409,"column":3}},"loc":{"start":{"line":356,"column":10},"end":{"line":409,"column":3}},"line":356},"19":{"name":"onModuleDestroy","decl":{"start":{"line":411,"column":2},"end":{"line":414,"column":3}},"loc":{"start":{"line":411,"column":2},"end":{"line":414,"column":3}},"line":411}},"f":{"0":14,"1":6,"2":10,"3":1,"4":4,"5":16,"6":7,"7":0,"8":0,"9":0,"10":0,"11":6,"12":0,"13":6,"14":6,"15":6,"16":6,"17":1,"18":1,"19":15}} +,"/workspaces/CurrentDao-backend/src/fraud/patterns/pattern-recognition.service.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/patterns/pattern-recognition.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":18}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":12}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":32}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":29}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":13}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":15}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":27}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":28}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":26}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":35}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":42}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":40}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":71}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":49}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":17}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":44}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":85}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":6}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":65}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":75}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":18}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":27}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":74}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":11}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":51}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":70}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":16}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":32}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":36}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":37}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":25}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":24}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":47}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":10}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":7}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":7}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":63}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":59}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":21}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":30}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":33}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":27}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":76}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":65}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":40}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":72}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":9}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":11}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":15}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":18}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":8}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":78}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":51}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":12}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":79}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":7}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":37}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":60}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":27}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":30}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":46}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":35}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":73}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":65}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":56}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":11}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":8}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":7}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":21}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":39}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":33}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":70}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":31}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":56}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":19}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":43}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":35}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":58}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":37}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":12}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":43}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":32}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":50}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":37}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":20}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":43}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":29}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":64}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":43}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":12}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":10}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":8}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":7}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":33}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":77}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":26}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":87}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":55}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":18}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":32}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":52}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":37}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":55}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":47}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":77}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":12}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":10}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":8}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":7}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":34}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":33}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":20}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":82}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":26}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":61}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":65}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":18}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":32}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":45}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":37}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":34}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":48}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":73}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":12}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":10}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":8}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":7}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":21}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":36}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":33}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":20}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":71}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":31}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":40}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":37}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":61}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":54}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":18}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":32}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":47}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":37}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":20}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":31}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":59}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":18}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":90}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":10}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":8}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":79}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":7}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":21}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":33}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":29}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":20}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":72}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":26}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":50}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":48}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":48}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":18}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":32}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":44}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":33}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":20}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":43}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":80}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":12}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":10}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":8}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":7}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":33}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":29}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":20}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":70}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":26}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":73}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":60}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":18}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":32}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":44}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":33}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":36}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":50}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":73}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":12}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":10}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":8}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":7}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":33}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":29}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":72}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":31}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":29}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":37}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":77}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":26}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":43}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":18}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":32}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":44}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":33}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":20}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":72}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":69}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":12}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":10}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":8}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":7}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":21}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":31}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":29}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":20}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":77}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":31}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":27}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":72}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":27}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":41}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":18}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":32}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":42}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":33}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":20}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":70}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":65}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":12}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":10}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":8}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":7}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":21}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":34}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":29}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":77}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":26}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":34}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":58}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":18}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":32}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":45}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":33}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":38}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":51}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":62}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":12}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":10}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":8}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":79}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":7}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":21}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":43}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":29}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":20}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":84}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":31}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":37}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":37}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":21}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":45}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":37}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":41}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":26}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":51}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":18}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":32}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":54}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":33}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":31}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":58}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":18}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":86}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":12}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":10}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":8}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":7}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":21}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":34}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":29}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":20}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":73}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":31}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":38}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":37}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":71}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":26}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":78}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":18}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":32}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":45}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":33}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":20}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":43}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":95}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":12}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":10}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":8}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":7}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":21}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":36}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":29}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":20}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":74}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":26}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":38}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":57}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":18}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":32}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":47}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":33}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":42}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":56}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":61}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":12}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":10}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":79}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":7}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":21}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":34}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":40}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":20}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":71}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":31}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":32}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":72}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":27}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":69}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":32}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":45}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":44}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":20}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":42}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":82}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":12}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":10}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":8}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":7}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":21}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":44}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":40}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":75}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":26}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":46}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":60}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":20}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":31}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":63}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":55}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":18}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":32}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":55}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":44}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":20}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":42}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":97}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":12}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":10}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":8}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":7}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":21}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":30}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":40}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":71}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":31}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":27}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":37}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":70}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":26}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":72}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":54}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":18}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":32}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":41}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":44}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":20}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":43}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":112}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":12}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":10}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":8}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":7}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":21}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":26}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":40}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":78}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":31}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":28}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":37}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":71}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":26}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":63}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":18}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":32}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":37}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":44}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":30}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":44}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":72}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":12}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":10}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":8}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":7}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":21}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":33}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":40}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":20}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":73}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":26}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":45}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":59}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":20}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":51}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":48}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":18}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":32}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":44}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":44}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":20}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":42}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":86}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":12}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":10}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":8}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":79}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":7}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":21}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":38}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":34}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":60}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":31}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":33}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":35}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":77}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":23}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":18}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":32}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":49}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":38}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":37}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":51}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":78}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":12}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":10}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":8}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":7}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":21}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":34}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":34}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":20}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":77}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":26}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":48}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":52}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":65}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":18}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":32}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":45}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":38}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":20}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":42}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":21}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":83}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":12}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":10}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":8}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":0}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":79}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":7}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":21}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":38}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":33}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":20}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":76}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":26}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":51}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":61}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":47}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":18}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":32}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":49}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":37}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":20}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":43}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":62}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":12}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":10}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":8}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":7}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":21}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":43}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":33}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":80}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":31}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":40}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":55}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":17}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":71}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":18}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":32}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":54}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":37}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":20}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":42}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":69}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":12}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":10}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":8}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":7}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":21}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":32}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":33}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":20}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":81}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":26}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":73}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":18}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":32}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":43}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":37}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":44}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":57}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":90}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":12}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":10}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":8}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":0}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":79}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":7}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":21}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":28}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":29}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":20}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":73}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":31}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":29}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":72}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":27}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":43}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":18}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":32}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":39}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":33}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":20}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":71}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":62}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":12}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":10}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":8}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":7}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":21}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":37}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":29}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":20}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":83}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":31}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":26}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":37}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":77}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":26}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":40}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":18}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":32}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":48}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":33}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":20}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":68}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":62}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":12}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":10}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":8}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":7}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":21}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":36}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":29}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":69}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":31}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":32}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":37}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":21}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":45}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":37}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":40}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":26}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":67}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":18}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":32}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":47}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":33}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":20}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":42}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":80}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":12}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":10}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":8}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":0}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":79}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":7}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":21}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":41}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":36}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":20}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":76}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":26}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":52}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":36}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":65}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":18}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":32}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":52}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":40}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":40}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":54}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":93}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":12}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":10}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":8}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":7}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":21}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":51}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":36}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":20}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":79}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":31}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":37}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":36}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":71}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":23}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":25}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":72}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":18}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":32}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":62}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":40}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":20}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":42}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":21}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":75}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":12}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":10}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":8}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":0}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":79}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":7}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":21}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":34}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":36}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":20}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":72}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":26}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":28}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":48}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":50}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":45}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":50}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":18}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":32}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":45}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":40}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":20}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":42}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":72}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":12}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":10}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":8}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":7}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":21}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":44}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":36}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":72}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":26}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":46}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":49}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":55}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":18}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":32}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":55}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":40}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":20}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":67}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":86}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":12}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":10}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":8}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":7}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":21}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":36}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":36}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":72}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":26}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":79}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":36}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":59}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":65}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":18}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":32}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":47}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":40}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":20}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":43}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":86}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":12}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":10}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":8}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":7}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":21}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":40}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":36}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":80}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":26}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":31}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":63}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":51}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":53}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":18}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":32}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":51}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":40}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":20}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":42}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":88}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":12}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":10}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":8}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":7}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":21}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":37}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":36}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":20}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":70}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":31}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":28}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":37}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":71}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":26}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":31}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":75}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":18}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":32}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":48}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":40}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":35}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":49}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":21}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":85}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":12}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":10}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":8}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":0}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":79}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":7}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":21}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":36}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":31}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":20}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":77}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":26}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":45}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":29}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":56}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":47}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":18}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":32}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":47}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":35}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":33}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":47}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":111}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":12}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":10}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":8}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":7}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":21}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":25}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":31}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":20}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":75}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":31}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":29}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":37}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":73}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":26}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":44}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":18}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":32}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":36}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":35}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":20}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":71}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":91}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":12}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":10}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":8}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":7}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":21}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":37}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":31}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":77}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":26}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":74}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":50}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":50}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":18}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":32}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":48}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":35}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":20}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":43}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":86}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":12}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":10}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":8}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":0}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":79}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":7}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":21}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":24}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":32}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":20}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":73}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":26}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":71}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":18}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":32}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":35}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":36}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":31}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":45}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":89}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":12}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":10}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":8}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":7}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":21}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":38}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":32}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":20}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":75}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":31}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":38}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":55}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":17}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":26}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":72}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":55}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":18}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":32}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":49}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":36}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":20}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":43}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":71}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":12}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":10}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":8}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":7}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":21}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":40}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":32}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":80}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":31}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":29}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":35}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":21}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":45}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":37}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":45}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":23}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":18}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":32}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":51}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":36}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":33}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":46}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":21}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":85}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":12}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":10}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":8}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":6}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":3}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":0}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":74}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":64}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":54}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":55}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":43}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":35}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":35}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":57}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":45}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":56}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":49}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":53}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":36}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":38}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":41}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":6}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":0}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":37}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":74}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":6}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":29}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":3}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":22,"30":22,"31":22,"32":22,"33":22,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":14,"41":14,"42":14,"43":14,"44":546,"45":546,"46":546,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":14,"58":14,"59":14,"60":14,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":3,"73":117,"74":117,"75":117,"76":117,"77":3,"78":3,"79":1,"80":1,"81":1,"82":1,"83":22,"84":22,"85":22,"86":22,"87":22,"88":22,"89":22,"90":22,"91":14,"92":14,"93":14,"94":14,"95":14,"96":14,"97":22,"98":22,"99":22,"100":22,"101":22,"102":22,"103":22,"104":22,"105":14,"106":14,"107":1,"108":1,"109":1,"110":14,"111":14,"112":14,"113":14,"114":14,"115":14,"116":14,"117":14,"118":14,"119":14,"120":14,"121":14,"122":14,"123":22,"124":22,"125":22,"126":22,"127":22,"128":22,"129":22,"130":22,"131":14,"132":14,"133":14,"134":14,"135":14,"136":14,"137":14,"138":14,"139":14,"140":14,"141":22,"142":22,"143":22,"144":22,"145":22,"146":22,"147":22,"148":22,"149":22,"150":14,"151":14,"152":14,"153":14,"154":14,"155":14,"156":14,"157":14,"158":14,"159":14,"160":22,"161":22,"162":22,"163":22,"164":22,"165":22,"166":22,"167":22,"168":22,"169":14,"170":14,"171":14,"172":14,"173":14,"174":14,"175":14,"176":14,"177":14,"178":14,"179":14,"180":14,"181":14,"182":14,"183":14,"184":22,"185":22,"186":22,"187":22,"188":22,"189":22,"190":22,"191":22,"192":22,"193":22,"194":22,"195":14,"196":14,"197":14,"198":14,"199":14,"200":14,"201":14,"202":14,"203":14,"204":14,"205":14,"206":22,"207":22,"208":22,"209":22,"210":22,"211":22,"212":22,"213":22,"214":22,"215":14,"216":14,"217":14,"218":14,"219":14,"220":14,"221":14,"222":14,"223":14,"224":14,"225":22,"226":22,"227":22,"228":22,"229":22,"230":22,"231":22,"232":22,"233":14,"234":14,"235":14,"236":14,"237":14,"238":14,"239":14,"240":14,"241":14,"242":14,"243":14,"244":14,"245":14,"246":22,"247":22,"248":22,"249":22,"250":22,"251":22,"252":22,"253":22,"254":22,"255":14,"256":14,"257":14,"258":14,"259":14,"260":14,"261":14,"262":14,"263":14,"264":14,"265":14,"266":14,"267":22,"268":22,"269":22,"270":22,"271":22,"272":22,"273":22,"274":22,"275":14,"276":14,"277":14,"278":14,"279":14,"280":14,"281":14,"282":14,"283":14,"284":14,"285":22,"286":22,"287":22,"288":22,"289":22,"290":22,"291":22,"292":22,"293":22,"294":22,"295":22,"296":14,"297":14,"298":14,"299":1,"300":1,"301":14,"302":14,"303":14,"304":14,"305":14,"306":14,"307":14,"308":14,"309":14,"310":14,"311":14,"312":14,"313":14,"314":22,"315":22,"316":22,"317":22,"318":22,"319":22,"320":22,"321":22,"322":22,"323":14,"324":14,"325":14,"326":14,"327":14,"328":14,"329":14,"330":14,"331":14,"332":14,"333":14,"334":14,"335":14,"336":22,"337":22,"338":22,"339":22,"340":22,"341":22,"342":22,"343":22,"344":22,"345":14,"346":14,"347":14,"348":14,"349":14,"350":14,"351":14,"352":14,"353":14,"354":14,"355":22,"356":22,"357":22,"358":22,"359":22,"360":22,"361":22,"362":22,"363":22,"364":22,"365":22,"366":14,"367":14,"368":14,"369":14,"370":14,"371":14,"372":14,"373":14,"374":14,"375":14,"376":14,"377":14,"378":22,"379":22,"380":22,"381":22,"382":22,"383":22,"384":22,"385":22,"386":14,"387":14,"388":14,"389":14,"390":14,"391":14,"392":14,"393":14,"394":14,"395":14,"396":14,"397":14,"398":14,"399":14,"400":22,"401":22,"402":22,"403":22,"404":22,"405":22,"406":22,"407":22,"408":14,"409":14,"410":14,"411":14,"412":14,"413":14,"414":14,"415":14,"416":14,"417":14,"418":14,"419":14,"420":14,"421":14,"422":22,"423":22,"424":22,"425":22,"426":22,"427":22,"428":22,"429":22,"430":14,"431":14,"432":14,"433":14,"434":14,"435":14,"436":14,"437":14,"438":14,"439":14,"440":14,"441":14,"442":14,"443":22,"444":22,"445":22,"446":22,"447":22,"448":22,"449":22,"450":22,"451":22,"452":14,"453":14,"454":14,"455":14,"456":14,"457":14,"458":14,"459":14,"460":14,"461":14,"462":14,"463":14,"464":14,"465":22,"466":22,"467":22,"468":22,"469":22,"470":22,"471":22,"472":22,"473":22,"474":22,"475":14,"476":14,"477":14,"478":14,"479":14,"480":14,"481":14,"482":14,"483":14,"484":14,"485":14,"486":14,"487":22,"488":22,"489":22,"490":22,"491":22,"492":22,"493":22,"494":22,"495":22,"496":14,"497":14,"498":14,"499":14,"500":14,"501":14,"502":14,"503":14,"504":14,"505":14,"506":14,"507":14,"508":22,"509":22,"510":22,"511":22,"512":22,"513":22,"514":22,"515":22,"516":22,"517":22,"518":22,"519":14,"520":14,"521":14,"522":14,"523":14,"524":14,"525":14,"526":14,"527":14,"528":14,"529":14,"530":22,"531":22,"532":22,"533":22,"534":22,"535":22,"536":22,"537":22,"538":14,"539":14,"540":14,"541":14,"542":14,"543":14,"544":14,"545":14,"546":14,"547":14,"548":14,"549":14,"550":22,"551":22,"552":22,"553":22,"554":22,"555":22,"556":22,"557":22,"558":22,"559":14,"560":14,"561":14,"562":14,"563":14,"564":14,"565":14,"566":14,"567":14,"568":22,"569":22,"570":22,"571":22,"572":22,"573":22,"574":22,"575":22,"576":22,"577":22,"578":22,"579":14,"580":14,"581":14,"582":14,"583":14,"584":14,"585":14,"586":14,"587":14,"588":14,"589":14,"590":14,"591":22,"592":22,"593":22,"594":22,"595":22,"596":22,"597":22,"598":22,"599":22,"600":14,"601":14,"602":14,"603":14,"604":14,"605":14,"606":14,"607":14,"608":14,"609":14,"610":14,"611":14,"612":14,"613":22,"614":22,"615":22,"616":22,"617":22,"618":22,"619":22,"620":22,"621":14,"622":14,"623":14,"624":1,"625":1,"626":14,"627":14,"628":14,"629":14,"630":14,"631":14,"632":14,"633":14,"634":14,"635":14,"636":14,"637":22,"638":22,"639":22,"640":22,"641":22,"642":22,"643":22,"644":22,"645":22,"646":22,"647":22,"648":14,"649":14,"650":14,"651":14,"652":14,"653":14,"654":14,"655":14,"656":14,"657":14,"658":14,"659":22,"660":22,"661":22,"662":22,"663":22,"664":22,"665":22,"666":22,"667":22,"668":14,"669":14,"670":14,"671":14,"672":14,"673":14,"674":14,"675":14,"676":14,"677":14,"678":14,"679":14,"680":14,"681":14,"682":14,"683":22,"684":22,"685":22,"686":22,"687":22,"688":22,"689":22,"690":22,"691":22,"692":22,"693":22,"694":14,"695":14,"696":14,"697":14,"698":14,"699":14,"700":14,"701":14,"702":14,"703":14,"704":14,"705":14,"706":14,"707":22,"708":22,"709":22,"710":22,"711":22,"712":22,"713":22,"714":22,"715":14,"716":14,"717":14,"718":14,"719":14,"720":14,"721":14,"722":14,"723":14,"724":14,"725":14,"726":22,"727":22,"728":22,"729":22,"730":22,"731":22,"732":22,"733":22,"734":14,"735":14,"736":14,"737":14,"738":14,"739":14,"740":14,"741":14,"742":14,"743":14,"744":14,"745":14,"746":22,"747":22,"748":22,"749":22,"750":22,"751":22,"752":22,"753":22,"754":14,"755":14,"756":14,"757":14,"758":14,"759":14,"760":14,"761":14,"762":14,"763":14,"764":14,"765":14,"766":22,"767":22,"768":22,"769":22,"770":22,"771":22,"772":22,"773":22,"774":22,"775":14,"776":14,"777":14,"778":14,"779":14,"780":14,"781":14,"782":14,"783":14,"784":14,"785":14,"786":14,"787":14,"788":14,"789":14,"790":22,"791":22,"792":22,"793":22,"794":22,"795":22,"796":22,"797":22,"798":22,"799":22,"800":22,"801":14,"802":14,"803":14,"804":14,"805":14,"806":14,"807":14,"808":14,"809":14,"810":14,"811":14,"812":14,"813":22,"814":22,"815":22,"816":22,"817":22,"818":22,"819":22,"820":22,"821":22,"822":14,"823":14,"824":14,"825":14,"826":14,"827":14,"828":14,"829":14,"830":14,"831":14,"832":14,"833":14,"834":14,"835":22,"836":22,"837":22,"838":22,"839":22,"840":22,"841":22,"842":22,"843":14,"844":14,"845":14,"846":14,"847":14,"848":14,"849":14,"850":14,"851":14,"852":14,"853":14,"854":22,"855":22,"856":22,"857":22,"858":22,"859":22,"860":22,"861":22,"862":22,"863":22,"864":22,"865":14,"866":14,"867":14,"868":14,"869":14,"870":14,"871":14,"872":14,"873":14,"874":22,"875":22,"876":22,"877":22,"878":22,"879":22,"880":22,"881":22,"882":22,"883":14,"884":14,"885":14,"886":14,"887":14,"888":14,"889":14,"890":14,"891":14,"892":14,"893":14,"894":14,"895":14,"896":14,"897":22,"898":22,"899":22,"900":22,"901":22,"902":22,"903":22,"904":22,"905":14,"906":14,"907":14,"908":1,"909":1,"910":14,"911":14,"912":14,"913":14,"914":14,"915":14,"916":14,"917":14,"918":14,"919":14,"920":14,"921":22,"922":22,"923":22,"924":22,"925":1,"926":1,"927":1,"928":4,"929":4,"930":4,"931":4,"932":4,"933":4,"934":4,"935":4,"936":4,"937":4,"938":4,"939":4,"940":4,"941":4,"942":4,"943":4,"944":4,"945":4,"946":4,"947":4,"948":1},"branchMap":{"0":{"type":"branch","line":29,"loc":{"start":{"line":29,"column":2},"end":{"line":34,"column":3}},"locations":[{"start":{"line":29,"column":2},"end":{"line":34,"column":3}}]},"1":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":2},"end":{"line":61,"column":3}},"locations":[{"start":{"line":40,"column":2},"end":{"line":61,"column":3}}]},"2":{"type":"branch","line":44,"loc":{"start":{"line":44,"column":60},"end":{"line":58,"column":5}},"locations":[{"start":{"line":44,"column":60},"end":{"line":58,"column":5}}]},"3":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":8},"end":{"line":57,"column":7}},"locations":[{"start":{"line":47,"column":8},"end":{"line":57,"column":7}}]},"4":{"type":"branch","line":60,"loc":{"start":{"line":60,"column":24},"end":{"line":60,"column":61}},"locations":[{"start":{"line":60,"column":24},"end":{"line":60,"column":61}}]},"5":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":2},"end":{"line":69,"column":3}},"locations":[{"start":{"line":64,"column":2},"end":{"line":69,"column":3}}]},"6":{"type":"branch","line":68,"loc":{"start":{"line":68,"column":58},"end":{"line":68,"column":74}},"locations":[{"start":{"line":68,"column":58},"end":{"line":68,"column":74}}]},"7":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":2},"end":{"line":79,"column":3}},"locations":[{"start":{"line":72,"column":2},"end":{"line":79,"column":3}}]},"8":{"type":"branch","line":73,"loc":{"start":{"line":73,"column":29},"end":{"line":78,"column":6}},"locations":[{"start":{"line":73,"column":29},"end":{"line":78,"column":6}}]},"9":{"type":"branch","line":83,"loc":{"start":{"line":83,"column":10},"end":{"line":925,"column":3}},"locations":[{"start":{"line":83,"column":10},"end":{"line":925,"column":3}}]},"10":{"type":"branch","line":91,"loc":{"start":{"line":91,"column":18},"end":{"line":98,"column":10}},"locations":[{"start":{"line":91,"column":18},"end":{"line":98,"column":10}}]},"11":{"type":"branch","line":95,"loc":{"start":{"line":95,"column":37},"end":{"line":95,"column":72}},"locations":[{"start":{"line":95,"column":37},"end":{"line":95,"column":72}}]},"12":{"type":"branch","line":96,"loc":{"start":{"line":96,"column":54},"end":{"line":96,"column":60}},"locations":[{"start":{"line":96,"column":54},"end":{"line":96,"column":60}}]},"13":{"type":"branch","line":96,"loc":{"start":{"line":96,"column":61},"end":{"line":96,"column":64}},"locations":[{"start":{"line":96,"column":61},"end":{"line":96,"column":64}}]},"14":{"type":"branch","line":105,"loc":{"start":{"line":105,"column":18},"end":{"line":124,"column":9}},"locations":[{"start":{"line":105,"column":18},"end":{"line":124,"column":9}}]},"15":{"type":"branch","line":106,"loc":{"start":{"line":106,"column":49},"end":{"line":106,"column":55}},"locations":[{"start":{"line":106,"column":49},"end":{"line":106,"column":55}}]},"16":{"type":"branch","line":119,"loc":{"start":{"line":119,"column":32},"end":{"line":119,"column":38}},"locations":[{"start":{"line":119,"column":32},"end":{"line":119,"column":38}}]},"17":{"type":"branch","line":119,"loc":{"start":{"line":119,"column":39},"end":{"line":119,"column":42}},"locations":[{"start":{"line":119,"column":39},"end":{"line":119,"column":42}}]},"18":{"type":"branch","line":121,"loc":{"start":{"line":121,"column":14},"end":{"line":121,"column":64}},"locations":[{"start":{"line":121,"column":14},"end":{"line":121,"column":64}}]},"19":{"type":"branch","line":122,"loc":{"start":{"line":122,"column":14},"end":{"line":122,"column":42}},"locations":[{"start":{"line":122,"column":14},"end":{"line":122,"column":42}}]},"20":{"type":"branch","line":107,"loc":{"start":{"line":107,"column":12},"end":{"line":111,"column":36}},"locations":[{"start":{"line":107,"column":12},"end":{"line":111,"column":36}}]},"21":{"type":"branch","line":131,"loc":{"start":{"line":131,"column":18},"end":{"line":142,"column":9}},"locations":[{"start":{"line":131,"column":18},"end":{"line":142,"column":9}}]},"22":{"type":"branch","line":138,"loc":{"start":{"line":138,"column":32},"end":{"line":138,"column":54}},"locations":[{"start":{"line":138,"column":32},"end":{"line":138,"column":54}}]},"23":{"type":"branch","line":139,"loc":{"start":{"line":139,"column":36},"end":{"line":139,"column":42}},"locations":[{"start":{"line":139,"column":36},"end":{"line":139,"column":42}}]},"24":{"type":"branch","line":150,"loc":{"start":{"line":150,"column":18},"end":{"line":161,"column":9}},"locations":[{"start":{"line":150,"column":18},"end":{"line":161,"column":9}}]},"25":{"type":"branch","line":158,"loc":{"start":{"line":158,"column":37},"end":{"line":158,"column":43}},"locations":[{"start":{"line":158,"column":37},"end":{"line":158,"column":43}}]},"26":{"type":"branch","line":158,"loc":{"start":{"line":158,"column":44},"end":{"line":158,"column":47}},"locations":[{"start":{"line":158,"column":44},"end":{"line":158,"column":47}}]},"27":{"type":"branch","line":169,"loc":{"start":{"line":169,"column":18},"end":{"line":185,"column":9}},"locations":[{"start":{"line":169,"column":18},"end":{"line":185,"column":9}}]},"28":{"type":"branch","line":171,"loc":{"start":{"line":171,"column":28},"end":{"line":171,"column":36}},"locations":[{"start":{"line":171,"column":28},"end":{"line":171,"column":36}}]},"29":{"type":"branch","line":173,"loc":{"start":{"line":173,"column":20},"end":{"line":173,"column":25}},"locations":[{"start":{"line":173,"column":20},"end":{"line":173,"column":25}}]},"30":{"type":"branch","line":181,"loc":{"start":{"line":181,"column":14},"end":{"line":181,"column":59}},"locations":[{"start":{"line":181,"column":14},"end":{"line":181,"column":59}}]},"31":{"type":"branch","line":172,"loc":{"start":{"line":172,"column":14},"end":{"line":172,"column":60}},"locations":[{"start":{"line":172,"column":14},"end":{"line":172,"column":60}}]},"32":{"type":"branch","line":195,"loc":{"start":{"line":195,"column":18},"end":{"line":207,"column":9}},"locations":[{"start":{"line":195,"column":18},"end":{"line":207,"column":9}}]},"33":{"type":"branch","line":198,"loc":{"start":{"line":198,"column":38},"end":{"line":198,"column":47}},"locations":[{"start":{"line":198,"column":38},"end":{"line":198,"column":47}}]},"34":{"type":"branch","line":204,"loc":{"start":{"line":204,"column":32},"end":{"line":204,"column":38}},"locations":[{"start":{"line":204,"column":32},"end":{"line":204,"column":38}}]},"35":{"type":"branch","line":204,"loc":{"start":{"line":204,"column":39},"end":{"line":204,"column":42}},"locations":[{"start":{"line":204,"column":39},"end":{"line":204,"column":42}}]},"36":{"type":"branch","line":215,"loc":{"start":{"line":215,"column":18},"end":{"line":226,"column":9}},"locations":[{"start":{"line":215,"column":18},"end":{"line":226,"column":9}}]},"37":{"type":"branch","line":217,"loc":{"start":{"line":217,"column":44},"end":{"line":217,"column":59}},"locations":[{"start":{"line":217,"column":44},"end":{"line":217,"column":59}}]},"38":{"type":"branch","line":223,"loc":{"start":{"line":223,"column":39},"end":{"line":223,"column":45}},"locations":[{"start":{"line":223,"column":39},"end":{"line":223,"column":45}}]},"39":{"type":"branch","line":223,"loc":{"start":{"line":223,"column":46},"end":{"line":223,"column":49}},"locations":[{"start":{"line":223,"column":46},"end":{"line":223,"column":49}}]},"40":{"type":"branch","line":233,"loc":{"start":{"line":233,"column":18},"end":{"line":247,"column":9}},"locations":[{"start":{"line":233,"column":18},"end":{"line":247,"column":9}}]},"41":{"type":"branch","line":235,"loc":{"start":{"line":235,"column":28},"end":{"line":235,"column":36}},"locations":[{"start":{"line":235,"column":28},"end":{"line":235,"column":36}}]},"42":{"type":"branch","line":237,"loc":{"start":{"line":237,"column":20},"end":{"line":237,"column":25}},"locations":[{"start":{"line":237,"column":20},"end":{"line":237,"column":25}}]},"43":{"type":"branch","line":244,"loc":{"start":{"line":244,"column":32},"end":{"line":244,"column":67}},"locations":[{"start":{"line":244,"column":32},"end":{"line":244,"column":67}}]},"44":{"type":"branch","line":236,"loc":{"start":{"line":236,"column":14},"end":{"line":236,"column":76}},"locations":[{"start":{"line":236,"column":14},"end":{"line":236,"column":76}}]},"45":{"type":"branch","line":255,"loc":{"start":{"line":255,"column":18},"end":{"line":268,"column":9}},"locations":[{"start":{"line":255,"column":18},"end":{"line":268,"column":9}}]},"46":{"type":"branch","line":257,"loc":{"start":{"line":257,"column":28},"end":{"line":257,"column":36}},"locations":[{"start":{"line":257,"column":28},"end":{"line":257,"column":36}}]},"47":{"type":"branch","line":258,"loc":{"start":{"line":258,"column":21},"end":{"line":258,"column":26}},"locations":[{"start":{"line":258,"column":21},"end":{"line":258,"column":26}}]},"48":{"type":"branch","line":265,"loc":{"start":{"line":265,"column":32},"end":{"line":265,"column":65}},"locations":[{"start":{"line":265,"column":32},"end":{"line":265,"column":65}}]},"49":{"type":"branch","line":257,"loc":{"start":{"line":257,"column":37},"end":{"line":257,"column":71}},"locations":[{"start":{"line":257,"column":37},"end":{"line":257,"column":71}}]},"50":{"type":"branch","line":275,"loc":{"start":{"line":275,"column":18},"end":{"line":286,"column":9}},"locations":[{"start":{"line":275,"column":18},"end":{"line":286,"column":9}}]},"51":{"type":"branch","line":277,"loc":{"start":{"line":277,"column":29},"end":{"line":277,"column":57}},"locations":[{"start":{"line":277,"column":29},"end":{"line":277,"column":57}}]},"52":{"type":"branch","line":283,"loc":{"start":{"line":283,"column":41},"end":{"line":283,"column":46}},"locations":[{"start":{"line":283,"column":41},"end":{"line":283,"column":46}}]},"53":{"type":"branch","line":296,"loc":{"start":{"line":296,"column":18},"end":{"line":315,"column":9}},"locations":[{"start":{"line":296,"column":18},"end":{"line":315,"column":9}}]},"54":{"type":"branch","line":298,"loc":{"start":{"line":298,"column":28},"end":{"line":298,"column":36}},"locations":[{"start":{"line":298,"column":28},"end":{"line":298,"column":36}}]},"55":{"type":"branch","line":303,"loc":{"start":{"line":303,"column":20},"end":{"line":303,"column":25}},"locations":[{"start":{"line":303,"column":20},"end":{"line":303,"column":25}}]},"56":{"type":"branch","line":311,"loc":{"start":{"line":311,"column":14},"end":{"line":311,"column":58}},"locations":[{"start":{"line":311,"column":14},"end":{"line":311,"column":58}}]},"57":{"type":"branch","line":299,"loc":{"start":{"line":299,"column":14},"end":{"line":302,"column":40}},"locations":[{"start":{"line":299,"column":14},"end":{"line":302,"column":40}}]},"58":{"type":"branch","line":301,"loc":{"start":{"line":301,"column":34},"end":{"line":302,"column":40}},"locations":[{"start":{"line":301,"column":34},"end":{"line":302,"column":40}}]},"59":{"type":"branch","line":323,"loc":{"start":{"line":323,"column":18},"end":{"line":337,"column":9}},"locations":[{"start":{"line":323,"column":18},"end":{"line":337,"column":9}}]},"60":{"type":"branch","line":325,"loc":{"start":{"line":325,"column":28},"end":{"line":325,"column":36}},"locations":[{"start":{"line":325,"column":28},"end":{"line":325,"column":36}}]},"61":{"type":"branch","line":327,"loc":{"start":{"line":327,"column":20},"end":{"line":327,"column":25}},"locations":[{"start":{"line":327,"column":20},"end":{"line":327,"column":25}}]},"62":{"type":"branch","line":328,"loc":{"start":{"line":328,"column":51},"end":{"line":328,"column":77}},"locations":[{"start":{"line":328,"column":51},"end":{"line":328,"column":77}}]},"63":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":32},"end":{"line":334,"column":38}},"locations":[{"start":{"line":334,"column":32},"end":{"line":334,"column":38}}]},"64":{"type":"branch","line":326,"loc":{"start":{"line":326,"column":14},"end":{"line":326,"column":70}},"locations":[{"start":{"line":326,"column":14},"end":{"line":326,"column":70}}]},"65":{"type":"branch","line":345,"loc":{"start":{"line":345,"column":18},"end":{"line":356,"column":9}},"locations":[{"start":{"line":345,"column":18},"end":{"line":356,"column":9}}]},"66":{"type":"branch","line":353,"loc":{"start":{"line":353,"column":45},"end":{"line":353,"column":51}},"locations":[{"start":{"line":353,"column":45},"end":{"line":353,"column":51}}]},"67":{"type":"branch","line":353,"loc":{"start":{"line":353,"column":52},"end":{"line":353,"column":55}},"locations":[{"start":{"line":353,"column":52},"end":{"line":353,"column":55}}]},"68":{"type":"branch","line":366,"loc":{"start":{"line":366,"column":18},"end":{"line":379,"column":9}},"locations":[{"start":{"line":366,"column":18},"end":{"line":379,"column":9}}]},"69":{"type":"branch","line":368,"loc":{"start":{"line":368,"column":28},"end":{"line":368,"column":36}},"locations":[{"start":{"line":368,"column":28},"end":{"line":368,"column":36}}]},"70":{"type":"branch","line":369,"loc":{"start":{"line":369,"column":21},"end":{"line":369,"column":26}},"locations":[{"start":{"line":369,"column":21},"end":{"line":369,"column":26}}]},"71":{"type":"branch","line":370,"loc":{"start":{"line":370,"column":45},"end":{"line":370,"column":68}},"locations":[{"start":{"line":370,"column":45},"end":{"line":370,"column":68}}]},"72":{"type":"branch","line":376,"loc":{"start":{"line":376,"column":32},"end":{"line":376,"column":37}},"locations":[{"start":{"line":376,"column":32},"end":{"line":376,"column":37}}]},"73":{"type":"branch","line":368,"loc":{"start":{"line":368,"column":37},"end":{"line":368,"column":71}},"locations":[{"start":{"line":368,"column":37},"end":{"line":368,"column":71}}]},"74":{"type":"branch","line":386,"loc":{"start":{"line":386,"column":18},"end":{"line":401,"column":9}},"locations":[{"start":{"line":386,"column":18},"end":{"line":401,"column":9}}]},"75":{"type":"branch","line":388,"loc":{"start":{"line":388,"column":12},"end":{"line":388,"column":60}},"locations":[{"start":{"line":388,"column":12},"end":{"line":388,"column":60}}]},"76":{"type":"branch","line":391,"loc":{"start":{"line":391,"column":36},"end":{"line":391,"column":62}},"locations":[{"start":{"line":391,"column":36},"end":{"line":391,"column":62}}]},"77":{"type":"branch","line":392,"loc":{"start":{"line":392,"column":37},"end":{"line":392,"column":54}},"locations":[{"start":{"line":392,"column":37},"end":{"line":392,"column":54}}]},"78":{"type":"branch","line":398,"loc":{"start":{"line":398,"column":32},"end":{"line":398,"column":37}},"locations":[{"start":{"line":398,"column":32},"end":{"line":398,"column":37}}]},"79":{"type":"branch","line":408,"loc":{"start":{"line":408,"column":18},"end":{"line":423,"column":9}},"locations":[{"start":{"line":408,"column":18},"end":{"line":423,"column":9}}]},"80":{"type":"branch","line":410,"loc":{"start":{"line":410,"column":28},"end":{"line":410,"column":36}},"locations":[{"start":{"line":410,"column":28},"end":{"line":410,"column":36}}]},"81":{"type":"branch","line":412,"loc":{"start":{"line":412,"column":20},"end":{"line":412,"column":25}},"locations":[{"start":{"line":412,"column":20},"end":{"line":412,"column":25}}]},"82":{"type":"branch","line":413,"loc":{"start":{"line":413,"column":45},"end":{"line":413,"column":71}},"locations":[{"start":{"line":413,"column":45},"end":{"line":413,"column":71}}]},"83":{"type":"branch","line":414,"loc":{"start":{"line":414,"column":40},"end":{"line":414,"column":53}},"locations":[{"start":{"line":414,"column":40},"end":{"line":414,"column":53}}]},"84":{"type":"branch","line":420,"loc":{"start":{"line":420,"column":32},"end":{"line":420,"column":38}},"locations":[{"start":{"line":420,"column":32},"end":{"line":420,"column":38}}]},"85":{"type":"branch","line":411,"loc":{"start":{"line":411,"column":14},"end":{"line":411,"column":69}},"locations":[{"start":{"line":411,"column":14},"end":{"line":411,"column":69}}]},"86":{"type":"branch","line":430,"loc":{"start":{"line":430,"column":18},"end":{"line":444,"column":9}},"locations":[{"start":{"line":430,"column":18},"end":{"line":444,"column":9}}]},"87":{"type":"branch","line":432,"loc":{"start":{"line":432,"column":28},"end":{"line":432,"column":36}},"locations":[{"start":{"line":432,"column":28},"end":{"line":432,"column":36}}]},"88":{"type":"branch","line":434,"loc":{"start":{"line":434,"column":20},"end":{"line":434,"column":25}},"locations":[{"start":{"line":434,"column":20},"end":{"line":434,"column":25}}]},"89":{"type":"branch","line":441,"loc":{"start":{"line":441,"column":33},"end":{"line":441,"column":39}},"locations":[{"start":{"line":441,"column":33},"end":{"line":441,"column":39}}]},"90":{"type":"branch","line":433,"loc":{"start":{"line":433,"column":14},"end":{"line":433,"column":70}},"locations":[{"start":{"line":433,"column":14},"end":{"line":433,"column":70}}]},"91":{"type":"branch","line":452,"loc":{"start":{"line":452,"column":18},"end":{"line":466,"column":9}},"locations":[{"start":{"line":452,"column":18},"end":{"line":466,"column":9}}]},"92":{"type":"branch","line":454,"loc":{"start":{"line":454,"column":12},"end":{"line":454,"column":59}},"locations":[{"start":{"line":454,"column":12},"end":{"line":454,"column":59}}]},"93":{"type":"branch","line":457,"loc":{"start":{"line":457,"column":36},"end":{"line":457,"column":47}},"locations":[{"start":{"line":457,"column":36},"end":{"line":457,"column":47}}]},"94":{"type":"branch","line":463,"loc":{"start":{"line":463,"column":32},"end":{"line":463,"column":37}},"locations":[{"start":{"line":463,"column":32},"end":{"line":463,"column":37}}]},"95":{"type":"branch","line":475,"loc":{"start":{"line":475,"column":18},"end":{"line":488,"column":9}},"locations":[{"start":{"line":475,"column":18},"end":{"line":488,"column":9}}]},"96":{"type":"branch","line":477,"loc":{"start":{"line":477,"column":28},"end":{"line":477,"column":34}},"locations":[{"start":{"line":477,"column":28},"end":{"line":477,"column":34}}]},"97":{"type":"branch","line":479,"loc":{"start":{"line":479,"column":13},"end":{"line":479,"column":22}},"locations":[{"start":{"line":479,"column":13},"end":{"line":479,"column":22}}]},"98":{"type":"branch","line":485,"loc":{"start":{"line":485,"column":40},"end":{"line":485,"column":46}},"locations":[{"start":{"line":485,"column":40},"end":{"line":485,"column":46}}]},"99":{"type":"branch","line":478,"loc":{"start":{"line":478,"column":14},"end":{"line":478,"column":76}},"locations":[{"start":{"line":478,"column":14},"end":{"line":478,"column":76}}]},"100":{"type":"branch","line":478,"loc":{"start":{"line":478,"column":40},"end":{"line":478,"column":76}},"locations":[{"start":{"line":478,"column":40},"end":{"line":478,"column":76}}]},"101":{"type":"branch","line":496,"loc":{"start":{"line":496,"column":18},"end":{"line":509,"column":9}},"locations":[{"start":{"line":496,"column":18},"end":{"line":509,"column":9}}]},"102":{"type":"branch","line":499,"loc":{"start":{"line":499,"column":31},"end":{"line":499,"column":43}},"locations":[{"start":{"line":499,"column":31},"end":{"line":499,"column":43}}]},"103":{"type":"branch","line":499,"loc":{"start":{"line":499,"column":43},"end":{"line":499,"column":64}},"locations":[{"start":{"line":499,"column":43},"end":{"line":499,"column":64}}]},"104":{"type":"branch","line":505,"loc":{"start":{"line":505,"column":32},"end":{"line":505,"column":37}},"locations":[{"start":{"line":505,"column":32},"end":{"line":505,"column":37}}]},"105":{"type":"branch","line":519,"loc":{"start":{"line":519,"column":18},"end":{"line":531,"column":9}},"locations":[{"start":{"line":519,"column":18},"end":{"line":531,"column":9}}]},"106":{"type":"branch","line":522,"loc":{"start":{"line":522,"column":33},"end":{"line":522,"column":46}},"locations":[{"start":{"line":522,"column":33},"end":{"line":522,"column":46}}]},"107":{"type":"branch","line":528,"loc":{"start":{"line":528,"column":32},"end":{"line":528,"column":38}},"locations":[{"start":{"line":528,"column":32},"end":{"line":528,"column":38}}]},"108":{"type":"branch","line":538,"loc":{"start":{"line":538,"column":18},"end":{"line":551,"column":9}},"locations":[{"start":{"line":538,"column":18},"end":{"line":551,"column":9}}]},"109":{"type":"branch","line":540,"loc":{"start":{"line":540,"column":28},"end":{"line":540,"column":33}},"locations":[{"start":{"line":540,"column":28},"end":{"line":540,"column":33}}]},"110":{"type":"branch","line":542,"loc":{"start":{"line":542,"column":44},"end":{"line":542,"column":70}},"locations":[{"start":{"line":542,"column":44},"end":{"line":542,"column":70}}]},"111":{"type":"branch","line":548,"loc":{"start":{"line":548,"column":32},"end":{"line":548,"column":37}},"locations":[{"start":{"line":548,"column":32},"end":{"line":548,"column":37}}]},"112":{"type":"branch","line":540,"loc":{"start":{"line":540,"column":34},"end":{"line":540,"column":53}},"locations":[{"start":{"line":540,"column":34},"end":{"line":540,"column":53}}]},"113":{"type":"branch","line":559,"loc":{"start":{"line":559,"column":18},"end":{"line":569,"column":9}},"locations":[{"start":{"line":559,"column":18},"end":{"line":569,"column":9}}]},"114":{"type":"branch","line":560,"loc":{"start":{"line":560,"column":54},"end":{"line":560,"column":72}},"locations":[{"start":{"line":560,"column":54},"end":{"line":560,"column":72}}]},"115":{"type":"branch","line":566,"loc":{"start":{"line":566,"column":47},"end":{"line":566,"column":52}},"locations":[{"start":{"line":566,"column":47},"end":{"line":566,"column":52}}]},"116":{"type":"branch","line":566,"loc":{"start":{"line":566,"column":53},"end":{"line":566,"column":56}},"locations":[{"start":{"line":566,"column":53},"end":{"line":566,"column":56}}]},"117":{"type":"branch","line":579,"loc":{"start":{"line":579,"column":18},"end":{"line":592,"column":9}},"locations":[{"start":{"line":579,"column":18},"end":{"line":592,"column":9}}]},"118":{"type":"branch","line":581,"loc":{"start":{"line":581,"column":28},"end":{"line":581,"column":36}},"locations":[{"start":{"line":581,"column":28},"end":{"line":581,"column":36}}]},"119":{"type":"branch","line":582,"loc":{"start":{"line":582,"column":21},"end":{"line":582,"column":26}},"locations":[{"start":{"line":582,"column":21},"end":{"line":582,"column":26}}]},"120":{"type":"branch","line":589,"loc":{"start":{"line":589,"column":32},"end":{"line":589,"column":66}},"locations":[{"start":{"line":589,"column":32},"end":{"line":589,"column":66}}]},"121":{"type":"branch","line":581,"loc":{"start":{"line":581,"column":37},"end":{"line":581,"column":71}},"locations":[{"start":{"line":581,"column":37},"end":{"line":581,"column":71}}]},"122":{"type":"branch","line":600,"loc":{"start":{"line":600,"column":18},"end":{"line":614,"column":9}},"locations":[{"start":{"line":600,"column":18},"end":{"line":614,"column":9}}]},"123":{"type":"branch","line":602,"loc":{"start":{"line":602,"column":28},"end":{"line":602,"column":36}},"locations":[{"start":{"line":602,"column":28},"end":{"line":602,"column":36}}]},"124":{"type":"branch","line":604,"loc":{"start":{"line":604,"column":20},"end":{"line":604,"column":25}},"locations":[{"start":{"line":604,"column":20},"end":{"line":604,"column":25}}]},"125":{"type":"branch","line":611,"loc":{"start":{"line":611,"column":32},"end":{"line":611,"column":63}},"locations":[{"start":{"line":611,"column":32},"end":{"line":611,"column":63}}]},"126":{"type":"branch","line":603,"loc":{"start":{"line":603,"column":14},"end":{"line":603,"column":76}},"locations":[{"start":{"line":603,"column":14},"end":{"line":603,"column":76}}]},"127":{"type":"branch","line":621,"loc":{"start":{"line":621,"column":18},"end":{"line":638,"column":9}},"locations":[{"start":{"line":621,"column":18},"end":{"line":638,"column":9}}]},"128":{"type":"branch","line":623,"loc":{"start":{"line":623,"column":28},"end":{"line":623,"column":36}},"locations":[{"start":{"line":623,"column":28},"end":{"line":623,"column":36}}]},"129":{"type":"branch","line":628,"loc":{"start":{"line":628,"column":20},"end":{"line":628,"column":25}},"locations":[{"start":{"line":628,"column":20},"end":{"line":628,"column":25}}]},"130":{"type":"branch","line":629,"loc":{"start":{"line":629,"column":45},"end":{"line":629,"column":66}},"locations":[{"start":{"line":629,"column":45},"end":{"line":629,"column":66}}]},"131":{"type":"branch","line":635,"loc":{"start":{"line":635,"column":32},"end":{"line":635,"column":37}},"locations":[{"start":{"line":635,"column":32},"end":{"line":635,"column":37}}]},"132":{"type":"branch","line":624,"loc":{"start":{"line":624,"column":14},"end":{"line":627,"column":39}},"locations":[{"start":{"line":624,"column":14},"end":{"line":627,"column":39}}]},"133":{"type":"branch","line":648,"loc":{"start":{"line":648,"column":18},"end":{"line":660,"column":9}},"locations":[{"start":{"line":648,"column":18},"end":{"line":660,"column":9}}]},"134":{"type":"branch","line":651,"loc":{"start":{"line":651,"column":36},"end":{"line":651,"column":64}},"locations":[{"start":{"line":651,"column":36},"end":{"line":651,"column":64}}]},"135":{"type":"branch","line":657,"loc":{"start":{"line":657,"column":43},"end":{"line":657,"column":49}},"locations":[{"start":{"line":657,"column":43},"end":{"line":657,"column":49}}]},"136":{"type":"branch","line":668,"loc":{"start":{"line":668,"column":18},"end":{"line":684,"column":9}},"locations":[{"start":{"line":668,"column":18},"end":{"line":684,"column":9}}]},"137":{"type":"branch","line":670,"loc":{"start":{"line":670,"column":28},"end":{"line":670,"column":35}},"locations":[{"start":{"line":670,"column":28},"end":{"line":670,"column":35}}]},"138":{"type":"branch","line":672,"loc":{"start":{"line":672,"column":13},"end":{"line":672,"column":22}},"locations":[{"start":{"line":672,"column":13},"end":{"line":672,"column":22}}]},"139":{"type":"branch","line":674,"loc":{"start":{"line":674,"column":31},"end":{"line":674,"column":71}},"locations":[{"start":{"line":674,"column":31},"end":{"line":674,"column":71}}]},"140":{"type":"branch","line":680,"loc":{"start":{"line":680,"column":32},"end":{"line":680,"column":37}},"locations":[{"start":{"line":680,"column":32},"end":{"line":680,"column":37}}]},"141":{"type":"branch","line":671,"loc":{"start":{"line":671,"column":14},"end":{"line":671,"column":70}},"locations":[{"start":{"line":671,"column":14},"end":{"line":671,"column":70}}]},"142":{"type":"branch","line":694,"loc":{"start":{"line":694,"column":18},"end":{"line":708,"column":9}},"locations":[{"start":{"line":694,"column":18},"end":{"line":708,"column":9}}]},"143":{"type":"branch","line":696,"loc":{"start":{"line":696,"column":45},"end":{"line":697,"column":49}},"locations":[{"start":{"line":696,"column":45},"end":{"line":697,"column":49}}]},"144":{"type":"branch","line":699,"loc":{"start":{"line":699,"column":38},"end":{"line":699,"column":49}},"locations":[{"start":{"line":699,"column":38},"end":{"line":699,"column":49}}]},"145":{"type":"branch","line":705,"loc":{"start":{"line":705,"column":32},"end":{"line":705,"column":37}},"locations":[{"start":{"line":705,"column":32},"end":{"line":705,"column":37}}]},"146":{"type":"branch","line":705,"loc":{"start":{"line":705,"column":38},"end":{"line":705,"column":41}},"locations":[{"start":{"line":705,"column":38},"end":{"line":705,"column":41}}]},"147":{"type":"branch","line":715,"loc":{"start":{"line":715,"column":18},"end":{"line":727,"column":9}},"locations":[{"start":{"line":715,"column":18},"end":{"line":727,"column":9}}]},"148":{"type":"branch","line":718,"loc":{"start":{"line":718,"column":41},"end":{"line":718,"column":54}},"locations":[{"start":{"line":718,"column":41},"end":{"line":718,"column":54}}]},"149":{"type":"branch","line":724,"loc":{"start":{"line":724,"column":32},"end":{"line":724,"column":38}},"locations":[{"start":{"line":724,"column":32},"end":{"line":724,"column":38}}]},"150":{"type":"branch","line":724,"loc":{"start":{"line":724,"column":39},"end":{"line":724,"column":66}},"locations":[{"start":{"line":724,"column":39},"end":{"line":724,"column":66}}]},"151":{"type":"branch","line":724,"loc":{"start":{"line":724,"column":57},"end":{"line":724,"column":62}},"locations":[{"start":{"line":724,"column":57},"end":{"line":724,"column":62}}]},"152":{"type":"branch","line":734,"loc":{"start":{"line":734,"column":18},"end":{"line":747,"column":9}},"locations":[{"start":{"line":734,"column":18},"end":{"line":747,"column":9}}]},"153":{"type":"branch","line":737,"loc":{"start":{"line":737,"column":35},"end":{"line":737,"column":58}},"locations":[{"start":{"line":737,"column":35},"end":{"line":737,"column":58}}]},"154":{"type":"branch","line":738,"loc":{"start":{"line":738,"column":42},"end":{"line":738,"column":64}},"locations":[{"start":{"line":738,"column":42},"end":{"line":738,"column":64}}]},"155":{"type":"branch","line":744,"loc":{"start":{"line":744,"column":32},"end":{"line":744,"column":38}},"locations":[{"start":{"line":744,"column":32},"end":{"line":744,"column":38}}]},"156":{"type":"branch","line":744,"loc":{"start":{"line":744,"column":39},"end":{"line":744,"column":42}},"locations":[{"start":{"line":744,"column":39},"end":{"line":744,"column":42}}]},"157":{"type":"branch","line":754,"loc":{"start":{"line":754,"column":18},"end":{"line":767,"column":9}},"locations":[{"start":{"line":754,"column":18},"end":{"line":767,"column":9}}]},"158":{"type":"branch","line":764,"loc":{"start":{"line":764,"column":32},"end":{"line":764,"column":37}},"locations":[{"start":{"line":764,"column":32},"end":{"line":764,"column":37}}]},"159":{"type":"branch","line":775,"loc":{"start":{"line":775,"column":18},"end":{"line":791,"column":9}},"locations":[{"start":{"line":775,"column":18},"end":{"line":791,"column":9}}]},"160":{"type":"branch","line":777,"loc":{"start":{"line":777,"column":28},"end":{"line":777,"column":36}},"locations":[{"start":{"line":777,"column":28},"end":{"line":777,"column":36}}]},"161":{"type":"branch","line":779,"loc":{"start":{"line":779,"column":20},"end":{"line":779,"column":25}},"locations":[{"start":{"line":779,"column":20},"end":{"line":779,"column":25}}]},"162":{"type":"branch","line":781,"loc":{"start":{"line":781,"column":28},"end":{"line":781,"column":48}},"locations":[{"start":{"line":781,"column":28},"end":{"line":781,"column":48}}]},"163":{"type":"branch","line":781,"loc":{"start":{"line":781,"column":48},"end":{"line":781,"column":74}},"locations":[{"start":{"line":781,"column":48},"end":{"line":781,"column":74}}]},"164":{"type":"branch","line":787,"loc":{"start":{"line":787,"column":38},"end":{"line":787,"column":44}},"locations":[{"start":{"line":787,"column":38},"end":{"line":787,"column":44}}]},"165":{"type":"branch","line":778,"loc":{"start":{"line":778,"column":14},"end":{"line":778,"column":70}},"locations":[{"start":{"line":778,"column":14},"end":{"line":778,"column":70}}]},"166":{"type":"branch","line":801,"loc":{"start":{"line":801,"column":18},"end":{"line":814,"column":9}},"locations":[{"start":{"line":801,"column":18},"end":{"line":814,"column":9}}]},"167":{"type":"branch","line":804,"loc":{"start":{"line":804,"column":53},"end":{"line":805,"column":46}},"locations":[{"start":{"line":804,"column":53},"end":{"line":805,"column":46}}]},"168":{"type":"branch","line":811,"loc":{"start":{"line":811,"column":36},"end":{"line":811,"column":42}},"locations":[{"start":{"line":811,"column":36},"end":{"line":811,"column":42}}]},"169":{"type":"branch","line":811,"loc":{"start":{"line":811,"column":43},"end":{"line":811,"column":46}},"locations":[{"start":{"line":811,"column":43},"end":{"line":811,"column":46}}]},"170":{"type":"branch","line":822,"loc":{"start":{"line":822,"column":18},"end":{"line":836,"column":9}},"locations":[{"start":{"line":822,"column":18},"end":{"line":836,"column":9}}]},"171":{"type":"branch","line":824,"loc":{"start":{"line":824,"column":28},"end":{"line":824,"column":36}},"locations":[{"start":{"line":824,"column":28},"end":{"line":824,"column":36}}]},"172":{"type":"branch","line":826,"loc":{"start":{"line":826,"column":20},"end":{"line":826,"column":25}},"locations":[{"start":{"line":826,"column":20},"end":{"line":826,"column":25}}]},"173":{"type":"branch","line":833,"loc":{"start":{"line":833,"column":32},"end":{"line":833,"column":66}},"locations":[{"start":{"line":833,"column":32},"end":{"line":833,"column":66}}]},"174":{"type":"branch","line":825,"loc":{"start":{"line":825,"column":14},"end":{"line":825,"column":72}},"locations":[{"start":{"line":825,"column":14},"end":{"line":825,"column":72}}]},"175":{"type":"branch","line":843,"loc":{"start":{"line":843,"column":18},"end":{"line":855,"column":9}},"locations":[{"start":{"line":843,"column":18},"end":{"line":855,"column":9}}]},"176":{"type":"branch","line":844,"loc":{"start":{"line":844,"column":49},"end":{"line":844,"column":73}},"locations":[{"start":{"line":844,"column":49},"end":{"line":844,"column":73}}]},"177":{"type":"branch","line":846,"loc":{"start":{"line":846,"column":33},"end":{"line":846,"column":49}},"locations":[{"start":{"line":846,"column":33},"end":{"line":846,"column":49}}]},"178":{"type":"branch","line":852,"loc":{"start":{"line":852,"column":32},"end":{"line":852,"column":38}},"locations":[{"start":{"line":852,"column":32},"end":{"line":852,"column":38}}]},"179":{"type":"branch","line":852,"loc":{"start":{"line":852,"column":39},"end":{"line":852,"column":42}},"locations":[{"start":{"line":852,"column":39},"end":{"line":852,"column":42}}]},"180":{"type":"branch","line":865,"loc":{"start":{"line":865,"column":18},"end":{"line":875,"column":9}},"locations":[{"start":{"line":865,"column":18},"end":{"line":875,"column":9}}]},"181":{"type":"branch","line":866,"loc":{"start":{"line":866,"column":43},"end":{"line":866,"column":70}},"locations":[{"start":{"line":866,"column":43},"end":{"line":866,"column":70}}]},"182":{"type":"branch","line":872,"loc":{"start":{"line":872,"column":34},"end":{"line":872,"column":40}},"locations":[{"start":{"line":872,"column":34},"end":{"line":872,"column":40}}]},"183":{"type":"branch","line":872,"loc":{"start":{"line":872,"column":41},"end":{"line":872,"column":44}},"locations":[{"start":{"line":872,"column":41},"end":{"line":872,"column":44}}]},"184":{"type":"branch","line":883,"loc":{"start":{"line":883,"column":18},"end":{"line":898,"column":9}},"locations":[{"start":{"line":883,"column":18},"end":{"line":898,"column":9}}]},"185":{"type":"branch","line":885,"loc":{"start":{"line":885,"column":28},"end":{"line":885,"column":33}},"locations":[{"start":{"line":885,"column":28},"end":{"line":885,"column":33}}]},"186":{"type":"branch","line":888,"loc":{"start":{"line":888,"column":28},"end":{"line":888,"column":35}},"locations":[{"start":{"line":888,"column":28},"end":{"line":888,"column":35}}]},"187":{"type":"branch","line":888,"loc":{"start":{"line":888,"column":62},"end":{"line":888,"column":71}},"locations":[{"start":{"line":888,"column":62},"end":{"line":888,"column":71}}]},"188":{"type":"branch","line":889,"loc":{"start":{"line":889,"column":42},"end":{"line":889,"column":54}},"locations":[{"start":{"line":889,"column":42},"end":{"line":889,"column":54}}]},"189":{"type":"branch","line":895,"loc":{"start":{"line":895,"column":32},"end":{"line":895,"column":38}},"locations":[{"start":{"line":895,"column":32},"end":{"line":895,"column":38}}]},"190":{"type":"branch","line":885,"loc":{"start":{"line":885,"column":34},"end":{"line":885,"column":53}},"locations":[{"start":{"line":885,"column":34},"end":{"line":885,"column":53}}]},"191":{"type":"branch","line":888,"loc":{"start":{"line":888,"column":36},"end":{"line":888,"column":61}},"locations":[{"start":{"line":888,"column":36},"end":{"line":888,"column":61}}]},"192":{"type":"branch","line":905,"loc":{"start":{"line":905,"column":18},"end":{"line":922,"column":9}},"locations":[{"start":{"line":905,"column":18},"end":{"line":922,"column":9}}]},"193":{"type":"branch","line":907,"loc":{"start":{"line":907,"column":28},"end":{"line":907,"column":34}},"locations":[{"start":{"line":907,"column":28},"end":{"line":907,"column":34}}]},"194":{"type":"branch","line":912,"loc":{"start":{"line":912,"column":13},"end":{"line":912,"column":22}},"locations":[{"start":{"line":912,"column":13},"end":{"line":912,"column":22}}]},"195":{"type":"branch","line":918,"loc":{"start":{"line":918,"column":36},"end":{"line":918,"column":41}},"locations":[{"start":{"line":918,"column":36},"end":{"line":918,"column":41}}]},"196":{"type":"branch","line":908,"loc":{"start":{"line":908,"column":14},"end":{"line":911,"column":44}},"locations":[{"start":{"line":908,"column":14},"end":{"line":911,"column":44}}]},"197":{"type":"branch","line":928,"loc":{"start":{"line":928,"column":2},"end":{"line":948,"column":3}},"locations":[{"start":{"line":928,"column":2},"end":{"line":948,"column":3}}]},"198":{"type":"branch","line":929,"loc":{"start":{"line":929,"column":36},"end":{"line":929,"column":52}},"locations":[{"start":{"line":929,"column":36},"end":{"line":929,"column":52}}]},"199":{"type":"branch","line":945,"loc":{"start":{"line":945,"column":18},"end":{"line":945,"column":72}},"locations":[{"start":{"line":945,"column":18},"end":{"line":945,"column":72}}]},"200":{"type":"branch","line":945,"loc":{"start":{"line":945,"column":51},"end":{"line":945,"column":72}},"locations":[{"start":{"line":945,"column":51},"end":{"line":945,"column":72}}]}},"b":{"0":[22],"1":[14],"2":[546],"3":[0],"4":[1244],"5":[1],"6":[39],"7":[3],"8":[117],"9":[22],"10":[14],"11":[3],"12":[2],"13":[12],"14":[14],"15":[1],"16":[1],"17":[13],"18":[1],"19":[13],"20":[1],"21":[14],"22":[0],"23":[0],"24":[14],"25":[1],"26":[13],"27":[14],"28":[1],"29":[13],"30":[0],"31":[1],"32":[14],"33":[4],"34":[1],"35":[13],"36":[14],"37":[13],"38":[6],"39":[8],"40":[14],"41":[1],"42":[13],"43":[0],"44":[1],"45":[14],"46":[1],"47":[13],"48":[0],"49":[1],"50":[14],"51":[4],"52":[0],"53":[14],"54":[1],"55":[13],"56":[0],"57":[1],"58":[0],"59":[14],"60":[1],"61":[13],"62":[0],"63":[0],"64":[1],"65":[14],"66":[4],"67":[10],"68":[14],"69":[1],"70":[13],"71":[0],"72":[0],"73":[1],"74":[14],"75":[0],"76":[0],"77":[0],"78":[0],"79":[14],"80":[1],"81":[13],"82":[0],"83":[0],"84":[0],"85":[1],"86":[14],"87":[1],"88":[13],"89":[0],"90":[1],"91":[14],"92":[0],"93":[0],"94":[0],"95":[14],"96":[1],"97":[13],"98":[0],"99":[1],"100":[0],"101":[14],"102":[2],"103":[0],"104":[0],"105":[14],"106":[0],"107":[0],"108":[14],"109":[1],"110":[0],"111":[0],"112":[1],"113":[14],"114":[13],"115":[1],"116":[13],"117":[14],"118":[1],"119":[13],"120":[0],"121":[1],"122":[14],"123":[1],"124":[13],"125":[0],"126":[1],"127":[14],"128":[1],"129":[13],"130":[0],"131":[0],"132":[1],"133":[14],"134":[0],"135":[0],"136":[14],"137":[1],"138":[13],"139":[0],"140":[0],"141":[1],"142":[14],"143":[13],"144":[1],"145":[1],"146":[13],"147":[14],"148":[1],"149":[1],"150":[13],"151":[0],"152":[14],"153":[13],"154":[13],"155":[3],"156":[11],"157":[14],"158":[0],"159":[14],"160":[1],"161":[13],"162":[13],"163":[13],"164":[0],"165":[1],"166":[14],"167":[13],"168":[1],"169":[13],"170":[14],"171":[1],"172":[13],"173":[0],"174":[1],"175":[14],"176":[13],"177":[4],"178":[3],"179":[11],"180":[14],"181":[1],"182":[1],"183":[13],"184":[14],"185":[1],"186":[1],"187":[13],"188":[0],"189":[0],"190":[1],"191":[1],"192":[14],"193":[1],"194":[13],"195":[0],"196":[1],"197":[4],"198":[4],"199":[4],"200":[0]},"fnMap":{"0":{"name":"PatternRecognitionService","decl":{"start":{"line":29,"column":2},"end":{"line":34,"column":3}},"loc":{"start":{"line":29,"column":2},"end":{"line":34,"column":3}},"line":29},"1":{"name":"analyzePatterns","decl":{"start":{"line":40,"column":2},"end":{"line":61,"column":3}},"loc":{"start":{"line":40,"column":2},"end":{"line":61,"column":3}},"line":40},"2":{"name":"getMatchedPatterns","decl":{"start":{"line":64,"column":2},"end":{"line":69,"column":3}},"loc":{"start":{"line":64,"column":2},"end":{"line":69,"column":3}},"line":64},"3":{"name":"getAllPatternDefinitions","decl":{"start":{"line":72,"column":2},"end":{"line":79,"column":3}},"loc":{"start":{"line":72,"column":2},"end":{"line":79,"column":3}},"line":72},"4":{"name":"registerPatterns","decl":{"start":{"line":83,"column":10},"end":{"line":925,"column":3}},"loc":{"start":{"line":83,"column":10},"end":{"line":925,"column":3}},"line":83},"5":{"name":"detector","decl":{"start":{"line":91,"column":18},"end":{"line":98,"column":10}},"loc":{"start":{"line":91,"column":18},"end":{"line":98,"column":10}},"line":91},"6":{"name":"detector","decl":{"start":{"line":105,"column":18},"end":{"line":124,"column":9}},"loc":{"start":{"line":105,"column":18},"end":{"line":124,"column":9}},"line":105},"7":{"name":"detector","decl":{"start":{"line":131,"column":18},"end":{"line":142,"column":9}},"loc":{"start":{"line":131,"column":18},"end":{"line":142,"column":9}},"line":131},"8":{"name":"detector","decl":{"start":{"line":150,"column":18},"end":{"line":161,"column":9}},"loc":{"start":{"line":150,"column":18},"end":{"line":161,"column":9}},"line":150},"9":{"name":"detector","decl":{"start":{"line":169,"column":18},"end":{"line":185,"column":9}},"loc":{"start":{"line":169,"column":18},"end":{"line":185,"column":9}},"line":169},"10":{"name":"detector","decl":{"start":{"line":195,"column":18},"end":{"line":207,"column":9}},"loc":{"start":{"line":195,"column":18},"end":{"line":207,"column":9}},"line":195},"11":{"name":"detector","decl":{"start":{"line":215,"column":18},"end":{"line":226,"column":9}},"loc":{"start":{"line":215,"column":18},"end":{"line":226,"column":9}},"line":215},"12":{"name":"detector","decl":{"start":{"line":233,"column":18},"end":{"line":247,"column":9}},"loc":{"start":{"line":233,"column":18},"end":{"line":247,"column":9}},"line":233},"13":{"name":"detector","decl":{"start":{"line":255,"column":18},"end":{"line":268,"column":9}},"loc":{"start":{"line":255,"column":18},"end":{"line":268,"column":9}},"line":255},"14":{"name":"detector","decl":{"start":{"line":275,"column":18},"end":{"line":286,"column":9}},"loc":{"start":{"line":275,"column":18},"end":{"line":286,"column":9}},"line":275},"15":{"name":"detector","decl":{"start":{"line":296,"column":18},"end":{"line":315,"column":9}},"loc":{"start":{"line":296,"column":18},"end":{"line":315,"column":9}},"line":296},"16":{"name":"detector","decl":{"start":{"line":323,"column":18},"end":{"line":337,"column":9}},"loc":{"start":{"line":323,"column":18},"end":{"line":337,"column":9}},"line":323},"17":{"name":"detector","decl":{"start":{"line":345,"column":18},"end":{"line":356,"column":9}},"loc":{"start":{"line":345,"column":18},"end":{"line":356,"column":9}},"line":345},"18":{"name":"detector","decl":{"start":{"line":366,"column":18},"end":{"line":379,"column":9}},"loc":{"start":{"line":366,"column":18},"end":{"line":379,"column":9}},"line":366},"19":{"name":"detector","decl":{"start":{"line":386,"column":18},"end":{"line":401,"column":9}},"loc":{"start":{"line":386,"column":18},"end":{"line":401,"column":9}},"line":386},"20":{"name":"detector","decl":{"start":{"line":408,"column":18},"end":{"line":423,"column":9}},"loc":{"start":{"line":408,"column":18},"end":{"line":423,"column":9}},"line":408},"21":{"name":"detector","decl":{"start":{"line":430,"column":18},"end":{"line":444,"column":9}},"loc":{"start":{"line":430,"column":18},"end":{"line":444,"column":9}},"line":430},"22":{"name":"detector","decl":{"start":{"line":452,"column":18},"end":{"line":466,"column":9}},"loc":{"start":{"line":452,"column":18},"end":{"line":466,"column":9}},"line":452},"23":{"name":"detector","decl":{"start":{"line":475,"column":18},"end":{"line":488,"column":9}},"loc":{"start":{"line":475,"column":18},"end":{"line":488,"column":9}},"line":475},"24":{"name":"detector","decl":{"start":{"line":496,"column":18},"end":{"line":509,"column":9}},"loc":{"start":{"line":496,"column":18},"end":{"line":509,"column":9}},"line":496},"25":{"name":"detector","decl":{"start":{"line":519,"column":18},"end":{"line":531,"column":9}},"loc":{"start":{"line":519,"column":18},"end":{"line":531,"column":9}},"line":519},"26":{"name":"detector","decl":{"start":{"line":538,"column":18},"end":{"line":551,"column":9}},"loc":{"start":{"line":538,"column":18},"end":{"line":551,"column":9}},"line":538},"27":{"name":"detector","decl":{"start":{"line":559,"column":18},"end":{"line":569,"column":9}},"loc":{"start":{"line":559,"column":18},"end":{"line":569,"column":9}},"line":559},"28":{"name":"detector","decl":{"start":{"line":579,"column":18},"end":{"line":592,"column":9}},"loc":{"start":{"line":579,"column":18},"end":{"line":592,"column":9}},"line":579},"29":{"name":"detector","decl":{"start":{"line":600,"column":18},"end":{"line":614,"column":9}},"loc":{"start":{"line":600,"column":18},"end":{"line":614,"column":9}},"line":600},"30":{"name":"detector","decl":{"start":{"line":621,"column":18},"end":{"line":638,"column":9}},"loc":{"start":{"line":621,"column":18},"end":{"line":638,"column":9}},"line":621},"31":{"name":"detector","decl":{"start":{"line":648,"column":18},"end":{"line":660,"column":9}},"loc":{"start":{"line":648,"column":18},"end":{"line":660,"column":9}},"line":648},"32":{"name":"detector","decl":{"start":{"line":668,"column":18},"end":{"line":684,"column":9}},"loc":{"start":{"line":668,"column":18},"end":{"line":684,"column":9}},"line":668},"33":{"name":"detector","decl":{"start":{"line":694,"column":18},"end":{"line":708,"column":9}},"loc":{"start":{"line":694,"column":18},"end":{"line":708,"column":9}},"line":694},"34":{"name":"detector","decl":{"start":{"line":715,"column":18},"end":{"line":727,"column":9}},"loc":{"start":{"line":715,"column":18},"end":{"line":727,"column":9}},"line":715},"35":{"name":"detector","decl":{"start":{"line":734,"column":18},"end":{"line":747,"column":9}},"loc":{"start":{"line":734,"column":18},"end":{"line":747,"column":9}},"line":734},"36":{"name":"detector","decl":{"start":{"line":754,"column":18},"end":{"line":767,"column":9}},"loc":{"start":{"line":754,"column":18},"end":{"line":767,"column":9}},"line":754},"37":{"name":"detector","decl":{"start":{"line":775,"column":18},"end":{"line":791,"column":9}},"loc":{"start":{"line":775,"column":18},"end":{"line":791,"column":9}},"line":775},"38":{"name":"detector","decl":{"start":{"line":801,"column":18},"end":{"line":814,"column":9}},"loc":{"start":{"line":801,"column":18},"end":{"line":814,"column":9}},"line":801},"39":{"name":"detector","decl":{"start":{"line":822,"column":18},"end":{"line":836,"column":9}},"loc":{"start":{"line":822,"column":18},"end":{"line":836,"column":9}},"line":822},"40":{"name":"detector","decl":{"start":{"line":843,"column":18},"end":{"line":855,"column":9}},"loc":{"start":{"line":843,"column":18},"end":{"line":855,"column":9}},"line":843},"41":{"name":"detector","decl":{"start":{"line":865,"column":18},"end":{"line":875,"column":9}},"loc":{"start":{"line":865,"column":18},"end":{"line":875,"column":9}},"line":865},"42":{"name":"detector","decl":{"start":{"line":883,"column":18},"end":{"line":898,"column":9}},"loc":{"start":{"line":883,"column":18},"end":{"line":898,"column":9}},"line":883},"43":{"name":"detector","decl":{"start":{"line":905,"column":18},"end":{"line":922,"column":9}},"loc":{"start":{"line":905,"column":18},"end":{"line":922,"column":9}},"line":905},"44":{"name":"inferFraudTypes","decl":{"start":{"line":928,"column":2},"end":{"line":948,"column":3}},"loc":{"start":{"line":928,"column":2},"end":{"line":948,"column":3}},"line":928}},"f":{"0":22,"1":14,"2":1,"3":3,"4":22,"5":14,"6":14,"7":14,"8":14,"9":14,"10":14,"11":14,"12":14,"13":14,"14":14,"15":14,"16":14,"17":14,"18":14,"19":14,"20":14,"21":14,"22":14,"23":14,"24":14,"25":14,"26":14,"27":14,"28":14,"29":14,"30":14,"31":14,"32":14,"33":14,"34":14,"35":14,"36":14,"37":14,"38":14,"39":14,"40":14,"41":14,"42":14,"43":14,"44":4}} +,"/workspaces/CurrentDao-backend/src/fraud/prevention/fraud-prevention.service.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/prevention/fraud-prevention.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":18}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":16}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":39}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":79}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":32}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":17}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":25}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":27}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":22}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":23}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":13}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":37}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":68}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":57}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":69}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":55}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":49}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":30}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":36}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":21}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":20}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":25}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":60}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":42}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":43}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":54}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":46}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":80}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":14}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":38}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":70}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":78}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":64}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":50}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":22}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":31}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":21}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":35}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":29}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":57}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":33}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":47}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":39}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":37}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":14}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":22}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":40}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":8}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":5}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":25}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":57}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":21}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":23}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":66}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":23}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":61}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":57}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":16}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":25}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":25}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":10}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":14}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":39}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":45}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":7}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":26}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":56}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":24}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":19}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":73}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":8}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":55}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":14}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":23}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":23}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":16}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":35}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":8}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":23}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":32}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":44}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":21}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":97}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":10}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":57}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":25}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":29}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":37}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":10}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":7}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":45}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":21}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":72}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":10}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":16}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":24}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":29}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":18}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":38}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":10}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":7}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":5}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":37}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":34}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":19}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":84}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":8}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":14}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":22}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":23}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":16}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":36}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":8}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":5}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":31}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":74}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":80}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":55}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":14}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":23}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":16}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":35}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":8}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":40}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":61}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":56}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":7}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":26}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":64}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":14}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":23}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":23}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":16}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":35}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":8}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":35}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":12}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":30}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":79}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":33}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":3}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":78}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":28}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":27}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":11}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":35}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":56}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":13}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":39}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":15}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":13}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":28}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":16}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":15}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":7}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":21}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":106}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":6}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":3}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":44}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":57}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":55}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":19}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":3}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":46}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":52}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":29}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":58}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":43}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":19}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":5}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":16}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":40}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":52}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":3}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":78}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":42}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":33}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":62}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":3}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":47}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":36}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":66}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":3}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":28}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":38}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":3}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":78}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":32}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":21}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":32}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":21}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":75}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":11}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":12}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":12}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":20}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":16}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":45}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":46}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":43}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":45}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":53}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":6}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":3}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":76}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":5}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":70}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":58}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":5}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":75}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":56}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":23}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":27}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":96}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":31}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":62}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":8}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":59}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":23}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":27}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":63}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":27}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":41}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":8}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":5}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":3}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":77}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":53}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":27}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":38}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":65}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":41}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":64}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":48}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":55}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":3}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":51}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":65}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":32}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":52}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":3}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":72}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":31}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":42}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":26}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":32}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":59}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":12}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":21}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":135}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":6}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":22,"55":22,"56":22,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":14,"66":14,"67":14,"68":14,"69":14,"70":14,"71":14,"72":14,"73":14,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":13,"83":13,"84":13,"85":14,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":0,"99":0,"100":0,"101":1,"102":12,"103":12,"104":12,"105":14,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":11,"118":11,"119":11,"120":11,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":10,"133":11,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":11,"145":9,"146":9,"147":14,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":9,"159":9,"160":14,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":8,"171":8,"172":8,"173":8,"174":8,"175":8,"176":14,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":7,"186":7,"187":7,"188":7,"189":14,"190":14,"191":14,"192":14,"193":14,"194":1,"195":1,"196":1,"197":1,"198":7,"199":7,"200":7,"201":7,"202":7,"203":7,"204":7,"205":7,"206":7,"207":7,"208":7,"209":7,"210":7,"211":7,"212":7,"213":7,"214":7,"215":7,"216":7,"217":7,"218":7,"219":1,"220":1,"221":2,"222":2,"223":1,"224":1,"225":2,"226":2,"227":1,"228":1,"229":6,"230":6,"231":6,"232":1,"233":1,"234":1,"235":3,"236":3,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":3,"246":3,"247":3,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":2,"256":2,"257":1,"258":1,"259":1,"260":1,"261":2,"262":2,"263":2,"264":1,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":3,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":3,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":3,"302":1,"303":1,"304":1,"305":1,"306":12,"307":12,"308":12,"309":12,"310":12,"311":12,"312":12,"313":12,"314":12,"315":12,"316":1,"317":1,"318":7,"319":7,"320":7,"321":7,"322":1,"323":1,"324":4,"325":4,"326":4,"327":4,"328":4,"329":4,"330":4,"331":4,"332":4,"333":4,"334":1},"branchMap":{"0":{"type":"branch","line":54,"loc":{"start":{"line":54,"column":2},"end":{"line":57,"column":6}},"locations":[{"start":{"line":54,"column":2},"end":{"line":57,"column":6}}]},"1":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":2},"end":{"line":194,"column":3}},"locations":[{"start":{"line":65,"column":2},"end":{"line":194,"column":3}}]},"2":{"type":"branch","line":74,"loc":{"start":{"line":74,"column":38},"end":{"line":82,"column":5}},"locations":[{"start":{"line":74,"column":38},"end":{"line":82,"column":5}}]},"3":{"type":"branch","line":83,"loc":{"start":{"line":83,"column":-1},"end":{"line":86,"column":20}},"locations":[{"start":{"line":83,"column":-1},"end":{"line":86,"column":20}}]},"4":{"type":"branch","line":86,"loc":{"start":{"line":86,"column":20},"end":{"line":102,"column":5}},"locations":[{"start":{"line":86,"column":20},"end":{"line":102,"column":5}}]},"5":{"type":"branch","line":88,"loc":{"start":{"line":88,"column":28},"end":{"line":88,"column":65}},"locations":[{"start":{"line":88,"column":28},"end":{"line":88,"column":65}}]},"6":{"type":"branch","line":91,"loc":{"start":{"line":91,"column":50},"end":{"line":91,"column":55}},"locations":[{"start":{"line":91,"column":50},"end":{"line":91,"column":55}}]},"7":{"type":"branch","line":98,"loc":{"start":{"line":98,"column":7},"end":{"line":101,"column":7}},"locations":[{"start":{"line":98,"column":7},"end":{"line":101,"column":7}}]},"8":{"type":"branch","line":103,"loc":{"start":{"line":103,"column":-1},"end":{"line":106,"column":23}},"locations":[{"start":{"line":103,"column":-1},"end":{"line":106,"column":23}}]},"9":{"type":"branch","line":106,"loc":{"start":{"line":106,"column":23},"end":{"line":117,"column":5}},"locations":[{"start":{"line":106,"column":23},"end":{"line":117,"column":5}}]},"10":{"type":"branch","line":110,"loc":{"start":{"line":110,"column":48},"end":{"line":110,"column":53}},"locations":[{"start":{"line":110,"column":48},"end":{"line":110,"column":53}}]},"11":{"type":"branch","line":118,"loc":{"start":{"line":118,"column":-1},"end":{"line":145,"column":5}},"locations":[{"start":{"line":118,"column":-1},"end":{"line":145,"column":5}}]},"12":{"type":"branch","line":121,"loc":{"start":{"line":121,"column":43},"end":{"line":132,"column":7}},"locations":[{"start":{"line":121,"column":43},"end":{"line":132,"column":7}}]},"13":{"type":"branch","line":125,"loc":{"start":{"line":125,"column":50},"end":{"line":125,"column":55}},"locations":[{"start":{"line":125,"column":50},"end":{"line":125,"column":55}}]},"14":{"type":"branch","line":133,"loc":{"start":{"line":133,"column":-1},"end":{"line":134,"column":44}},"locations":[{"start":{"line":133,"column":-1},"end":{"line":134,"column":44}}]},"15":{"type":"branch","line":134,"loc":{"start":{"line":134,"column":44},"end":{"line":144,"column":7}},"locations":[{"start":{"line":134,"column":44},"end":{"line":144,"column":7}}]},"16":{"type":"branch","line":146,"loc":{"start":{"line":146,"column":-1},"end":{"line":148,"column":33}},"locations":[{"start":{"line":146,"column":-1},"end":{"line":148,"column":33}}]},"17":{"type":"branch","line":148,"loc":{"start":{"line":148,"column":33},"end":{"line":158,"column":5}},"locations":[{"start":{"line":148,"column":33},"end":{"line":158,"column":5}}]},"18":{"type":"branch","line":159,"loc":{"start":{"line":159,"column":-1},"end":{"line":161,"column":35}},"locations":[{"start":{"line":159,"column":-1},"end":{"line":161,"column":35}}]},"19":{"type":"branch","line":161,"loc":{"start":{"line":161,"column":31},"end":{"line":161,"column":71}},"locations":[{"start":{"line":161,"column":31},"end":{"line":161,"column":71}}]},"20":{"type":"branch","line":161,"loc":{"start":{"line":161,"column":73},"end":{"line":170,"column":5}},"locations":[{"start":{"line":161,"column":73},"end":{"line":170,"column":5}}]},"21":{"type":"branch","line":163,"loc":{"start":{"line":163,"column":48},"end":{"line":163,"column":53}},"locations":[{"start":{"line":163,"column":48},"end":{"line":163,"column":53}}]},"22":{"type":"branch","line":171,"loc":{"start":{"line":171,"column":-1},"end":{"line":177,"column":25}},"locations":[{"start":{"line":171,"column":-1},"end":{"line":177,"column":25}}]},"23":{"type":"branch","line":177,"loc":{"start":{"line":177,"column":25},"end":{"line":185,"column":5}},"locations":[{"start":{"line":177,"column":25},"end":{"line":185,"column":5}}]},"24":{"type":"branch","line":186,"loc":{"start":{"line":186,"column":-1},"end":{"line":190,"column":28}},"locations":[{"start":{"line":186,"column":-1},"end":{"line":190,"column":28}}]},"25":{"type":"branch","line":190,"loc":{"start":{"line":190,"column":24},"end":{"line":190,"column":29}},"locations":[{"start":{"line":190,"column":24},"end":{"line":190,"column":29}}]},"26":{"type":"branch","line":191,"loc":{"start":{"line":191,"column":34},"end":{"line":191,"column":43}},"locations":[{"start":{"line":191,"column":34},"end":{"line":191,"column":43}}]},"27":{"type":"branch","line":191,"loc":{"start":{"line":191,"column":44},"end":{"line":191,"column":78}},"locations":[{"start":{"line":191,"column":44},"end":{"line":191,"column":78}}]},"28":{"type":"branch","line":198,"loc":{"start":{"line":198,"column":2},"end":{"line":219,"column":3}},"locations":[{"start":{"line":198,"column":2},"end":{"line":219,"column":3}}]},"29":{"type":"branch","line":205,"loc":{"start":{"line":205,"column":6},"end":{"line":205,"column":56}},"locations":[{"start":{"line":205,"column":6},"end":{"line":205,"column":56}}]},"30":{"type":"branch","line":206,"loc":{"start":{"line":206,"column":6},"end":{"line":206,"column":12}},"locations":[{"start":{"line":206,"column":6},"end":{"line":206,"column":12}}]},"31":{"type":"branch","line":217,"loc":{"start":{"line":217,"column":77},"end":{"line":217,"column":90}},"locations":[{"start":{"line":217,"column":77},"end":{"line":217,"column":90}}]},"32":{"type":"branch","line":217,"loc":{"start":{"line":217,"column":92},"end":{"line":217,"column":103}},"locations":[{"start":{"line":217,"column":92},"end":{"line":217,"column":103}}]},"33":{"type":"branch","line":221,"loc":{"start":{"line":221,"column":2},"end":{"line":227,"column":3}},"locations":[{"start":{"line":221,"column":2},"end":{"line":227,"column":3}}]},"34":{"type":"branch","line":223,"loc":{"start":{"line":223,"column":17},"end":{"line":225,"column":5}},"locations":[{"start":{"line":223,"column":17},"end":{"line":225,"column":5}}]},"35":{"type":"branch","line":229,"loc":{"start":{"line":229,"column":2},"end":{"line":237,"column":3}},"locations":[{"start":{"line":229,"column":2},"end":{"line":237,"column":3}}]},"36":{"type":"branch","line":231,"loc":{"start":{"line":231,"column":16},"end":{"line":231,"column":29}},"locations":[{"start":{"line":231,"column":16},"end":{"line":231,"column":29}}]},"37":{"type":"branch","line":232,"loc":{"start":{"line":232,"column":-1},"end":{"line":232,"column":27}},"locations":[{"start":{"line":232,"column":-1},"end":{"line":232,"column":27}}]},"38":{"type":"branch","line":232,"loc":{"start":{"line":232,"column":23},"end":{"line":232,"column":55}},"locations":[{"start":{"line":232,"column":23},"end":{"line":232,"column":55}}]},"39":{"type":"branch","line":232,"loc":{"start":{"line":232,"column":57},"end":{"line":235,"column":5}},"locations":[{"start":{"line":232,"column":57},"end":{"line":235,"column":5}}]},"40":{"type":"branch","line":236,"loc":{"start":{"line":236,"column":-1},"end":{"line":237,"column":3}},"locations":[{"start":{"line":236,"column":-1},"end":{"line":237,"column":3}}]},"41":{"type":"branch","line":239,"loc":{"start":{"line":239,"column":2},"end":{"line":241,"column":3}},"locations":[{"start":{"line":239,"column":2},"end":{"line":241,"column":3}}]},"42":{"type":"branch","line":245,"loc":{"start":{"line":245,"column":2},"end":{"line":248,"column":3}},"locations":[{"start":{"line":245,"column":2},"end":{"line":248,"column":3}}]},"43":{"type":"branch","line":250,"loc":{"start":{"line":250,"column":2},"end":{"line":253,"column":3}},"locations":[{"start":{"line":250,"column":2},"end":{"line":253,"column":3}}]},"44":{"type":"branch","line":255,"loc":{"start":{"line":255,"column":2},"end":{"line":257,"column":3}},"locations":[{"start":{"line":255,"column":2},"end":{"line":257,"column":3}}]},"45":{"type":"branch","line":261,"loc":{"start":{"line":261,"column":2},"end":{"line":278,"column":3}},"locations":[{"start":{"line":261,"column":2},"end":{"line":278,"column":3}}]},"46":{"type":"branch","line":264,"loc":{"start":{"line":264,"column":8},"end":{"line":265,"column":75}},"locations":[{"start":{"line":264,"column":8},"end":{"line":265,"column":75}}]},"47":{"type":"branch","line":267,"loc":{"start":{"line":267,"column":8},"end":{"line":267,"column":11}},"locations":[{"start":{"line":267,"column":8},"end":{"line":267,"column":11}}]},"48":{"type":"branch","line":286,"loc":{"start":{"line":286,"column":2},"end":{"line":302,"column":3}},"locations":[{"start":{"line":286,"column":2},"end":{"line":302,"column":3}}]},"49":{"type":"branch","line":287,"loc":{"start":{"line":287,"column":55},"end":{"line":294,"column":5}},"locations":[{"start":{"line":287,"column":55},"end":{"line":294,"column":5}}]},"50":{"type":"branch","line":294,"loc":{"start":{"line":294,"column":5},"end":{"line":301,"column":5}},"locations":[{"start":{"line":294,"column":5},"end":{"line":301,"column":5}}]},"51":{"type":"branch","line":294,"loc":{"start":{"line":294,"column":58},"end":{"line":301,"column":5}},"locations":[{"start":{"line":294,"column":58},"end":{"line":301,"column":5}}]},"52":{"type":"branch","line":306,"loc":{"start":{"line":306,"column":10},"end":{"line":316,"column":3}},"locations":[{"start":{"line":306,"column":10},"end":{"line":316,"column":3}}]},"53":{"type":"branch","line":309,"loc":{"start":{"line":309,"column":58},"end":{"line":309,"column":64}},"locations":[{"start":{"line":309,"column":58},"end":{"line":309,"column":64}}]},"54":{"type":"branch","line":312,"loc":{"start":{"line":312,"column":37},"end":{"line":312,"column":62}},"locations":[{"start":{"line":312,"column":37},"end":{"line":312,"column":62}}]},"55":{"type":"branch","line":318,"loc":{"start":{"line":318,"column":10},"end":{"line":322,"column":3}},"locations":[{"start":{"line":318,"column":10},"end":{"line":322,"column":3}}]},"56":{"type":"branch","line":319,"loc":{"start":{"line":319,"column":58},"end":{"line":319,"column":64}},"locations":[{"start":{"line":319,"column":58},"end":{"line":319,"column":64}}]},"57":{"type":"branch","line":324,"loc":{"start":{"line":324,"column":10},"end":{"line":334,"column":3}},"locations":[{"start":{"line":324,"column":10},"end":{"line":334,"column":3}}]},"58":{"type":"branch","line":330,"loc":{"start":{"line":330,"column":8},"end":{"line":330,"column":11}},"locations":[{"start":{"line":330,"column":8},"end":{"line":330,"column":11}}]}},"b":{"0":[22],"1":[14],"2":[1],"3":[13],"4":[1],"5":[0],"6":[0],"7":[0],"8":[12],"9":[1],"10":[0],"11":[11],"12":[1],"13":[0],"14":[10],"15":[1],"16":[9],"17":[0],"18":[9],"19":[1],"20":[1],"21":[0],"22":[8],"23":[1],"24":[7],"25":[0],"26":[0],"27":[7],"28":[7],"29":[2],"30":[5],"31":[2],"32":[5],"33":[2],"34":[1],"35":[6],"36":[2],"37":[4],"38":[3],"39":[1],"40":[3],"41":[1],"42":[3],"43":[1],"44":[2],"45":[2],"46":[1],"47":[1],"48":[3],"49":[1],"50":[2],"51":[1],"52":[12],"53":[11],"54":[60],"55":[7],"56":[0],"57":[4],"58":[0]},"fnMap":{"0":{"name":"FraudPreventionService","decl":{"start":{"line":54,"column":2},"end":{"line":57,"column":6}},"loc":{"start":{"line":54,"column":2},"end":{"line":57,"column":6}},"line":54},"1":{"name":"preTradeCheck","decl":{"start":{"line":65,"column":2},"end":{"line":194,"column":3}},"loc":{"start":{"line":65,"column":2},"end":{"line":194,"column":3}},"line":65},"2":{"name":"blockTrader","decl":{"start":{"line":198,"column":2},"end":{"line":219,"column":3}},"loc":{"start":{"line":198,"column":2},"end":{"line":219,"column":3}},"line":198},"3":{"name":"unblockTrader","decl":{"start":{"line":221,"column":2},"end":{"line":227,"column":3}},"loc":{"start":{"line":221,"column":2},"end":{"line":227,"column":3}},"line":221},"4":{"name":"isTraderBlocked","decl":{"start":{"line":229,"column":2},"end":{"line":237,"column":3}},"loc":{"start":{"line":229,"column":2},"end":{"line":237,"column":3}},"line":229},"5":{"name":"getBlockedTraders","decl":{"start":{"line":239,"column":2},"end":{"line":241,"column":3}},"loc":{"start":{"line":239,"column":2},"end":{"line":241,"column":3}},"line":239},"6":{"name":"addToWhitelist","decl":{"start":{"line":245,"column":2},"end":{"line":248,"column":3}},"loc":{"start":{"line":245,"column":2},"end":{"line":248,"column":3}},"line":245},"7":{"name":"removeFromWhitelist","decl":{"start":{"line":250,"column":2},"end":{"line":253,"column":3}},"loc":{"start":{"line":250,"column":2},"end":{"line":253,"column":3}},"line":250},"8":{"name":"getWhitelist","decl":{"start":{"line":255,"column":2},"end":{"line":257,"column":3}},"loc":{"start":{"line":255,"column":2},"end":{"line":257,"column":3}},"line":255},"9":{"name":"getPreventionStats","decl":{"start":{"line":261,"column":2},"end":{"line":278,"column":3}},"loc":{"start":{"line":261,"column":2},"end":{"line":278,"column":3}},"line":261},"10":{"name":"applyPreventionForCase","decl":{"start":{"line":286,"column":2},"end":{"line":302,"column":3}},"loc":{"start":{"line":286,"column":2},"end":{"line":302,"column":3}},"line":286},"11":{"name":"checkRateLimit","decl":{"start":{"line":306,"column":10},"end":{"line":316,"column":3}},"loc":{"start":{"line":306,"column":10},"end":{"line":316,"column":3}},"line":306},"12":{"name":"updateRateCount","decl":{"start":{"line":318,"column":10},"end":{"line":322,"column":3}},"loc":{"start":{"line":318,"column":10},"end":{"line":322,"column":3}},"line":318},"13":{"name":"recordPrevention","decl":{"start":{"line":324,"column":10},"end":{"line":334,"column":3}},"loc":{"start":{"line":324,"column":10},"end":{"line":334,"column":3}},"line":324}},"f":{"0":22,"1":14,"2":7,"3":2,"4":6,"5":1,"6":3,"7":1,"8":2,"9":2,"10":3,"11":12,"12":7,"13":4}} +,"/workspaces/CurrentDao-backend/src/fraud/reporting/suspicious-activity.service.ts": {"path":"/workspaces/CurrentDao-backend/src/fraud/reporting/suspicious-activity.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":63}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":40}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":12}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":39}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":32}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":36}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":28}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":23}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":20}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":28}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":30}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":33}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":26}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":16}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":1}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":13}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":40}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":71}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":14}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":38}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":70}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":6}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":78}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":66}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":69}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":97}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":28}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":19}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":30}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":31}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":37}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":35}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":47}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":41}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":43}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":41}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":57}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":61}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":27}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":8}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":53}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":31}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":28}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":8}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":6}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":45}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":57}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":72}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":13}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":53}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":47}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":7}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":20}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":68}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":6}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":15}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":32}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":68}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":62}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":24}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":7}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":32}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":39}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":3}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":78}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":56}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":76}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":11}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":16}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":15}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":13}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":16}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":14}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":17}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":17}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":25}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":17}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":64}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":50}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":47}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":41}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":47}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":41}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":55}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":31}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":75}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":71}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":12}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":35}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":31}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":18}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":80}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":31}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":59}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":13}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":12}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":21}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":11}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":12}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":43}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":6}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":3}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":36}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":66}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":63}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":56}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":74}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":67}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":55}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":15}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":35}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":38}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":47}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":28}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":34}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":61}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":66}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":35}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":63}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":66}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":8}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":51}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":54}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":38}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":55}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":70}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":63}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":3}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":44}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":25}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":21}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":13}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":15}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":30}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":71}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":26}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":35}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":31}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":18}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":7}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":78}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":3}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":78}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":39}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":11}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":17}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":16}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":20}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":21}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":20}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":27}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":39}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":38}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":48}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":9}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":38}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":52}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":9}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":38}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":58}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":9}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":38}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":52}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":9}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":7}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":73}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":22}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":25}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":79}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":12}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":29}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":80}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":25}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":20}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":77}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":12}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":20}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":51}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":55}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":69}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":75}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":5}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":30}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":45}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":41}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":6}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":30}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":33}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":34}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":21}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":79}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":14}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":37}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":12}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":12}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":17}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":16}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":20}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":21}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":20}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":20}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":56}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":18}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":22}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":76}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":6}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":3}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":78}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":77}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":38}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":40}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":78}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":60}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":14}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":41}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":34}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":37}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":8}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":7}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":41}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":40}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":5}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":20}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":71}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":6}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":3}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":0}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":33}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":35}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":49}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":44}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":20}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":76}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":6}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":3}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":78}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":63}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":12}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":94}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":53}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":72}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":57}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":81}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":52}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":76}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":6}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":3}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":73}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":23}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":34}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":81}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":30}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":82}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":32}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":70}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":14}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":70}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":5}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":3}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":34}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":19}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":25}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":15}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":52}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":56}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":38}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":59}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":38}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":55}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":38}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":72}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":52}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":37}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":36}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":3}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":20,"46":20,"47":20,"48":1,"49":1,"50":1,"51":1,"52":1,"53":7,"54":7,"55":7,"56":7,"57":7,"58":7,"59":7,"60":7,"61":7,"62":7,"63":7,"64":7,"65":7,"66":7,"67":7,"68":7,"69":7,"70":7,"71":7,"72":7,"73":7,"74":7,"75":7,"76":7,"77":7,"78":7,"79":7,"80":7,"81":7,"82":7,"83":7,"84":7,"85":7,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":1,"93":1,"94":1,"95":2,"96":2,"97":2,"98":2,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":3,"107":3,"108":3,"109":3,"110":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"119":3,"120":3,"121":3,"122":3,"123":3,"124":3,"125":3,"126":3,"127":3,"128":3,"129":0,"130":0,"131":3,"132":3,"133":3,"134":3,"135":3,"136":3,"137":3,"138":3,"139":3,"140":3,"141":3,"142":3,"143":3,"144":3,"145":3,"146":3,"147":3,"148":3,"149":3,"150":3,"151":3,"152":1,"153":1,"154":1,"155":2,"156":2,"157":1,"158":1,"159":1,"160":0,"161":0,"162":1,"163":1,"164":1,"165":3,"166":3,"167":3,"168":3,"169":3,"170":3,"171":3,"172":3,"173":3,"174":3,"175":3,"176":3,"177":3,"178":3,"179":3,"180":3,"181":2,"182":3,"183":2,"184":2,"185":3,"186":3,"187":3,"188":3,"189":3,"190":3,"191":3,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"223":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"238":2,"239":2,"240":2,"241":2,"242":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":101,"253":101,"254":101,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":0,"264":0,"265":0,"266":0,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"278":2,"279":2,"280":2,"281":2,"282":2,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":1,"308":1,"309":1,"310":1,"311":0,"312":0,"313":0,"314":0,"315":0,"316":1,"317":1,"318":1,"319":1,"320":7,"321":7,"322":7,"323":7,"324":7,"325":7,"326":7,"327":7,"328":7,"329":7,"330":1,"331":1,"332":7,"333":7,"334":1,"335":7,"336":6,"337":7,"338":0,"339":7,"340":0,"341":7,"342":7,"343":1,"344":1,"345":7,"346":7,"347":7,"348":7,"349":7,"350":7,"351":7,"352":7,"353":7,"354":7,"355":7,"356":7,"357":7,"358":7,"359":7,"360":7,"361":7,"362":7,"363":1},"branchMap":{"0":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":2},"end":{"line":48,"column":6}},"locations":[{"start":{"line":45,"column":2},"end":{"line":48,"column":6}}]},"1":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":2},"end":{"line":92,"column":3}},"locations":[{"start":{"line":53,"column":2},"end":{"line":92,"column":3}}]},"2":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":34},"end":{"line":64,"column":40}},"locations":[{"start":{"line":64,"column":34},"end":{"line":64,"column":40}}]},"3":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":36},"end":{"line":65,"column":42}},"locations":[{"start":{"line":65,"column":36},"end":{"line":65,"column":42}}]},"4":{"type":"branch","line":67,"loc":{"start":{"line":67,"column":50},"end":{"line":67,"column":56}},"locations":[{"start":{"line":67,"column":50},"end":{"line":67,"column":56}}]},"5":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":24},"end":{"line":72,"column":30}},"locations":[{"start":{"line":72,"column":24},"end":{"line":72,"column":30}}]},"6":{"type":"branch","line":83,"loc":{"start":{"line":83,"column":10},"end":{"line":83,"column":47}},"locations":[{"start":{"line":83,"column":10},"end":{"line":83,"column":47}}]},"7":{"type":"branch","line":84,"loc":{"start":{"line":84,"column":10},"end":{"line":84,"column":28}},"locations":[{"start":{"line":84,"column":10},"end":{"line":84,"column":28}}]},"8":{"type":"branch","line":95,"loc":{"start":{"line":95,"column":2},"end":{"line":101,"column":3}},"locations":[{"start":{"line":95,"column":2},"end":{"line":101,"column":3}}]},"9":{"type":"branch","line":99,"loc":{"start":{"line":99,"column":20},"end":{"line":101,"column":3}},"locations":[{"start":{"line":99,"column":20},"end":{"line":101,"column":3}}]},"10":{"type":"branch","line":106,"loc":{"start":{"line":106,"column":2},"end":{"line":152,"column":3}},"locations":[{"start":{"line":106,"column":2},"end":{"line":152,"column":3}}]},"11":{"type":"branch","line":122,"loc":{"start":{"line":122,"column":19},"end":{"line":122,"column":50}},"locations":[{"start":{"line":122,"column":19},"end":{"line":122,"column":50}}]},"12":{"type":"branch","line":123,"loc":{"start":{"line":123,"column":18},"end":{"line":123,"column":47}},"locations":[{"start":{"line":123,"column":18},"end":{"line":123,"column":47}}]},"13":{"type":"branch","line":124,"loc":{"start":{"line":124,"column":16},"end":{"line":124,"column":41}},"locations":[{"start":{"line":124,"column":16},"end":{"line":124,"column":41}}]},"14":{"type":"branch","line":125,"loc":{"start":{"line":125,"column":18},"end":{"line":125,"column":47}},"locations":[{"start":{"line":125,"column":18},"end":{"line":125,"column":47}}]},"15":{"type":"branch","line":127,"loc":{"start":{"line":127,"column":6},"end":{"line":127,"column":55}},"locations":[{"start":{"line":127,"column":6},"end":{"line":127,"column":55}}]},"16":{"type":"branch","line":129,"loc":{"start":{"line":129,"column":17},"end":{"line":129,"column":28}},"locations":[{"start":{"line":129,"column":17},"end":{"line":129,"column":28}}]},"17":{"type":"branch","line":129,"loc":{"start":{"line":129,"column":30},"end":{"line":131,"column":5}},"locations":[{"start":{"line":129,"column":30},"end":{"line":131,"column":5}}]},"18":{"type":"branch","line":142,"loc":{"start":{"line":142,"column":6},"end":{"line":142,"column":59}},"locations":[{"start":{"line":142,"column":6},"end":{"line":142,"column":59}}]},"19":{"type":"branch","line":143,"loc":{"start":{"line":143,"column":6},"end":{"line":143,"column":12}},"locations":[{"start":{"line":143,"column":6},"end":{"line":143,"column":12}}]},"20":{"type":"branch","line":142,"loc":{"start":{"line":142,"column":20},"end":{"line":142,"column":58}},"locations":[{"start":{"line":142,"column":20},"end":{"line":142,"column":58}}]},"21":{"type":"branch","line":155,"loc":{"start":{"line":155,"column":2},"end":{"line":157,"column":3}},"locations":[{"start":{"line":155,"column":2},"end":{"line":157,"column":3}}]},"22":{"type":"branch","line":165,"loc":{"start":{"line":165,"column":2},"end":{"line":192,"column":3}},"locations":[{"start":{"line":165,"column":2},"end":{"line":192,"column":3}}]},"23":{"type":"branch","line":174,"loc":{"start":{"line":174,"column":6},"end":{"line":174,"column":61}},"locations":[{"start":{"line":174,"column":6},"end":{"line":174,"column":61}}]},"24":{"type":"branch","line":175,"loc":{"start":{"line":175,"column":27},"end":{"line":175,"column":66}},"locations":[{"start":{"line":175,"column":27},"end":{"line":175,"column":66}}]},"25":{"type":"branch","line":177,"loc":{"start":{"line":177,"column":6},"end":{"line":177,"column":63}},"locations":[{"start":{"line":177,"column":6},"end":{"line":177,"column":63}}]},"26":{"type":"branch","line":178,"loc":{"start":{"line":178,"column":27},"end":{"line":178,"column":66}},"locations":[{"start":{"line":178,"column":27},"end":{"line":178,"column":66}}]},"27":{"type":"branch","line":181,"loc":{"start":{"line":181,"column":48},"end":{"line":182,"column":54}},"locations":[{"start":{"line":181,"column":48},"end":{"line":182,"column":54}}]},"28":{"type":"branch","line":183,"loc":{"start":{"line":183,"column":6},"end":{"line":185,"column":5}},"locations":[{"start":{"line":183,"column":6},"end":{"line":185,"column":5}}]},"29":{"type":"branch","line":195,"loc":{"start":{"line":195,"column":2},"end":{"line":208,"column":3}},"locations":[{"start":{"line":195,"column":2},"end":{"line":208,"column":3}}]},"30":{"type":"branch","line":212,"loc":{"start":{"line":212,"column":2},"end":{"line":283,"column":3}},"locations":[{"start":{"line":212,"column":2},"end":{"line":283,"column":3}}]},"31":{"type":"branch","line":239,"loc":{"start":{"line":239,"column":8},"end":{"line":239,"column":11}},"locations":[{"start":{"line":239,"column":8},"end":{"line":239,"column":11}}]},"32":{"type":"branch","line":242,"loc":{"start":{"line":242,"column":76},"end":{"line":242,"column":79}},"locations":[{"start":{"line":242,"column":76},"end":{"line":242,"column":79}}]},"33":{"type":"branch","line":247,"loc":{"start":{"line":247,"column":8},"end":{"line":247,"column":11}},"locations":[{"start":{"line":247,"column":8},"end":{"line":247,"column":11}}]},"34":{"type":"branch","line":252,"loc":{"start":{"line":252,"column":30},"end":{"line":255,"column":5}},"locations":[{"start":{"line":252,"column":30},"end":{"line":255,"column":5}}]},"35":{"type":"branch","line":253,"loc":{"start":{"line":253,"column":58},"end":{"line":253,"column":63}},"locations":[{"start":{"line":253,"column":58},"end":{"line":253,"column":63}}]},"36":{"type":"branch","line":254,"loc":{"start":{"line":254,"column":64},"end":{"line":254,"column":69}},"locations":[{"start":{"line":254,"column":64},"end":{"line":254,"column":69}}]},"37":{"type":"branch","line":263,"loc":{"start":{"line":263,"column":8},"end":{"line":267,"column":37}},"locations":[{"start":{"line":263,"column":8},"end":{"line":267,"column":37}}]},"38":{"type":"branch","line":238,"loc":{"start":{"line":238,"column":26},"end":{"line":238,"column":57}},"locations":[{"start":{"line":238,"column":26},"end":{"line":238,"column":57}}]},"39":{"type":"branch","line":259,"loc":{"start":{"line":259,"column":6},"end":{"line":259,"column":40}},"locations":[{"start":{"line":259,"column":6},"end":{"line":259,"column":40}}]},"40":{"type":"branch","line":259,"loc":{"start":{"line":259,"column":25},"end":{"line":259,"column":40}},"locations":[{"start":{"line":259,"column":25},"end":{"line":259,"column":40}}]},"41":{"type":"branch","line":320,"loc":{"start":{"line":320,"column":10},"end":{"line":330,"column":3}},"locations":[{"start":{"line":320,"column":10},"end":{"line":330,"column":3}}]},"42":{"type":"branch","line":326,"loc":{"start":{"line":326,"column":57},"end":{"line":326,"column":63}},"locations":[{"start":{"line":326,"column":57},"end":{"line":326,"column":63}}]},"43":{"type":"branch","line":327,"loc":{"start":{"line":327,"column":33},"end":{"line":327,"column":46}},"locations":[{"start":{"line":327,"column":33},"end":{"line":327,"column":46}}]},"44":{"type":"branch","line":328,"loc":{"start":{"line":328,"column":50},"end":{"line":328,"column":55}},"locations":[{"start":{"line":328,"column":50},"end":{"line":328,"column":55}}]},"45":{"type":"branch","line":332,"loc":{"start":{"line":332,"column":10},"end":{"line":343,"column":3}},"locations":[{"start":{"line":332,"column":10},"end":{"line":343,"column":3}}]},"46":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":6},"end":{"line":335,"column":81}},"locations":[{"start":{"line":334,"column":6},"end":{"line":335,"column":81}}]},"47":{"type":"branch","line":336,"loc":{"start":{"line":336,"column":6},"end":{"line":337,"column":82}},"locations":[{"start":{"line":336,"column":6},"end":{"line":337,"column":82}}]},"48":{"type":"branch","line":338,"loc":{"start":{"line":338,"column":6},"end":{"line":339,"column":70}},"locations":[{"start":{"line":338,"column":6},"end":{"line":339,"column":70}}]},"49":{"type":"branch","line":340,"loc":{"start":{"line":340,"column":6},"end":{"line":341,"column":70}},"locations":[{"start":{"line":340,"column":6},"end":{"line":341,"column":70}}]},"50":{"type":"branch","line":345,"loc":{"start":{"line":345,"column":10},"end":{"line":363,"column":3}},"locations":[{"start":{"line":345,"column":10},"end":{"line":363,"column":3}}]},"51":{"type":"branch","line":351,"loc":{"start":{"line":351,"column":29},"end":{"line":351,"column":55}},"locations":[{"start":{"line":351,"column":29},"end":{"line":351,"column":55}}]},"52":{"type":"branch","line":352,"loc":{"start":{"line":352,"column":6},"end":{"line":352,"column":38}},"locations":[{"start":{"line":352,"column":6},"end":{"line":352,"column":38}}]},"53":{"type":"branch","line":353,"loc":{"start":{"line":353,"column":30},"end":{"line":353,"column":58}},"locations":[{"start":{"line":353,"column":30},"end":{"line":353,"column":58}}]},"54":{"type":"branch","line":354,"loc":{"start":{"line":354,"column":6},"end":{"line":354,"column":38}},"locations":[{"start":{"line":354,"column":6},"end":{"line":354,"column":38}}]},"55":{"type":"branch","line":356,"loc":{"start":{"line":356,"column":6},"end":{"line":356,"column":38}},"locations":[{"start":{"line":356,"column":6},"end":{"line":356,"column":38}}]},"56":{"type":"branch","line":358,"loc":{"start":{"line":358,"column":49},"end":{"line":358,"column":72}},"locations":[{"start":{"line":358,"column":49},"end":{"line":358,"column":72}}]},"57":{"type":"branch","line":360,"loc":{"start":{"line":360,"column":6},"end":{"line":360,"column":37}},"locations":[{"start":{"line":360,"column":6},"end":{"line":360,"column":37}}]}},"b":{"0":[20],"1":[7],"2":[0],"3":[0],"4":[0],"5":[0],"6":[1],"7":[6],"8":[2],"9":[1],"10":[3],"11":[1],"12":[1],"13":[1],"14":[0],"15":[0],"16":[0],"17":[0],"18":[1],"19":[2],"20":[2],"21":[2],"22":[3],"23":[1],"24":[1],"25":[1],"26":[1],"27":[2],"28":[2],"29":[1],"30":[2],"31":[0],"32":[0],"33":[0],"34":[101],"35":[2],"36":[2],"37":[0],"38":[101],"39":[101],"40":[0],"41":[7],"42":[0],"43":[0],"44":[0],"45":[7],"46":[1],"47":[6],"48":[0],"49":[0],"50":[7],"51":[1],"52":[6],"53":[6],"54":[1],"55":[0],"56":[0],"57":[0]},"fnMap":{"0":{"name":"SuspiciousActivityService","decl":{"start":{"line":45,"column":2},"end":{"line":48,"column":6}},"loc":{"start":{"line":45,"column":2},"end":{"line":48,"column":6}},"line":45},"1":{"name":"generateSAR","decl":{"start":{"line":53,"column":2},"end":{"line":92,"column":3}},"loc":{"start":{"line":53,"column":2},"end":{"line":92,"column":3}},"line":53},"2":{"name":"generateSARById","decl":{"start":{"line":95,"column":2},"end":{"line":101,"column":3}},"loc":{"start":{"line":95,"column":2},"end":{"line":101,"column":3}},"line":95},"3":{"name":"queryCases","decl":{"start":{"line":106,"column":2},"end":{"line":152,"column":3}},"loc":{"start":{"line":106,"column":2},"end":{"line":152,"column":3}},"line":106},"4":{"name":"getCaseById","decl":{"start":{"line":155,"column":2},"end":{"line":157,"column":3}},"loc":{"start":{"line":155,"column":2},"end":{"line":157,"column":3}},"line":155},"5":{"name":"getCaseByCaseId","decl":{"start":{"line":160,"column":2},"end":{"line":162,"column":3}},"loc":{"start":{"line":160,"column":2},"end":{"line":162,"column":3}},"line":160},"6":{"name":"updateCase","decl":{"start":{"line":165,"column":2},"end":{"line":192,"column":3}},"loc":{"start":{"line":165,"column":2},"end":{"line":192,"column":3}},"line":165},"7":{"name":"getCasesByTrader","decl":{"start":{"line":195,"column":2},"end":{"line":208,"column":3}},"loc":{"start":{"line":195,"column":2},"end":{"line":208,"column":3}},"line":195},"8":{"name":"getMetrics","decl":{"start":{"line":212,"column":2},"end":{"line":283,"column":3}},"loc":{"start":{"line":212,"column":2},"end":{"line":283,"column":3}},"line":212},"9":{"name":"dailySarSweep","decl":{"start":{"line":289,"column":8},"end":{"line":307,"column":3}},"loc":{"start":{"line":289,"column":8},"end":{"line":307,"column":3}},"line":289},"10":{"name":"weeklyComplianceReport","decl":{"start":{"line":311,"column":8},"end":{"line":316,"column":3}},"loc":{"start":{"line":311,"column":8},"end":{"line":316,"column":3}},"line":311},"11":{"name":"buildSarSummary","decl":{"start":{"line":320,"column":10},"end":{"line":330,"column":3}},"loc":{"start":{"line":320,"column":10},"end":{"line":330,"column":3}},"line":320},"12":{"name":"determineReportingObligation","decl":{"start":{"line":332,"column":10},"end":{"line":343,"column":3}},"loc":{"start":{"line":332,"column":10},"end":{"line":343,"column":3}},"line":332},"13":{"name":"getApplicableRegulators","decl":{"start":{"line":345,"column":10},"end":{"line":363,"column":3}},"loc":{"start":{"line":345,"column":10},"end":{"line":363,"column":3}},"line":345}},"f":{"0":20,"1":7,"2":2,"3":3,"4":2,"5":0,"6":3,"7":1,"8":2,"9":0,"10":0,"11":7,"12":7,"13":7}} +,"/workspaces/CurrentDao-backend/src/gas/gas-estimator.service.ts": {"path":"/workspaces/CurrentDao-backend/src/gas/gas-estimator.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":25}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":26}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":19}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":72}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":75}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":8}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":47}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":34}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":65}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":14}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":62}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":52}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":57}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":6}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":70}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":69}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":30}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":76}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":35}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":38}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":65}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":31}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":31}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":47}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":61}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":41}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":35}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":11}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":54}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":42}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":44}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":56}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":56}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":25}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":82}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":57}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":10}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":7}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":5}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":19}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":29}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":41}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":15}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":53}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":6}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":52}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":12}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":31}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":22}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":16}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":17}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":35}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":27}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":29}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":6}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":5}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":65}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":63}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":5}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":21}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":29}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":39}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":33}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":76}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":46}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":31}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":52}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":45}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":44}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":48}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":50}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":58}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":27}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":23}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":8}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":20}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":48}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":51}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":42}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":29}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":27}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":61}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":12}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":28}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":76}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":34}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":73}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":12}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":62}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":32}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":75}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":65}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":49}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":68}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":10}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":12}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":14}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":24}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":23}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":29}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":34}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":27}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":18}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":16}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":6}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":3}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":5}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":62}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":66}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":45}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":163,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/gas/gas.module.ts": {"path":"/workspaces/CurrentDao-backend/src/gas/gas.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":43}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":79}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":62}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":72}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":75}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":90}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":9}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":62}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":24}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":25}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":4}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":50}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":2}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":24,"column":25}},"locations":[{"start":{"line":1,"column":0},"end":{"line":24,"column":25}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":24,"column":25}},"loc":{"start":{"line":1,"column":0},"end":{"line":24,"column":25}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/gas/algorithms/fee-prediction.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/gas/algorithms/fee-prediction.algorithm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":75}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":59}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":21}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":14}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":1}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":28}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":26}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":39}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":76}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":36}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":65}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":65}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":65}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":13}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":37}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":68}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":43}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":50}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":57}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":50}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":55}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":10}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":7}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":32}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":35}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":55}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":7}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":31}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":33}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":31}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":4}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":31}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":62}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":6}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":31}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":25}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":32}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":54}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":55}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":77}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":58}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":60}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":19}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":22}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":35}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":62}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":79}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":27}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":79}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":6}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":46}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":31}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":37}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":46}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":50}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":53}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":39}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":17}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":20}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":29}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":25}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":39}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":8}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":46}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":77}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":71}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":8}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":54}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":5}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":52}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":74}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":49}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":52}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":63}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":16}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":59}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":29}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":26}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":74}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":57}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":50}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":125,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":125,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":125,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":125,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/gas/batching/batching.service.ts": {"path":"/workspaces/CurrentDao-backend/src/gas/batching/batching.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":23}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":1}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":28}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":34}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":31}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":25}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":28}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":78}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":2}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":75}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":67}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":2}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":71}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":72}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":61}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":48}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":54}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":37}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":66}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":34}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":14}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":32}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":26}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":29}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":8}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":58}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":47}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":55}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":60}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":55}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":7}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":54}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":41}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":8}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":6}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":65}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":71}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":61}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":36}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":8}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":53}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":33}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":58}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":12}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":22}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":79}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":51}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":6}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":12}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":14}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":24}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":6}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":50}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":66}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":25}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":37}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":43}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":31}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":37}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":8}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":49}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":6}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":3}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":7,"31":7,"32":7,"33":7,"34":7,"35":7,"36":7,"37":7,"38":7,"39":7,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":6,"49":6,"50":6,"51":6,"52":7,"53":8,"54":12,"55":12,"56":8,"57":6,"58":6,"59":6,"60":6,"61":6,"62":6,"63":6,"64":12,"65":12,"66":6,"67":6,"68":6,"69":6,"70":6,"71":6,"72":6,"73":6,"74":6,"75":7,"76":7,"77":7,"78":7,"79":7,"80":7,"81":7,"82":7,"83":7,"84":7,"85":7,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":2,"93":2,"94":7,"95":7,"96":6,"97":6,"98":6,"99":6,"100":47,"101":47,"102":47,"103":47,"104":6,"105":6,"106":6,"107":6,"108":7},"branchMap":{"0":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":7},"end":{"line":109,"column":1}},"locations":[{"start":{"line":30,"column":7},"end":{"line":109,"column":1}}]},"1":{"type":"branch","line":36,"loc":{"start":{"line":36,"column":2},"end":{"line":90,"column":3}},"locations":[{"start":{"line":36,"column":2},"end":{"line":90,"column":3}}]},"2":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":33},"end":{"line":48,"column":5}},"locations":[{"start":{"line":40,"column":33},"end":{"line":48,"column":5}}]},"3":{"type":"branch","line":49,"loc":{"start":{"line":49,"column":-1},"end":{"line":53,"column":54}},"locations":[{"start":{"line":49,"column":-1},"end":{"line":53,"column":54}}]},"4":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":54},"end":{"line":57,"column":5}},"locations":[{"start":{"line":53,"column":54},"end":{"line":57,"column":5}}]},"5":{"type":"branch","line":54,"loc":{"start":{"line":54,"column":59},"end":{"line":56,"column":7}},"locations":[{"start":{"line":54,"column":59},"end":{"line":56,"column":7}}]},"6":{"type":"branch","line":58,"loc":{"start":{"line":58,"column":-1},"end":{"line":75,"column":58}},"locations":[{"start":{"line":58,"column":-1},"end":{"line":75,"column":58}}]},"7":{"type":"branch","line":76,"loc":{"start":{"line":76,"column":8},"end":{"line":76,"column":11}},"locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":11}}]},"8":{"type":"branch","line":60,"loc":{"start":{"line":60,"column":6},"end":{"line":60,"column":40}},"locations":[{"start":{"line":60,"column":6},"end":{"line":60,"column":40}}]},"9":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":48},"end":{"line":67,"column":5}},"locations":[{"start":{"line":64,"column":48},"end":{"line":67,"column":5}}]},"10":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":45},"end":{"line":65,"column":68}},"locations":[{"start":{"line":65,"column":45},"end":{"line":65,"column":68}}]},"11":{"type":"branch","line":92,"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}]},"12":{"type":"branch","line":96,"loc":{"start":{"line":96,"column":10},"end":{"line":108,"column":3}},"locations":[{"start":{"line":96,"column":10},"end":{"line":108,"column":3}}]},"13":{"type":"branch","line":100,"loc":{"start":{"line":100,"column":6},"end":{"line":105,"column":7}},"locations":[{"start":{"line":100,"column":6},"end":{"line":105,"column":7}}]},"14":{"type":"branch","line":102,"loc":{"start":{"line":102,"column":23},"end":{"line":102,"column":37}},"locations":[{"start":{"line":102,"column":23},"end":{"line":102,"column":37}}]}},"b":{"0":[7],"1":[7],"2":[1],"3":[6],"4":[8],"5":[12],"6":[6],"7":[0],"8":[47],"9":[12],"10":[47],"11":[2],"12":[6],"13":[47],"14":[8]},"fnMap":{"0":{"name":"BatchingService","decl":{"start":{"line":30,"column":7},"end":{"line":109,"column":1}},"loc":{"start":{"line":30,"column":7},"end":{"line":109,"column":1}},"line":30},"1":{"name":"planBatches","decl":{"start":{"line":36,"column":2},"end":{"line":90,"column":3}},"loc":{"start":{"line":36,"column":2},"end":{"line":90,"column":3}},"line":36},"2":{"name":"isBatchingWorthwhile","decl":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"line":92},"3":{"name":"groupByNetwork","decl":{"start":{"line":96,"column":10},"end":{"line":108,"column":3}},"loc":{"start":{"line":96,"column":10},"end":{"line":108,"column":3}},"line":96}},"f":{"0":7,"1":7,"2":2,"3":6}} +,"/workspaces/CurrentDao-backend/src/gas/dto/gas-estimate.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/gas/dto/gas-estimate.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":67}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":10}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":6}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":6}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":75}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":30}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":16}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":36}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":80}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":72}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":15}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":13}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":22}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":45}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":15}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":18}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":24}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":55}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":27}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":37}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":15}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":27}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":56}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":24}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":63}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":4}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":50}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":1}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":38}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":80}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":27}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":16}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":69}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":12}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":27}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":25}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":50}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":16}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":15}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":13}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":9}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":11}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":1}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":40}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":66}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":23}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":77}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":34}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":76}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":28}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":57}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":1}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":37}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":75}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":27}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":61}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":26}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":55}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":20}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":56}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":21}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":66}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":80}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":76}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":23}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":72}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":29}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":73}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":39}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":78}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":31}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":79}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":53}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":1}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":38}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":50}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":27}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":70}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":28}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":69}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":27}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":68}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":33}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":62}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":28}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":74}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":38}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":79}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":31}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":63}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":20}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":61}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":18}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":163,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/gas/entities/gas-usage.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/gas/entities/gas-usage.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":19}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":25}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":75}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":30}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":38}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":38}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":36}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":22}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":33}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":36}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":50}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":27}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":34}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":29}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":55}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":21}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":71}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":46}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":22}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":42}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":20}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":46}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":32}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":19}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":21}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":18}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":65,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":65,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":65,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":65,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/gas/optimizer/gas-optimizer.service.ts": {"path":"/workspaces/CurrentDao-backend/src/gas/optimizer/gas-optimizer.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":25}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":19}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":33}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":80}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":63}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":75}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":71}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":72}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":66}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":34}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":65}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":14}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":62}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":59}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":54}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":6}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":29}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":27}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":43}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":41}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":55}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":6}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":29}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":49}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":56}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":14}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":15}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":6}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":77}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":22}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":76}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":91}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":6}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":70}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":40}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":64}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":29}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":8}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":12}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":76}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":29}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":6}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":66}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":51}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":15}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":49}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":7}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":48}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":38}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":32}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":60}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":20}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":25}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":8}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":61}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":12}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":67}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":51}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":67}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":30}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":6}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":95,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":95,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":95,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":95,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/gateway/api-gateway.module.ts": {"path":"/workspaces/CurrentDao-backend/src/gateway/api-gateway.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":43}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":91}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":89}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":65}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":77}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":82}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":12}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":7}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":17}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":4}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":31}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":30}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":23}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":26}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":4}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":12}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":23}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":26}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":2}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":34,"column":32}},"locations":[{"start":{"line":1,"column":0},"end":{"line":34,"column":32}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":34,"column":32}},"loc":{"start":{"line":1,"column":0},"end":{"line":34,"column":32}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/gateway/auth/gateway-auth.service.ts": {"path":"/workspaces/CurrentDao-backend/src/gateway/auth/gateway-auth.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":33}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":64}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":5}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":39}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":51}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":85}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":5}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":58}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":60}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":82}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":17}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":70}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":5}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":81}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":5}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":50}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":57}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":42}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":64}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":2,"13":2,"14":2,"15":2,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":4,"23":4,"24":4,"25":4,"26":4,"27":1,"28":1,"29":1,"30":4},"branchMap":{"0":{"type":"branch","line":4,"loc":{"start":{"line":4,"column":7},"end":{"line":31,"column":1}},"locations":[{"start":{"line":4,"column":7},"end":{"line":31,"column":1}}]},"1":{"type":"branch","line":12,"loc":{"start":{"line":12,"column":2},"end":{"line":22,"column":3}},"locations":[{"start":{"line":12,"column":2},"end":{"line":22,"column":3}}]},"2":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":16},"end":{"line":22,"column":3}},"locations":[{"start":{"line":16,"column":16},"end":{"line":22,"column":3}}]},"3":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":2},"end":{"line":30,"column":3}},"locations":[{"start":{"line":27,"column":2},"end":{"line":30,"column":3}}]}},"b":{"0":[4],"1":[2],"2":[1],"3":[1]},"fnMap":{"0":{"name":"GatewayAuthService","decl":{"start":{"line":4,"column":7},"end":{"line":31,"column":1}},"loc":{"start":{"line":4,"column":7},"end":{"line":31,"column":1}},"line":4},"1":{"name":"validateRequest","decl":{"start":{"line":12,"column":2},"end":{"line":22,"column":3}},"loc":{"start":{"line":12,"column":2},"end":{"line":22,"column":3}},"line":12},"2":{"name":"generateApiKey","decl":{"start":{"line":27,"column":2},"end":{"line":30,"column":3}},"loc":{"start":{"line":27,"column":2},"end":{"line":30,"column":3}},"line":27}},"f":{"0":4,"1":2,"2":1}} +,"/workspaces/CurrentDao-backend/src/gateway/circuit-breaker/circuit-breaker.service.ts": {"path":"/workspaces/CurrentDao-backend/src/gateway/circuit-breaker/circuit-breaker.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":31}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":24}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":26}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":7}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":12}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":1}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":36}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":67}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":66}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":41}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":57}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":5}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":62}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":5}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":39}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":50}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":45}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":50}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":8}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":60}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":40}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":44}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":56}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":60}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":71}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":5}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":40}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":24}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":22}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":88}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":6}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":46}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":44}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":56}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":47}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":24}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":51}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":62}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":23}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":5}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":5,"15":5,"16":5,"17":5,"18":5,"19":5,"20":5,"21":5,"22":5,"23":5,"24":8,"25":2,"26":2,"27":2,"28":2,"29":8,"30":5,"31":5,"32":5,"33":5,"34":5,"35":1,"36":1,"37":1,"38":1,"39":5,"40":5,"41":5,"42":5,"43":5,"44":5,"45":11,"46":11,"47":11,"48":11,"49":11,"50":11,"51":2,"52":2,"53":2,"54":2,"55":2,"56":0,"57":0,"58":2,"59":2,"60":11,"61":5},"branchMap":{"0":{"type":"branch","line":7,"loc":{"start":{"line":7,"column":0},"end":{"line":11,"column":1}},"locations":[{"start":{"line":7,"column":0},"end":{"line":11,"column":1}}]},"1":{"type":"branch","line":14,"loc":{"start":{"line":14,"column":7},"end":{"line":62,"column":1}},"locations":[{"start":{"line":14,"column":7},"end":{"line":62,"column":1}}]},"2":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":2},"end":{"line":30,"column":3}},"locations":[{"start":{"line":24,"column":2},"end":{"line":30,"column":3}}]},"3":{"type":"branch","line":25,"loc":{"start":{"line":25,"column":49},"end":{"line":29,"column":5}},"locations":[{"start":{"line":25,"column":49},"end":{"line":29,"column":5}}]},"4":{"type":"branch","line":35,"loc":{"start":{"line":35,"column":2},"end":{"line":39,"column":3}},"locations":[{"start":{"line":35,"column":2},"end":{"line":39,"column":3}}]},"5":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":2},"end":{"line":61,"column":3}},"locations":[{"start":{"line":45,"column":2},"end":{"line":61,"column":3}}]},"6":{"type":"branch","line":51,"loc":{"start":{"line":51,"column":45},"end":{"line":60,"column":5}},"locations":[{"start":{"line":51,"column":45},"end":{"line":60,"column":5}}]}},"b":{"0":[1],"1":[5],"2":[8],"3":[2],"4":[1],"5":[11],"6":[2]},"fnMap":{"0":{"name":"CircuitBreakerService","decl":{"start":{"line":14,"column":7},"end":{"line":62,"column":1}},"loc":{"start":{"line":14,"column":7},"end":{"line":62,"column":1}},"line":14},"1":{"name":"checkCircuit","decl":{"start":{"line":24,"column":2},"end":{"line":30,"column":3}},"loc":{"start":{"line":24,"column":2},"end":{"line":30,"column":3}},"line":24},"2":{"name":"reportSuccess","decl":{"start":{"line":35,"column":2},"end":{"line":39,"column":3}},"loc":{"start":{"line":35,"column":2},"end":{"line":39,"column":3}},"line":35},"3":{"name":"reportFailure","decl":{"start":{"line":45,"column":2},"end":{"line":61,"column":3}},"loc":{"start":{"line":45,"column":2},"end":{"line":61,"column":3}},"line":45}},"f":{"0":5,"1":8,"2":1,"3":11}} +,"/workspaces/CurrentDao-backend/src/gateway/monitoring/gateway-monitor.service.ts": {"path":"/workspaces/CurrentDao-backend/src/gateway/monitoring/gateway-monitor.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":59}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":36}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":67}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":38}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":51}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":60}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":35}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":39}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":66}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":47}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":33}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":7}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":48}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":43}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":69}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":37}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":45}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":33}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":7}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":5}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":40}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":50}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":34}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":44}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":65}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":19}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":17}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":11}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":20}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":74}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":73}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":67}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":57}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":39}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":3,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3,"18":3,"19":3,"20":3,"21":3,"22":3,"23":3,"24":3,"25":3,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1},"branchMap":{"0":{"type":"branch","line":11,"loc":{"start":{"line":11,"column":2},"end":{"line":26,"column":3}},"locations":[{"start":{"line":11,"column":2},"end":{"line":26,"column":3}}]},"1":{"type":"branch","line":35,"loc":{"start":{"line":35,"column":2},"end":{"line":46,"column":3}},"locations":[{"start":{"line":35,"column":2},"end":{"line":46,"column":3}}]},"2":{"type":"branch","line":51,"loc":{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},"locations":[{"start":{"line":51,"column":2},"end":{"line":53,"column":3}}]}},"b":{"0":[3],"1":[1],"2":[1]},"fnMap":{"0":{"name":"GatewayMonitorService","decl":{"start":{"line":11,"column":2},"end":{"line":26,"column":3}},"loc":{"start":{"line":11,"column":2},"end":{"line":26,"column":3}},"line":11},"1":{"name":"logRequest","decl":{"start":{"line":35,"column":2},"end":{"line":46,"column":3}},"loc":{"start":{"line":35,"column":2},"end":{"line":46,"column":3}},"line":35},"2":{"name":"getMetrics","decl":{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},"loc":{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},"line":51}},"f":{"0":3,"1":1,"2":1}} +,"/workspaces/CurrentDao-backend/src/gateway/rate-limiting/advanced-rate-limiter.service.ts": {"path":"/workspaces/CurrentDao-backend/src/gateway/rate-limiting/advanced-rate-limiter.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":60}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":41}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":72}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":18}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":5}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":81}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":47}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":68}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":71}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":75}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":89}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":5}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":15}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":55}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":80}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":76}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":80}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":22}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":72}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":49}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":72}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":42}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":48}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":2,"19":2,"20":2,"21":2,"22":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"30":2,"31":2,"32":2,"33":2,"34":2,"35":2,"36":2,"37":1,"38":1,"39":1,"40":1,"41":1,"42":0,"43":0,"44":1},"branchMap":{"0":{"type":"branch","line":8,"loc":{"start":{"line":8,"column":2},"end":{"line":8,"column":18}},"locations":[{"start":{"line":8,"column":2},"end":{"line":8,"column":18}}]},"1":{"type":"branch","line":18,"loc":{"start":{"line":18,"column":2},"end":{"line":37,"column":3}},"locations":[{"start":{"line":18,"column":2},"end":{"line":37,"column":3}}]},"2":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":23},"end":{"line":24,"column":41}},"locations":[{"start":{"line":24,"column":23},"end":{"line":24,"column":41}}]},"3":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":42},"end":{"line":24,"column":54}},"locations":[{"start":{"line":24,"column":42},"end":{"line":24,"column":54}}]}},"b":{"0":[3],"1":[2],"2":[1],"3":[1]},"fnMap":{"0":{"name":"AdvancedRateLimiterService","decl":{"start":{"line":8,"column":2},"end":{"line":8,"column":18}},"loc":{"start":{"line":8,"column":2},"end":{"line":8,"column":18}},"line":8},"1":{"name":"checkRateLimit","decl":{"start":{"line":18,"column":2},"end":{"line":37,"column":3}},"loc":{"start":{"line":18,"column":2},"end":{"line":37,"column":3}},"line":18},"2":{"name":"getUsage","decl":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"line":42}},"f":{"0":3,"1":2,"2":0}} +,"/workspaces/CurrentDao-backend/src/gateway/transformation/request-transformer.service.ts": {"path":"/workspaces/CurrentDao-backend/src/gateway/transformation/request-transformer.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":40}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":71}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":5}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":76}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":47}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":62}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":35}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":5}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":50}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":70}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":36}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":54}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":5}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":5}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":77}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":48}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":62}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":35}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":51}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":71}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":37}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":55}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":55}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":48}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":14}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":42}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":24}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":56}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":54}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":14}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":27}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":32}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":46}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":8}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":5,"5":5,"6":5,"7":5,"8":5,"9":5,"10":5,"11":5,"12":5,"13":2,"14":2,"15":2,"16":2,"17":1,"18":2,"19":1,"20":2,"21":2,"22":5,"23":5,"24":5,"25":5,"26":5,"27":5,"28":5,"29":5,"30":2,"31":2,"32":2,"33":2,"34":1,"35":2,"36":1,"37":2,"38":2,"39":5,"40":5,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":5,"49":5,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":0,"59":0,"60":5},"branchMap":{"0":{"type":"branch","line":4,"loc":{"start":{"line":4,"column":7},"end":{"line":61,"column":1}},"locations":[{"start":{"line":4,"column":7},"end":{"line":61,"column":1}}]},"1":{"type":"branch","line":13,"loc":{"start":{"line":13,"column":2},"end":{"line":22,"column":3}},"locations":[{"start":{"line":13,"column":2},"end":{"line":22,"column":3}}]},"2":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":6},"end":{"line":18,"column":54}},"locations":[{"start":{"line":17,"column":6},"end":{"line":18,"column":54}}]},"3":{"type":"branch","line":19,"loc":{"start":{"line":19,"column":6},"end":{"line":20,"column":20}},"locations":[{"start":{"line":19,"column":6},"end":{"line":20,"column":20}}]},"4":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":2},"end":{"line":39,"column":3}},"locations":[{"start":{"line":30,"column":2},"end":{"line":39,"column":3}}]},"5":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":6},"end":{"line":35,"column":55}},"locations":[{"start":{"line":34,"column":6},"end":{"line":35,"column":55}}]},"6":{"type":"branch","line":36,"loc":{"start":{"line":36,"column":6},"end":{"line":37,"column":20}},"locations":[{"start":{"line":36,"column":6},"end":{"line":37,"column":20}}]},"7":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":10},"end":{"line":48,"column":3}},"locations":[{"start":{"line":41,"column":10},"end":{"line":48,"column":3}}]},"8":{"type":"branch","line":50,"loc":{"start":{"line":50,"column":10},"end":{"line":60,"column":3}},"locations":[{"start":{"line":50,"column":10},"end":{"line":60,"column":3}}]},"9":{"type":"branch","line":59,"loc":{"start":{"line":59,"column":-1},"end":{"line":60,"column":3}},"locations":[{"start":{"line":59,"column":-1},"end":{"line":60,"column":3}}]}},"b":{"0":[5],"1":[2],"2":[1],"3":[1],"4":[2],"5":[1],"6":[1],"7":[1],"8":[1],"9":[0]},"fnMap":{"0":{"name":"RequestTransformerService","decl":{"start":{"line":4,"column":7},"end":{"line":61,"column":1}},"loc":{"start":{"line":4,"column":7},"end":{"line":61,"column":1}},"line":4},"1":{"name":"transformRequest","decl":{"start":{"line":13,"column":2},"end":{"line":22,"column":3}},"loc":{"start":{"line":13,"column":2},"end":{"line":22,"column":3}},"line":13},"2":{"name":"transformResponse","decl":{"start":{"line":30,"column":2},"end":{"line":39,"column":3}},"loc":{"start":{"line":30,"column":2},"end":{"line":39,"column":3}},"line":30},"3":{"name":"energyRequestTransformation","decl":{"start":{"line":41,"column":10},"end":{"line":48,"column":3}},"loc":{"start":{"line":41,"column":10},"end":{"line":48,"column":3}},"line":41},"4":{"name":"energyResponseTransformation","decl":{"start":{"line":50,"column":10},"end":{"line":60,"column":3}},"loc":{"start":{"line":50,"column":10},"end":{"line":60,"column":3}},"line":50}},"f":{"0":5,"1":2,"2":2,"3":1,"4":1}} +,"/workspaces/CurrentDao-backend/src/location/location.module.ts": {"path":"/workspaces/CurrentDao-backend/src/location/location.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":53}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":54}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":55}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":9}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":60}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":29}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":2}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":30}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":12,"column":30}},"locations":[{"start":{"line":1,"column":0},"end":{"line":12,"column":30}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":12,"column":30}},"loc":{"start":{"line":1,"column":0},"end":{"line":12,"column":30}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/location/location.service.ts": {"path":"/workspaces/CurrentDao-backend/src/location/location.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":20}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":22}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":24}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":51}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":66}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":54}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":55}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":20}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":35}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":8}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":20}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":41}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":75}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":30}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":14}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":53}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":53}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":6}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":26}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":76}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":27}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":58}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":78}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":44}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":8}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":33}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":7}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":60}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":40}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":42}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":9}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":54}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":46}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":47}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":7}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":66}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":50}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":5}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":32}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":23}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":34}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":24}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":78}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":20}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":70}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":5}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":39}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":54}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":74}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":52}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":8}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":54}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":51}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":52}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":7}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":60}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":59}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":62}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":29}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":52}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":44}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":47}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":7}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":40}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":50}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":5}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":23}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":52}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":60}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":20}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":30}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":7}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":70}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":20}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":3}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":39}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":64}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":26}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":18}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":17}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":18}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":6}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":48}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":37}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":58}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":20}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":31}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":66}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":41}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":9}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":28}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":60}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":35}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":9}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":5}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":26}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":56}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":31}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":9}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":5}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":25}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":54}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":29}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":9}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":5}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":53}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":28}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":66}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":9}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":59}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":10}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":8}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":53}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":28}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":66}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":59}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":10}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":8}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":5}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":43}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":62}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":37}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":9}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":28}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":74}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":59}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":73}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":27}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":8}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":18}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":68}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":37}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":37}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":69}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":37}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":37}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":11}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":5}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":50}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":51}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":77}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":66}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":53}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":50}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":18}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":73}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":18}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":8}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":34}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":24}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":23}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":24}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":8}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":12}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":27}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":29}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":50}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":8}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":23}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":37}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":40}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":36}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":40}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":68}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":12}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":16}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":12}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":11}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":12}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":6}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":3}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":5}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":43}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":5}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":70}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":21}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":79}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":23}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":27}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":6}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":51}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":23}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":20}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":39}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":38}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":40}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":39}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":6}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":44}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":58}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":14}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":56}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":57}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":23}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":8}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":7}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":22}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":34}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":14}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":44}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":42}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":37}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":31}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":47}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":44}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":21}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":8}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":31}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":46}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":44}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":21}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":8}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":10}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":21}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":29}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":21}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":26}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":9}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":29}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":7}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":7}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":12}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":11}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":13}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":17}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":39}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":6}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":3}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":0}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":5}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":36}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":5}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":56}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":58}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":32}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":7}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":77}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":3}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":5}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":45}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":5}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":26}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":24}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":24}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":32}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":5}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":54}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":36}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":36}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":7}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":47}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":71}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":71}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":11}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":6}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":51}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":5}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":73}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":56}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":44}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":3}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":5}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":27}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":72}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":58}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":46}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":3}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":5}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":23}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":5}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":45}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":71}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":3}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":5}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":21}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":5}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":23}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":15}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":34}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":24}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":74}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":16}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":71}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":5}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":36}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":46}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":3}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":5}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":63}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":5}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":51}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":48}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":30}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":49}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":3}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":0}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":74}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":42}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":75}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":5}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":46}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":78}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":5}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":3}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":0}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":25}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":26}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":29}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":30}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":17}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":37}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":74}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":29}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":31}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":18}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":74}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":29}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":31}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":18}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":32}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":31}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":32}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":7}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":3}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":0}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":26}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":26}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":21}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":23}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":6}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":26}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":18}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":17}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":18}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":5}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":35}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":42}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":40}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":69}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":0}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":12}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":36}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":12}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":11}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":12}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":6}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":3}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":7,"23":7,"24":7,"25":7,"26":7,"27":1,"28":1,"29":1,"30":1,"31":1,"32":3,"33":3,"34":3,"35":3,"36":1,"37":1,"38":1,"39":1,"40":3,"41":1,"42":3,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":0,"50":0,"51":0,"52":0,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":1,"98":1,"99":1,"100":1,"101":1,"102":3,"103":3,"104":3,"105":3,"106":3,"107":3,"108":0,"109":0,"110":3,"111":3,"112":3,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":0,"130":0,"131":0,"132":0,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":0,"142":0,"143":0,"144":0,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":1,"161":1,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":1,"170":1,"171":0,"172":0,"173":0,"174":0,"175":1,"176":1,"177":1,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":0,"343":0,"344":0,"345":1,"346":1,"347":1,"348":1,"349":1,"350":0,"351":0,"352":1,"353":1,"354":1,"355":1,"356":1,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":1,"369":1,"370":1,"371":1,"372":1,"373":0,"374":0,"375":0,"376":0,"377":1,"378":1,"379":3,"380":1,"381":1,"382":3,"383":1,"384":1,"385":3,"386":1,"387":1,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":1,"409":1,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":1},"branchMap":{"0":{"type":"branch","line":22,"loc":{"start":{"line":22,"column":2},"end":{"line":27,"column":6}},"locations":[{"start":{"line":22,"column":2},"end":{"line":27,"column":6}}]},"1":{"type":"branch","line":32,"loc":{"start":{"line":32,"column":2},"end":{"line":58,"column":3}},"locations":[{"start":{"line":32,"column":2},"end":{"line":58,"column":3}}]},"2":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":-1},"end":{"line":41,"column":27}},"locations":[{"start":{"line":37,"column":-1},"end":{"line":41,"column":27}}]},"3":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":27},"end":{"line":42,"column":28}},"locations":[{"start":{"line":41,"column":27},"end":{"line":42,"column":28}}]},"4":{"type":"branch","line":43,"loc":{"start":{"line":43,"column":6},"end":{"line":58,"column":3}},"locations":[{"start":{"line":43,"column":6},"end":{"line":58,"column":3}}]},"5":{"type":"branch","line":49,"loc":{"start":{"line":49,"column":28},"end":{"line":53,"column":7}},"locations":[{"start":{"line":49,"column":28},"end":{"line":53,"column":7}}]},"6":{"type":"branch","line":102,"loc":{"start":{"line":102,"column":2},"end":{"line":113,"column":3}},"locations":[{"start":{"line":102,"column":2},"end":{"line":113,"column":3}}]},"7":{"type":"branch","line":108,"loc":{"start":{"line":108,"column":19},"end":{"line":110,"column":5}},"locations":[{"start":{"line":108,"column":19},"end":{"line":110,"column":5}}]},"8":{"type":"branch","line":118,"loc":{"start":{"line":118,"column":2},"end":{"line":235,"column":3}},"locations":[{"start":{"line":118,"column":2},"end":{"line":235,"column":3}}]},"9":{"type":"branch","line":129,"loc":{"start":{"line":129,"column":30},"end":{"line":133,"column":5}},"locations":[{"start":{"line":129,"column":30},"end":{"line":133,"column":5}}]},"10":{"type":"branch","line":141,"loc":{"start":{"line":141,"column":25},"end":{"line":145,"column":5}},"locations":[{"start":{"line":141,"column":25},"end":{"line":145,"column":5}}]},"11":{"type":"branch","line":153,"loc":{"start":{"line":153,"column":52},"end":{"line":160,"column":5}},"locations":[{"start":{"line":153,"column":52},"end":{"line":160,"column":5}}]},"12":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":52},"end":{"line":169,"column":5}},"locations":[{"start":{"line":162,"column":52},"end":{"line":169,"column":5}}]},"13":{"type":"branch","line":171,"loc":{"start":{"line":171,"column":42},"end":{"line":175,"column":5}},"locations":[{"start":{"line":171,"column":42},"end":{"line":175,"column":5}}]},"14":{"type":"branch","line":178,"loc":{"start":{"line":178,"column":26},"end":{"line":178,"column":49}},"locations":[{"start":{"line":178,"column":26},"end":{"line":178,"column":49}}]},"15":{"type":"branch","line":178,"loc":{"start":{"line":178,"column":49},"end":{"line":178,"column":71}},"locations":[{"start":{"line":178,"column":49},"end":{"line":178,"column":71}}]},"16":{"type":"branch","line":178,"loc":{"start":{"line":178,"column":73},"end":{"line":193,"column":5}},"locations":[{"start":{"line":178,"column":73},"end":{"line":193,"column":5}}]},"17":{"type":"branch","line":199,"loc":{"start":{"line":199,"column":51},"end":{"line":199,"column":74}},"locations":[{"start":{"line":199,"column":51},"end":{"line":199,"column":74}}]},"18":{"type":"branch","line":199,"loc":{"start":{"line":199,"column":76},"end":{"line":213,"column":5}},"locations":[{"start":{"line":199,"column":76},"end":{"line":213,"column":5}}]},"19":{"type":"branch","line":221,"loc":{"start":{"line":221,"column":31},"end":{"line":221,"column":36}},"locations":[{"start":{"line":221,"column":31},"end":{"line":221,"column":36}}]},"20":{"type":"branch","line":222,"loc":{"start":{"line":222,"column":33},"end":{"line":222,"column":39}},"locations":[{"start":{"line":222,"column":33},"end":{"line":222,"column":39}}]},"21":{"type":"branch","line":304,"loc":{"start":{"line":304,"column":2},"end":{"line":309,"column":3}},"locations":[{"start":{"line":304,"column":2},"end":{"line":309,"column":3}}]},"22":{"type":"branch","line":314,"loc":{"start":{"line":314,"column":2},"end":{"line":329,"column":3}},"locations":[{"start":{"line":314,"column":2},"end":{"line":329,"column":3}}]},"23":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":2},"end":{"line":337,"column":3}},"locations":[{"start":{"line":334,"column":2},"end":{"line":337,"column":3}}]},"24":{"type":"branch","line":379,"loc":{"start":{"line":379,"column":10},"end":{"line":386,"column":3}},"locations":[{"start":{"line":379,"column":10},"end":{"line":386,"column":3}}]},"25":{"type":"branch","line":380,"loc":{"start":{"line":380,"column":41},"end":{"line":382,"column":5}},"locations":[{"start":{"line":380,"column":41},"end":{"line":382,"column":5}}]},"26":{"type":"branch","line":383,"loc":{"start":{"line":383,"column":-1},"end":{"line":383,"column":43}},"locations":[{"start":{"line":383,"column":-1},"end":{"line":383,"column":43}}]},"27":{"type":"branch","line":383,"loc":{"start":{"line":383,"column":45},"end":{"line":385,"column":5}},"locations":[{"start":{"line":383,"column":45},"end":{"line":385,"column":5}}]}},"b":{"0":[7],"1":[3],"2":[1],"3":[1],"4":[1],"5":[0],"6":[3],"7":[0],"8":[1],"9":[0],"10":[0],"11":[0],"12":[0],"13":[0],"14":[0],"15":[0],"16":[0],"17":[0],"18":[0],"19":[0],"20":[0],"21":[1],"22":[1],"23":[1],"24":[3],"25":[1],"26":[2],"27":[1]},"fnMap":{"0":{"name":"LocationService","decl":{"start":{"line":22,"column":2},"end":{"line":27,"column":6}},"loc":{"start":{"line":22,"column":2},"end":{"line":27,"column":6}},"line":22},"1":{"name":"createLocation","decl":{"start":{"line":32,"column":2},"end":{"line":58,"column":3}},"loc":{"start":{"line":32,"column":2},"end":{"line":58,"column":3}},"line":32},"2":{"name":"updateLocation","decl":{"start":{"line":63,"column":2},"end":{"line":97,"column":3}},"loc":{"start":{"line":63,"column":2},"end":{"line":97,"column":3}},"line":63},"3":{"name":"getLocation","decl":{"start":{"line":102,"column":2},"end":{"line":113,"column":3}},"loc":{"start":{"line":102,"column":2},"end":{"line":113,"column":3}},"line":102},"4":{"name":"searchLocations","decl":{"start":{"line":118,"column":2},"end":{"line":235,"column":3}},"loc":{"start":{"line":118,"column":2},"end":{"line":235,"column":3}},"line":118},"5":{"name":"generateHeatmapData","decl":{"start":{"line":240,"column":2},"end":{"line":299,"column":3}},"loc":{"start":{"line":240,"column":2},"end":{"line":299,"column":3}},"line":240},"6":{"name":"findZoneForCoordinate","decl":{"start":{"line":304,"column":2},"end":{"line":309,"column":3}},"loc":{"start":{"line":304,"column":2},"end":{"line":309,"column":3}},"line":304},"7":{"name":"calculateDistance","decl":{"start":{"line":314,"column":2},"end":{"line":329,"column":3}},"loc":{"start":{"line":314,"column":2},"end":{"line":329,"column":3}},"line":314},"8":{"name":"getRegionalPriceMultiplier","decl":{"start":{"line":334,"column":2},"end":{"line":337,"column":3}},"loc":{"start":{"line":334,"column":2},"end":{"line":337,"column":3}},"line":334},"9":{"name":"createGridZone","decl":{"start":{"line":342,"column":2},"end":{"line":345,"column":3}},"loc":{"start":{"line":342,"column":2},"end":{"line":345,"column":3}},"line":342},"10":{"name":"getGridZones","decl":{"start":{"line":350,"column":2},"end":{"line":352,"column":3}},"loc":{"start":{"line":350,"column":2},"end":{"line":352,"column":3}},"line":350},"11":{"name":"updateGridZone","decl":{"start":{"line":357,"column":2},"end":{"line":368,"column":3}},"loc":{"start":{"line":357,"column":2},"end":{"line":368,"column":3}},"line":357},"12":{"name":"deleteLocation","decl":{"start":{"line":373,"column":2},"end":{"line":377,"column":3}},"loc":{"start":{"line":373,"column":2},"end":{"line":377,"column":3}},"line":373},"13":{"name":"validateCoordinates","decl":{"start":{"line":379,"column":10},"end":{"line":386,"column":3}},"loc":{"start":{"line":379,"column":10},"end":{"line":386,"column":3}},"line":379},"14":{"name":"sortByDistance","decl":{"start":{"line":388,"column":10},"end":{"line":408,"column":3}},"loc":{"start":{"line":388,"column":10},"end":{"line":408,"column":3}},"line":388},"15":{"name":"paginateResults","decl":{"start":{"line":410,"column":10},"end":{"line":431,"column":3}},"loc":{"start":{"line":410,"column":10},"end":{"line":431,"column":3}},"line":410}},"f":{"0":7,"1":3,"2":0,"3":3,"4":1,"5":0,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":3,"14":0,"15":0}} +,"/workspaces/CurrentDao-backend/src/location/algorithms/distance.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/location/algorithms/distance.algorithm.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":19}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":20}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":1}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":33}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":19}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":23}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":19}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":1}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":32}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":49}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":52}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":5}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":66}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":37}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":5}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":27}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":32}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":52}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":52}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":74}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":76}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":61}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":25}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":27}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":35}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":34}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":61}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":18}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":69}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":32}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":78}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":11}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":53}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":52}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":5}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":77}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":52}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":52}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":76}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":56}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":13}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":45}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":68}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":37}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":49}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":5}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":62}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":55}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":29}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":21}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":10}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":37}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":46}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":20}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":14}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":13}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":17}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":34}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":7}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":67}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":59}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":29}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":21}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":6}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":19}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":19}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":5}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":73}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":20}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":70}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":53}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":12}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":46}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":46}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":47}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":47}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":6}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":68}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":5}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":77}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":23}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":30}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":29}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":74}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":31}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":31}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":27}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":73}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":38}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":18}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":53}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":37}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":53}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":37}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":3}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":1,"110":1,"111":1,"112":1,"113":1,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":1,"133":1,"134":7,"135":7,"136":1,"137":1,"138":1,"139":1,"140":1},"branchMap":{"0":{"type":"branch","line":20,"loc":{"start":{"line":20,"column":9},"end":{"line":48,"column":3}},"locations":[{"start":{"line":20,"column":9},"end":{"line":48,"column":3}}]},"1":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":43},"end":{"line":40,"column":68}},"locations":[{"start":{"line":40,"column":43},"end":{"line":40,"column":68}}]},"2":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":9},"end":{"line":65,"column":3}},"locations":[{"start":{"line":53,"column":9},"end":{"line":65,"column":3}}]},"3":{"type":"branch","line":134,"loc":{"start":{"line":134,"column":17},"end":{"line":136,"column":3}},"locations":[{"start":{"line":134,"column":17},"end":{"line":136,"column":3}}]},"4":{"type":"branch","line":138,"loc":{"start":{"line":138,"column":17},"end":{"line":140,"column":3}},"locations":[{"start":{"line":138,"column":17},"end":{"line":140,"column":3}}]}},"b":{"0":[1],"1":[0],"2":[1],"3":[7],"4":[1]},"fnMap":{"0":{"name":"calculateDistance","decl":{"start":{"line":20,"column":9},"end":{"line":48,"column":3}},"loc":{"start":{"line":20,"column":9},"end":{"line":48,"column":3}},"line":20},"1":{"name":"calculateBearing","decl":{"start":{"line":53,"column":9},"end":{"line":65,"column":3}},"loc":{"start":{"line":53,"column":9},"end":{"line":65,"column":3}},"line":53},"2":{"name":"findPointsWithinRadius","decl":{"start":{"line":70,"column":9},"end":{"line":83,"column":3}},"loc":{"start":{"line":70,"column":9},"end":{"line":83,"column":3}},"line":70},"3":{"name":"getBoundingBox","decl":{"start":{"line":89,"column":9},"end":{"line":109,"column":3}},"loc":{"start":{"line":89,"column":9},"end":{"line":109,"column":3}},"line":89},"4":{"name":"isPointInPolygon","decl":{"start":{"line":114,"column":9},"end":{"line":132,"column":3}},"loc":{"start":{"line":114,"column":9},"end":{"line":132,"column":3}},"line":114},"5":{"name":"toRadians","decl":{"start":{"line":134,"column":17},"end":{"line":136,"column":3}},"loc":{"start":{"line":134,"column":17},"end":{"line":136,"column":3}},"line":134},"6":{"name":"toDegrees","decl":{"start":{"line":138,"column":17},"end":{"line":140,"column":3}},"loc":{"start":{"line":138,"column":17},"end":{"line":140,"column":3}},"line":138}},"f":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":7,"6":1}} +,"/workspaces/CurrentDao-backend/src/location/algorithms/zone-mapping.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/location/algorithms/zone-mapping.algorithm.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":70}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":56}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":36}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":24}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":25}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":29}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":1}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":35}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":5}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":46}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":5}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":31}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":28}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":24}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":42}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":44}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":31}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":35}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":49}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":54}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":25}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":14}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":7}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":61}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":56}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":59}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":17}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":35}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":7}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":12}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":22}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":39}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":44}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":76}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":6}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":5}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":59}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":28}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":26}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":21}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":45}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":35}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":56}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":59}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":17}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":13}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":17}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":33}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":37}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":7}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":42}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":61}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":52}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":45}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":61}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":66}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":57}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":70}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":75}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":41}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":68}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":74}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":49}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":5}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":61}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":5}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":52}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":52}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":45}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":61}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":67}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":57}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":68}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":54}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":59}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":7}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":5}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":21}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":56}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":36}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":28}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":14}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":52}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":45}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":61}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":48}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":19}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":30}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":8}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":57}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":68}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":49}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":54}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":73}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":9}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":7}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":3}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":5}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":40}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":77}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":19}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":19}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":72}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":41}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":30}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":30}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":5}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":12}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":35}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":36}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":6}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":3}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":63}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":49}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":5}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":68}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":17}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":72}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":41}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":36}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":44}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":44}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":5}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":30}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":3}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":53}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":5}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":77}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":41}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":58}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":39}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":45}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":66}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":59}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":21}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":22}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":13}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":17}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":63}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":27}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":70}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":57}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":40}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":9}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":7}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":25}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":3}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":5}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":68}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":5}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":38}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":20}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":20}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":14}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":61}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":53}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":56}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":56}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":57}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":16}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":11}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":15}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":0}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":65}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":43}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":3}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":1,"77":1,"78":1,"79":1,"80":1,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":1,"97":1,"98":1,"99":1,"100":1,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":1,"117":1,"118":1,"119":1,"120":1,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":1,"145":1,"146":1,"147":1,"148":1,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":1,"181":1,"182":1,"183":1,"184":1,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":1,"210":1,"211":1,"212":1,"213":1,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":1},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":9},"end":{"line":50,"column":3}},"locations":[{"start":{"line":15,"column":9},"end":{"line":50,"column":3}}]},"1":{"type":"branch","line":23,"loc":{"start":{"line":23,"column":34},"end":{"line":42,"column":5}},"locations":[{"start":{"line":23,"column":34},"end":{"line":42,"column":5}}]},"2":{"type":"branch","line":48,"loc":{"start":{"line":48,"column":62},"end":{"line":48,"column":75}},"locations":[{"start":{"line":48,"column":62},"end":{"line":48,"column":75}}]}},"b":{"0":[1],"1":[0],"2":[0]},"fnMap":{"0":{"name":"findZoneForCoordinate","decl":{"start":{"line":15,"column":9},"end":{"line":50,"column":3}},"loc":{"start":{"line":15,"column":9},"end":{"line":50,"column":3}},"line":15},"1":{"name":"findZonesWithinRadius","decl":{"start":{"line":55,"column":9},"end":{"line":76,"column":3}},"loc":{"start":{"line":55,"column":9},"end":{"line":76,"column":3}},"line":55},"2":{"name":"calculateZoneCentroid","decl":{"start":{"line":81,"column":9},"end":{"line":96,"column":3}},"loc":{"start":{"line":81,"column":9},"end":{"line":96,"column":3}},"line":81},"3":{"name":"calculateZoneArea","decl":{"start":{"line":101,"column":9},"end":{"line":116,"column":3}},"loc":{"start":{"line":101,"column":9},"end":{"line":116,"column":3}},"line":101},"4":{"name":"isCoordinateInZone","decl":{"start":{"line":121,"column":17},"end":{"line":144,"column":3}},"loc":{"start":{"line":121,"column":17},"end":{"line":144,"column":3}},"line":121},"5":{"name":"calculatePolygonCentroid","decl":{"start":{"line":149,"column":17},"end":{"line":163,"column":3}},"loc":{"start":{"line":149,"column":17},"end":{"line":163,"column":3}},"line":149},"6":{"name":"calculatePolygonArea","decl":{"start":{"line":169,"column":17},"end":{"line":180,"column":3}},"loc":{"start":{"line":169,"column":17},"end":{"line":180,"column":3}},"line":169},"7":{"name":"getAdjacentZones","decl":{"start":{"line":185,"column":9},"end":{"line":209,"column":3}},"loc":{"start":{"line":185,"column":9},"end":{"line":209,"column":3}},"line":185},"8":{"name":"doZonesShareBoundary","decl":{"start":{"line":214,"column":17},"end":{"line":230,"column":3}},"loc":{"start":{"line":214,"column":17},"end":{"line":230,"column":3}},"line":214}},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0}} +,"/workspaces/CurrentDao-backend/src/location/dto/location-search.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/location/dto/location-search.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":11}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":9}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":6}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":6}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":41}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":54}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":34}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":37}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":14}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":61}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":17}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":4}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":15}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":11}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":10}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":62}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":21}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":21}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":13}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":47}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":16}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":18}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":21}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":13}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":11}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":20}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":24}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":45}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":24}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":40}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":15}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":13}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":45}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":15}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":13}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":17}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":37}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":24}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":13}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":16}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":24}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":53}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":15}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":4}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":15}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":13}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":9}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":24}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":53}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":17}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":4}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":15}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":21}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":13}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":30}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":24}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":45}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":18}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":4}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":14}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":21}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":31}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":43}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":4}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":15}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":31}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":64}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":24}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":30}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":34}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":41}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":34}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":68}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":24}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":46}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":15}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":15}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":4}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":15}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":21}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":13}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":9}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":24}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":46}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":15}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":17}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":16}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":4}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":15}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":13}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":9}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":11}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":22}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":1}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":33}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":24}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":49}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":18}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":17}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":16}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":4}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":15}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":21}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":13}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":11}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":10}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":18}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":24}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":49}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":18}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":17}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":16}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":4}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":15}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":21}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":13}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":11}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":10}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":24}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":50}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":19}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":18}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":17}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":4}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":15}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":21}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":13}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":11}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":18}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":24}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":50}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":19}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":17}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":4}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":15}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":21}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":13}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":12}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":11}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":70}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":16}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":16}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":17}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":16}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":4}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":15}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":21}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":13}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":10}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":11}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":27}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":238,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":238,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":238,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":238,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/location/entities/grid-zone.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/location/entities/grid-zone.entity.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":20}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":33}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":39}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":15}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":37}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":47}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":4}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":68}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":30}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":68}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":36}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":54}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":54}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":21}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":43}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":20}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":28}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":43}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":25}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":21}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":18}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} +,"/workspaces/CurrentDao-backend/src/location/entities/location.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/location/entities/location.entity.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":20}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":33}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":33}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":55}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":55}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":15}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":26}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":26}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":25}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":21}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":68}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":34}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":28}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":20}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":43}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":32}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":18}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":18}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} +,"/workspaces/CurrentDao-backend/src/logging/logging.module.ts": {"path":"/workspaces/CurrentDao-backend/src/logging/logging.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":75}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":64}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":78}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":61}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":32}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":4}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":17}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":17}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":4}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":25}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":27}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":4}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":11}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":33}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":4}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":9}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":47}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":89}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":12}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":21}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":2}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":29}},"locations":[{"start":{"line":1,"column":0},"end":{"line":40,"column":29}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":40,"column":29}},"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":29}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/logging/logging.service.ts": {"path":"/workspaces/CurrentDao-backend/src/logging/logging.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":15}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":18}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":47}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":11}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":47}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":17}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":38}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":61}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":78}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":29}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":19}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":22}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":30}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":29}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":46}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":23}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":18}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":33}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":30}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":70}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":60}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":46}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":36}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":53}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":37}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":33}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":14}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":50}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":64}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":56}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":54}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":68}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":24}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":52}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":27}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":30}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":36}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":30}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":51}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":27}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":31}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":26}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":37}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":5}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":27}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":27}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":57}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":38}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":47}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":31}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":7}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":27}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":38}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":33}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":54}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":53}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":18}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":45}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":75}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":10}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":49}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":32}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":9}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":7}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":42}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":65}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":63}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":18}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":45}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":75}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":10}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":50}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":32}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":9}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":14}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":25}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":20}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":56}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":3}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":13}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":20}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":19}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":55}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":13}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":20}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":19}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":25}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":20}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":55}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":3}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":14}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":20}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":16}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":25}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":20}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":31}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":9}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":51}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":50}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":35}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":19}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":9}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":11}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":61}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":20}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":18}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":20}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":25}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":20}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":32}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":28}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":37}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":14}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":41}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":49}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":29}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":18}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":40}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":45}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":47}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":45}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":43}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":37}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":52}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":33}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":37}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":32}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":17}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":29}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":34}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":8}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":34}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":60}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":8}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":49}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":55}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":7}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":29}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":42}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":63}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":50}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":5}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":3}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":78}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":90}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":20}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":19}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":48}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":14}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":18}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":46}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":14}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":18}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":47}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":14}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":19}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":48}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":14}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":14}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":46}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":3}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":44}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":44}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":44}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":46}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":9}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":29}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":46}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":38}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":46}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":67}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":32}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":34}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":12}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":54}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":49}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":11}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":16}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":38}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":27}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":19}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":30}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":43}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":67}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":52}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":13}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":9}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":7}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":36}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":60}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":35}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":38}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":71}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":70}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":9}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":7}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":21}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":72}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":60}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":78}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":43}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":5}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":3}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":57}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":34}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":19}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":18}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":18}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":21}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":18}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":18}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":18}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":19}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":18}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":14}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":18}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":5}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":3}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":50}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":36}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":33}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":32}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":40}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":5}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":31}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":46}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":5}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":35}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":46}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":75}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":34}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":70}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":37}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":5}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":66}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":34}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":76}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":36}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":22}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":51}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":5}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":31}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":19}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":35}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":60}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":55}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":23}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":19}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":16}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":23}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":25}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":34}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":19}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":20}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":17}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":72}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":19}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":12}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":46}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":7}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":31}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":25}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":32}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":36}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":20}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":7}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":18}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":45}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":75}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":21}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":10}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":55}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":32}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":8}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":6}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":3}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":25}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":21}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":16}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":34}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":20}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":70}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":19}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":12}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":49}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":7}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":30}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":36}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":17}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":8}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":7}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":18}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":45}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":75}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":21}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":10}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":36}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":32}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":8}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":6}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":3}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":0}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":33}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":19}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":19}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":19}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":21}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":16}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":34}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":20}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":17}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":77}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":0}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":19}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":12}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":53}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":7}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":24}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":24}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":26}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":26}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":17}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":8}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":7}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":18}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":45}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":75}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":37}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":21}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":10}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":60}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":32}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":47}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":8}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":6}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":3}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":0}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":25}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":18}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":53}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":18}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":34}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":20}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":17}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":80}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":0}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":19}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":12}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":33}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":7}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":30}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":36}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":19}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":8}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":7}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":18}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":45}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":75}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":21}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":10}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":44}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":32}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":67}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":8}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":6}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":3}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":0}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":30}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":14}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":29}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":28}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":25}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":26}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":26}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":6}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":34}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":20}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":63}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":16}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":43}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":73}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":19}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":8}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":39}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":30}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":7}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":3}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":0}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":43}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":46}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":55}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":3}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":0}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":54}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":63}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":3}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":0}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":41}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":50}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":3}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":0}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":45}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":67}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":3}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":0}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":37}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":27}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":3}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":0}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":27}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":33}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":3}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":0}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":38}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":20}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":25}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":21}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":7}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":23}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":32}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":8}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":6}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":3}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":519,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":519,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":519,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":519,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/logging/alerts/log-alert.service.ts": {"path":"/workspaces/CurrentDao-backend/src/logging/alerts/log-alert.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":56}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":78}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":28}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":15}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":51}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":31}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":25}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":17}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":11}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":10}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":10}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":10}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":10}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":11}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":11}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":14}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":14}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":21}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":30}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":70}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":30}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":19}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":24}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":20}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":18}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":21}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":49}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":27}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":21}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":1}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":31}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":23}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":24}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":45}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":41}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":34}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":30}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":62}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":67}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":1}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":37}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":19}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":18}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":16}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":13}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":54}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":61}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":61}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":59}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":46}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":60}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":61}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":37}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":14}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":50}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":64}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":29}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":34}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":24}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":54}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":32}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":32}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":53}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":3}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":37}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":25}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":22}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":23}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":29}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":25}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":33}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":29}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":32}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":6}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":42}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":39}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":7}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":30}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":32}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":69}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":25}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":21}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":11}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":27}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":27}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":35}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":12}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":10}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":18}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":11}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":26}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":21}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":51}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":47}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":14}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":26}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":12}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":11}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":26}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":21}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":57}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":33}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":14}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":26}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":12}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":29}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":31}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":44}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":8}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":7}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":30}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":42}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":56}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":22}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":29}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":21}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":11}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":36}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":33}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":30}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":12}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":11}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":27}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":27}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":12}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":10}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":18}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":11}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":30}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":21}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":61}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":35}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":14}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":26}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":12}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":11}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":21}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":45}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":14}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":26}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":12}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":10}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":28}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":32}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":39}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":8}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":7}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":28}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":34}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":66}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":27}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":21}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":11}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":35}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":27}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":24}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":35}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":25}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":12}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":10}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":18}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":11}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":26}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":21}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":57}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":38}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":14}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":26}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":12}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":10}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":29}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":31}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":38}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":8}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":7}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":34}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":48}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":64}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":22}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":25}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":21}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":11}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":31}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":27}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":28}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":36}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":25}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":12}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":10}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":18}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":11}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":26}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":21}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":61}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":57}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":14}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":26}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":12}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":11}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":26}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":21}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":57}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":14}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":26}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":12}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":10}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":29}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":31}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":55}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":8}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":7}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":41}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":43}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":61}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":22}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":29}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":21}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":11}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":32}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":33}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":32}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":12}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":11}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":27}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":27}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":27}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":12}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":10}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":18}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":11}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":30}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":21}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":61}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":35}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":14}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":26}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":12}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":10}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":29}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":31}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":53}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":8}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":7}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":32}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":34}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":59}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":22}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":27}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":21}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":11}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":34}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":27}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":22}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":35}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":25}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":12}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":10}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":18}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":11}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":26}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":21}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":57}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":41}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":14}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":26}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":12}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":10}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":29}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":31}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":43}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":8}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":6}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":38}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":41}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":3}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":49}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":59}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":9}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":64}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":54}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":41}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":45}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":9}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":7}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":21}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":80}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":5}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":3}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":40}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":40}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":29}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":40}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":36}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":3}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":47}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":27}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":61}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":34}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":23}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":51}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":27}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":57}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":11}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":63}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":26}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":45}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":9}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":23}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":70}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":7}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":5}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":3}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":0}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":76}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":65}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":0}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":9}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":79}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":56}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":0}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":48}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":48}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":69}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":22}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":9}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":7}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":19}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":21}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":69}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":19}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":5}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":3}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":0}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":69}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":24}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":14}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":14}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":15}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":19}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":21}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":10}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":8}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":13}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":20}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":24}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":32}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":12}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":10}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":8}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":6}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":34}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":35}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":64}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":6}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":28}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":76}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":36}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":16}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":25}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":41}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":35}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":12}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":10}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":9}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":5}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":0}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":21}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":46}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":65}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":27}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":51}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":7}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":5}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":17}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":3}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":0}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":63}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":33}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":16}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":64}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":16}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":16}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":79}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":10}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":16}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":73}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":16}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":73}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":17}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":74}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":17}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":74}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":22}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":75}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":19}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":66}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":20}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":54}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":24}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":78}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":14}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":20}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":5}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":3}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":0}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":73}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":50}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":0}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":26}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":18}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":23}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":27}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":30}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":54}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":48}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":24}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":23}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":22}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":6}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":18}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":42}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":34}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":0}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":21}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":35}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":0}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":19}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":35}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":0}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":24}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":45}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":0}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":22}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":48}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":0}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":66}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":3}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":0}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":64}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":9}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":74}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":79}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":0}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":45}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":69}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":0}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":14}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":53}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":32}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":102}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":8}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":21}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":62}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":50}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":5}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":3}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":0}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":36}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":17}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":20}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":36}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":45}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":0}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":40}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":36}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":0}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":11}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":63}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":29}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":23}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":22}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":35}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":25}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":46}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":30}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":31}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":11}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":7}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":5}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":0}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":19}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":3}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":0}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":30}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":17}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":24}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":34}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":26}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":19}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":63}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":19}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":63}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":21}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":65}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":23}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":67}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":19}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":63}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":17}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":61}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":14}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":63}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":5}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":3}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":0}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":31}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":17}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":16}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":34}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":9}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":58}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":78}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":0}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":14}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":29}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":22}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":66}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":28}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":8}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":21}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":64}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":5}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":3}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":0}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":31}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":17}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":16}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":34}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":9}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":23}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":45}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":38}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":32}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":59}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":22}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":11}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":57}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":21}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":15}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":30}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":39}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":28}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":16}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":15}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":34}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":52}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":28}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":16}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":15}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":33}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":37}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":29}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":16}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":15}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":38}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":56}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":28}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":16}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":15}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":34}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":32}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":28}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":16}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":14}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":12}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":10}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":8}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":0}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":79}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":63}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":0}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":14}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":29}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":22}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":59}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":28}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":8}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":21}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":70}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":5}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":3}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":0}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":33}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":17}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":16}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":34}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":9}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":23}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":27}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":35}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":33}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":31}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":31}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":41}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":25}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":8}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":0}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":70}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":61}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":0}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":14}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":31}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":22}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":49}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":28}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":8}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":21}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":66}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":5}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":3}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":0}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":35}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":17}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":16}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":34}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":9}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":23}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":40}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":32}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":18}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":33}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":54}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":31}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":37}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":26}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":32}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":40}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":10}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":8}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":0}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":47}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":46}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":0}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":14}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":33}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":22}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":40}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":28}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":8}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":21}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":74}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":5}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":3}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":0}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":31}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":17}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":16}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":34}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":9}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":23}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":31}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":51}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":58}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":31}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":19}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":11}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":70}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":46}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":20}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":56}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":72}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":80}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":52}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":14}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":12}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":10}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":8}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":0}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":79}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":42}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":0}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":14}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":29}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":22}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":36}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":28}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":8}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":21}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":70}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":5}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":3}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":0}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":29}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":17}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":16}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":34}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":9}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":93}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":0}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":57}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":79}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":0}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":14}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":27}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":22}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":67}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":28}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":8}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":21}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":68}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":5}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":3}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":0}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":54}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":23}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":22}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":25}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":18}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":25}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":20}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":25}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":17}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":25}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":14}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":25}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":5}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":3}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":0}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":60}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":56}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":35}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":0}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":28}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":18}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":5}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":0}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":39}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":17}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":3}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":0}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":56}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":45}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":22}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":0}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":33}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":56}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":6}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":49}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":3}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":0}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":66}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":51}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":31}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":0}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":45}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":28}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":0}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":47}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":3}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":0}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":66}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":61}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":53}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":0}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":34}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":15}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":13}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":58}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":24}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":52}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":9}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":8}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":21}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":6}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":3}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":0}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":50}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":37}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":38}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":0}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":28}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":36}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":52}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":64}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":0}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":24}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":33}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":46}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":58}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":0}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":29}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":27}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":71}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":55}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":6}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":0}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":24}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":28}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":12}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":52}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":23}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":17}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":9}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":5}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":0}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":44}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":62}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":54}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":5}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":3}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":0}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":20}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":34}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":43}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":82}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":0}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":65}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":44}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":34}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":39}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":42}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":42}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":7}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":5}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":3}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":0}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":45}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":46}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":31}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":51}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":3}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":0}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":23}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":57}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":39}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":56}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":3}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":0}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":24}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":19}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":32}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":20}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":53}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":24}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":56}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":5}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":0}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":56}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":45}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":53}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":3}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":0}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":56}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":51}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":19}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":56}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":5}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":0}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":53}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":3}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":0}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":47}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":48}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":3}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":0}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":45}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":50}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":3}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":0}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":64}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":43}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":3}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":0}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":25}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":20}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":27}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":20}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":49}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":17}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":52}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":5}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":0}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":34}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":43}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":39}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":0}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":75}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":3}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":0}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":54}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":49}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":17}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":52}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":5}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":0}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":30}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":35}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":38}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":38}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":0}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":50}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":3}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":0}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":50}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":36}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":3}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":0}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":57}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":45}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":16}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":56}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":5}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":0}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":9}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":68}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":25}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":21}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":70}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":19}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":5}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":3}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":978,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":978,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":978,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":978,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/logging/elasticsearch/elasticsearch.module.ts": {"path":"/workspaces/CurrentDao-backend/src/logging/elasticsearch/elasticsearch.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":60}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":63}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":39}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":72}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":15}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":68}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":69}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":10}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":27}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":30}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":28}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":28}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":29}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":63}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":10}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":9}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":7}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":36}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":34}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":35}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":33,"column":35}},"locations":[{"start":{"line":1,"column":0},"end":{"line":33,"column":35}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":33,"column":35}},"loc":{"start":{"line":1,"column":0},"end":{"line":33,"column":35}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/logging/elasticsearch/elasticsearch.service.ts": {"path":"/workspaces/CurrentDao-backend/src/logging/elasticsearch/elasticsearch.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":48}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":17}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":46}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":22}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":23}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":25}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":25}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":19}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":18}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":33}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":24}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":23}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":18}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":16}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":61}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":1}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":40}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":42}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":39}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":59}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":24}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":30}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":18}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":5}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":1}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":31}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":21}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":20}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":37}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":17}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":13}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":59}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":66}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":34}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":51}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":34}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":42}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":53}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":30}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":11}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":80}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":13}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":80}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":17}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":73}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":34}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":42}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":24}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":25}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":26}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":12}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":27}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":75}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":8}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":7}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":24}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":9}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":62}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":50}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":39}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":46}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":35}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":72}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":77}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":18}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":3}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":54}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":52}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":9}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":68}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":27}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":9}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":52}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":29}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":52}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":23}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":34}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":36}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":45}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":61}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":55}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":25}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":27}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":44}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":35}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":42}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":50}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":20}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":18}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":16}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":14}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":27}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":47}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":44}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":24}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":34}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":27}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":27}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":35}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":58}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":22}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":18}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":26}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":31}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":54}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":27}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":30}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":38}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":40}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":22}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":20}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":18}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":50}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":49}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":48}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":52}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":49}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":48}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":48}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":49}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":48}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":45}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":45}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":45}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":47}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":42}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":41}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":24}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":31}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":52}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":54}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":51}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":20}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":18}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":14}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":22}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":37}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":14}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":12}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":26}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":24}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":21}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":11}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":79}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":7}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":21}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":66}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":18}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":3}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":50}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":48}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":9}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":58}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":27}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":9}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":20}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":45}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":29}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":19}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":21}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":20}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":26}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":29}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":37}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":35}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":38}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":20}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":50}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":18}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":16}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":21}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":30}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":26}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":49}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":54}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":18}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":16}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":21}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":31}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":26}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":48}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":18}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":23}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":31}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":16}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":14}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":12}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":11}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":73}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":7}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":21}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":62}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":18}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":5}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":3}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":53}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":9}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":88}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":31}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":25}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":15}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":22}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":43}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":10}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":9}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":21}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":60}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":18}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":5}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":3}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":0}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":58}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":9}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":53}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":9}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":18}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":102}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":12}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":10}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":9}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":22}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":43}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":10}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":9}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":56}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":0}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":28}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":47}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":50}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":32}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":38}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":36}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":14}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":68}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":7}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":21}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":67}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":5}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":3}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":71}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":9}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":64}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":49}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":39}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":22}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":9}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":21}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":56}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":18}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":3}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":0}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":66}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":24}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":14}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":15}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":19}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":21}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":10}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":8}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":36}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":34}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":70}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":6}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":18}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":28}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":34}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":22}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":35}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":62}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":30}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":10}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":9}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":5}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":19}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":28}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":36}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":43}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":9}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":5}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":26}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":35}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":36}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":57}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":9}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":5}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":0}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":25}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":34}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":36}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":55}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":9}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":5}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":24}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":57}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":32}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":35}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":61}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":7}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":33}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":59}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":7}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":36}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":43}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":9}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":5}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":0}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":18}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":58}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":36}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":42}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":9}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":5}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":39}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":8}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":43}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":42}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":7}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":38}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":5}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":0}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":17}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":3}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":0}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":79}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":9}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":23}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":53}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":16}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":15}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":26}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":20}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":29}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":23}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":14}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":12}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":28}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":20}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":36}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":23}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":14}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":12}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":25}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":29}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":34}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":40}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":41}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":14}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":12}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":23}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":22}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":24}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":25}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":43}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":18}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":24}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":32}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":18}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":16}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":14}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":12}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":30}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":18}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":37}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":14}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":12}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":23}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":20}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":34}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":23}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":14}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":12}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":26}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":20}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":35}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":23}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":22}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":42}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":16}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":21}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":36}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":24}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":43}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":20}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":18}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":16}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":14}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":12}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":10}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":8}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":0}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":49}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":39}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":22}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":9}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":46}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":21}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":65}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":18}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":5}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":3}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":0}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":71}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":54}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":0}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":54}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":79}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":53}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":35}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":6}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":58}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":32}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":6}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":0}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":57}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":53}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":73}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":0}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":70}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":77}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":29}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":30}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":8}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":0}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":64}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":25}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":24}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":58}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":32}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":9}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":6}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":0}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":12}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":28}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":33}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":37}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":31}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":28}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":45}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":28}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":34}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":6}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":3}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":67}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":46}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":29}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":41}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":46}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":7}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":5}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":18}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":3}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":0}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":75}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":46}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":29}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":41}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":56}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":7}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":5}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":18}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":3}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":0}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":52}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":9}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":54}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":39}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":23}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":9}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":0}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":44}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":32}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":56}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":40}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":59}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":29}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":10}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":21}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":62}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":18}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":5}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":3}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":0}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":42}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":9}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":48}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":21}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":63}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":18}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":5}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":3}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":0}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":55}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":9}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":40}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":25}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":9}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":65}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":21}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":70}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":18}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":5}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":3}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":0}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":57}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":9}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":44}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":25}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":28}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":9}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":67}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":21}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":72}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":18}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":5}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":3}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":0}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":56}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":9}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":41}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":25}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":9}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":21}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":71}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":18}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":5}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":3}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":0}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":35}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":46}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":9}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":56}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":39}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":25}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":9}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":0}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":30}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":21}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":75}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":18}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":5}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":3}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":0}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":48}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":9}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":56}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":39}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":27}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":9}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":0}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":30}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":21}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":77}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":18}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":5}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":3}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":0}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":24}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":39}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":9}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":51}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":69}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":21}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":54}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":19}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":5}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":3}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":646,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":646,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":646,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":646,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/logging/parsing/log-parser.service.ts": {"path":"/workspaces/CurrentDao-backend/src/logging/parsing/log-parser.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":23}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":11}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":48}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":50}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":18}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":24}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":24}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":24}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":17}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":25}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":24}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":24}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":25}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":32}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":27}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":30}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":32}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":29}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":33}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":24}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":34}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":66}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":60}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":1}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":31}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":62}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":53}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":21}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":31}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":20}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":43}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":31}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":102}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":79}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":104}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":11}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":85}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":110}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":76}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":173}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":10}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":83}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":142}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":15}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":128}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":117}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":16}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":125}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":133}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":79}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":76}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":30}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":38}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":56}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":76}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":33}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":41}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":45}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":52}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":31}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":38}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":63}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":14}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":29}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":68}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":7}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":24}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":45}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":73}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":35}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":78}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":29}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":69}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":48}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":54}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":57}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":16}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":24}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":36}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":45}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":10}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":14}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":27}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":64}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":48}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":54}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":57}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":16}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":24}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":36}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":45}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":10}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":7}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":21}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":42}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":52}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":55}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":60}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":14}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":23}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":29}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":43}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":8}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":5}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":3}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":29}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":19}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":18}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":37}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":9}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":42}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":43}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":62}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":40}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":44}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":21}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":70}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":20}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":72}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":26}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":27}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":26}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":27}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":8}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":34}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":29}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":67}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":69}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":67}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":61}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":67}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":75}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":77}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":71}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":7}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":27}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":67}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":67}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":53}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":59}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":71}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":69}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":75}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":32}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":54}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":38}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":52}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":47}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":74}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":48}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":43}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":58}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":58}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":62}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":7}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":33}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":80}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":71}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":69}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":63}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":7}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":0}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":21}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":70}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":25}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":21}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":18}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":3}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":34}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":19}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":18}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":37}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":22}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":54}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":64}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":66}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":60}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":60}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":56}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":66}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":6}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":47}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":42}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":18}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":65}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":7}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":5}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":16}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":3}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":25}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":24}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":28}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":19}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":18}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":21}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":39}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":50}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":20}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":49}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":55}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":57}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":24}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":25}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":24}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":25}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":6}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":26}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":19}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":34}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":53}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":54}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":54}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":40}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":43}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":14}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":24}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":33}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":62}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":60}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":62}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":37}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":14}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":25}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":33}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":53}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":54}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":62}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":53}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":52}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":49}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":14}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":22}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":33}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":53}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":54}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":14}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":0}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":22}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":33}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":62}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":14}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":20}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":33}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":54}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":50}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":47}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":65}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":14}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":25}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":49}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":53}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":54}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":14}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":21}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":35}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":26}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":19}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":30}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":27}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":73}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":20}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":52}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":26}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":69}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":27}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":59}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":26}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":40}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":48}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":6}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":25}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":57}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":5}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":23}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":77}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":22}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":51}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":5}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":30}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":60}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":0}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":17}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":3}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":65}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":18}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":26}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":40}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":19}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":20}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":14}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":18}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":21}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":20}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":14}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":18}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":20}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":14}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":19}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":20}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":14}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":14}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":20}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":5}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":32}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":41}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":18}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":5}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":36}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":52}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":18}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":5}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":40}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":39}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":18}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":5}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":0}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":34}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":60}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":18}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":5}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":38}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":57}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":18}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":5}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":0}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":32}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":3}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":58}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":36}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":0}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":33}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":34}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":40}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":5}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":33}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":46}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":5}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":0}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":37}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":40}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":68}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":72}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":73}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":68}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":74}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":60}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":5}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":0}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":35}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":48}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":62}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":40}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":66}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":37}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":72}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":67}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":31}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":73}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":34}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":68}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":37}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":64}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":34}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":0}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":35}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":37}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":38}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":5}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":41}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":33}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":5}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":0}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":41}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":24}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":51}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":5}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":47}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":40}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":5}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":0}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":60}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":3}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":0}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":56}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":30}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":0}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":56}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":34}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":5}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":0}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":36}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":77}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":71}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":61}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":73}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":0}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":16}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":3}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":0}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":55}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":30}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":0}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":30}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":51}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":55}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":57}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":63}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":57}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":61}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":63}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":0}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":16}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":3}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":0}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":78}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":12}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":28}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":20}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":22}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":55}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":57}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":24}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":35}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":25}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":34}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":6}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":3}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":0}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":46}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":9}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":22}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":18}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":13}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":19}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":5}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":3}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":0}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":69}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":67}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":26}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":80}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":0}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":49}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":76}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":3}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":0}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":23}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":23}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":22}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":18}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":29}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":38}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":0}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":35}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":63}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":27}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":5}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":0}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":19}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":3}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":0}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":39}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":38}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":3}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":0}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":24}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":41}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":46}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":42}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":52}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":50}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":41}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":3}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":0}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":57}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":34}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":3}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":0}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":43}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":31}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":3}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":0}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":36}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":38}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":3}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":580,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":580,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":580,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":580,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/logging/retention/retention-policy.service.ts": {"path":"/workspaces/CurrentDao-backend/src/logging/retention/retention-policy.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":56}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":78}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":34}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":15}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":18}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":26}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":26}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":28}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":36}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":37}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":16}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":64}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":14}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":44}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":40}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":28}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":28}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":19}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":35}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":24}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":27}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":43}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":43}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":26}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":34}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":28}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":28}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":30}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":37}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":22}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":1}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":13}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":61}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":68}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":59}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":45}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":50}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":64}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":37}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":24}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":61}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":40}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":39}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":40}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":60}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":45}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":28}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":7}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":40}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":37}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":28}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":30}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":27}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":21}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":11}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":27}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":27}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":27}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":30}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":12}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":10}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":8}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":7}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":37}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":41}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":27}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":28}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":29}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":31}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":26}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":8}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":7}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":34}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":38}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":29}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":43}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":25}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":27}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":8}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":7}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":40}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":37}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":27}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":28}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":30}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":26}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":8}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":6}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":3}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":56}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":48}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":11}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":49}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":23}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":26}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":61}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":16}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":7}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":3}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":71}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":9}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":25}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":17}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":19}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":18}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":24}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":27}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":60}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":55}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":55}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":18}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":48}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":14}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":51}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":24}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":47}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":52}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":16}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":14}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":19}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":76}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":24}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":46}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":16}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":21}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":101}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":14}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":12}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":10}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":8}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":69}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":28}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":33}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":9}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":78}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":59}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":14}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":8}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":5}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":3}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":29}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":23}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":37}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":33}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":43}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":30}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":27}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":27}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":24}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":28}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":17}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":6}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":9}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":27}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":63}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":20}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":58}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":7}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":48}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":69}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":36}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":13}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":69}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":37}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":68}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":62}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":25}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":29}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":65}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":9}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":7}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":57}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":22}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":62}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":15}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":8}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":20}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":21}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":57}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":40}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":24}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":57}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":8}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":20}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":5}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":29}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":22}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":28}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":69}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":33}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":29}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":25}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":9}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":42}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":62}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":35}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":30}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":52}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":59}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":22}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":22}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":12}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":63}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":9}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":7}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":54}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":57}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":20}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":31}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":32}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":32}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":33}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":30}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":42}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":50}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":69}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":14}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":55}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":47}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":46}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":9}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":7}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":14}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":44}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":37}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":8}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":21}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":71}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":18}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":5}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":3}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":31}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":34}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":45}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":9}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":35}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":18}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":67}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":16}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":18}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":19}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":19}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":73}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":14}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":12}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":16}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":18}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":76}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":16}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":18}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":76}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":16}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":22}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":57}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":16}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":26}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":19}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":71}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":12}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":16}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":7}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":42}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":72}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":59}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":50}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":32}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":54}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":65}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":51}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":68}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":55}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":40}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":7}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":0}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":38}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":21}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":24}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":58}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":14}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":8}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":18}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":5}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":3}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":30}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":22}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":15}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":35}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":80}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":23}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":22}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":20}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":7}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":46}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":3}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":0}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":80}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":32}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":90}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":41}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":57}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":13}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":44}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":38}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":8}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":7}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":0}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":33}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":47}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":3}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":0}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":34}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":22}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":15}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":20}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":37}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":68}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":23}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":26}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":7}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":3}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":73}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":9}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":80}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":23}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":23}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":9}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":0}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":55}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":21}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":79}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":16}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":5}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":3}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":64}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":9}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":54}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":20}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":24}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":27}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":11}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":41}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":21}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":77}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":48}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":5}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":3}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":0}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":65}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":9}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":54}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":20}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":30}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":27}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":11}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":0}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":76}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":29}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":0}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":78}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":21}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":75}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":15}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":5}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":3}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":0}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":63}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":9}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":66}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":25}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":9}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":0}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":65}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":21}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":70}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":18}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":5}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":3}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":0}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":65}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":9}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":70}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":25}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":28}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":9}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":0}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":67}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":21}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":72}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":18}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":5}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":3}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":0}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":51}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":59}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":59}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":0}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":19}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":16}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":28}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":16}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":21}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":16}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":28}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":16}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":35}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":15}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":14}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":37}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":5}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":3}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":0}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":27}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":23}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":38}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":9}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":54}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":20}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":28}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":29}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":11}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":0}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":33}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":52}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":21}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":31}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":10}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":7}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":0}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":18}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":21}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":79}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":18}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":5}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":3}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":0}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":42}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":23}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":19}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":22}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":43}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":0}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":12}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":23}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":46}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":60}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":62}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":62}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":66}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":6}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":3}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":0}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":52}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":43}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":0}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":33}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":41}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":42}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":3}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":0}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":63}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":43}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":0}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":55}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":71}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":19}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":30}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":7}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":5}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":0}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":20}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":3}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":0}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":49}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":9}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":72}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":0}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":29}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":29}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":56}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":56}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":0}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":27}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":27}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":34}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":35}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":0}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":36}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":42}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":66}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":0}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":54}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":65}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":65}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":31}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":40}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":50}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":0}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":42}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":74}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":37}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":33}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":41}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":9}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":37}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":33}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":41}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":9}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":7}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":0}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":31}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":38}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":40}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":41}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":41}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":41}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":34}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":34}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":53}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":53}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":8}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":21}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":69}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":5}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":3}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":0}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":58}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":52}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":48}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":50}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":50}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":21}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":3}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":0}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":61}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":69}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":57}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":51}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":3}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":0}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":51}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":47}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":3}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":0}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":38}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":27}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":38}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":53}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":30}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":30}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":23}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":3}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":0}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":56}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":9}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":62}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":0}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":51}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":58}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":0}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":61}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":77}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":77}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":0}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":74}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":80}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":50}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":45}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":8}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":0}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":43}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":98}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":72}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":0}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":14}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":43}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":43}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":43}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":40}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":45}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":13}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":50}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":10}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":32}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":8}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":21}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":70}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":18}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":5}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":3}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":0}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":56}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":9}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":45}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":38}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":55}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":0}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":74}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":55}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":63}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":41}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":9}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":0}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":37}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":43}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":7}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":0}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":49}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":44}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":44}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":56}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":57}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":11}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":8}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":0}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":43}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":64}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":0}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":40}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":0}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":24}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":64}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":37}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":21}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":66}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":41}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":5}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":3}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":0}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":33}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":34}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":43}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":60}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":0}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":9}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":60}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":0}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":38}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":13}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":55}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":25}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":28}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":73}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":18}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":12}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":9}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":7}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":0}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":37}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":42}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":0}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":63}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":21}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":69}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":5}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":3}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":0}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":23}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":58}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":33}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":3}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":0}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":66}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":9}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":72}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":27}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":9}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":0}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":77}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":21}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":24}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":58}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":14}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":8}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":18}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":5}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":3}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":0}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":77}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":48}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":0}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":21}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":65}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":27}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":12}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":60}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":38}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":68}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":29}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":7}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":5}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":0}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":19}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":3}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":775,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":775,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":775,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":775,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/matching.module.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/matching.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":53}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":48}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":85}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":89}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":89}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":53}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":73}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":9}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":61}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":20}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":4}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":66}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":2}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":24,"column":30}},"locations":[{"start":{"line":1,"column":0},"end":{"line":24,"column":30}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":24,"column":30}},"loc":{"start":{"line":1,"column":0},"end":{"line":24,"column":30}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/matching.service.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/matching.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":80}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":59}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":64}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":72}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":13}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":11}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":41}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":40}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":8}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":28}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":50}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":8}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":30}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":52}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":8}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":52}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":32}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":7}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":23}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":22}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":26}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":12}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":34}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":32}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":43}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":47}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":47}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":37}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":21}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":30}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":69}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":27}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":27}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":1}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":13}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":54}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":61}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":53}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":37}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":35}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":43}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":38}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":20}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":19}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":29}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":51}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":55}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":14}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":56}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":35}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":70}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":28}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":56}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":44}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":66}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":70}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":78}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":6}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":33}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":35}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":33}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":65}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":27}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":63}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":43}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":34}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":7}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":79}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":29}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":59}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":60}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":43}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":45}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":52}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":34}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":35}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":37}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":28}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":20}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":37}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":80}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":7}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":54}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":34}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":39}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":37}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":30}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":20}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":39}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":74}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":19}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":8}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":7}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":23}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":37}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":33}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":7}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":13}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":3}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":39}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":32}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":65}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":35}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":51}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":5}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":29}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":66}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":13}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":35}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":33}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":9}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":51}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":27}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":80}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":48}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":41}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":8}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":58}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":28}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":21}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":65}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":8}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":29}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":22}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":66}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":8}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":55}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":55}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":21}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":22}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":20}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":8}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":68}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":33}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":71}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":42}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":7}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":46}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":54}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":53}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":52}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":56}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":22}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":119}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":8}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":64}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":15}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":38}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":5}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":3}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":46}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":38}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":42}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":34}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":7}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":3}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":30}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":23}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":24}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":40}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":35}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":43}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":32}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":8}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":59}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":56}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":7}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":70}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":18}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":19}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":25}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":20}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":8}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":49}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":63}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":59}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":5}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":8}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":66}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":56}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":7}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":67}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":18}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":19}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":20}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":8}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":44}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":58}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":54}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":5}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":56}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":79}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":18}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":19}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":25}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":8}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":48}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":62}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":58}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":5}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":68}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":48}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":26}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":43}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":6}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":12}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":28}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":40}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":42}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":6}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":3}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":49}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":41}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":37}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":34}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":65}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":33}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":28}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":33}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":7}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":24}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":3}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":69}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":79}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":18}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":70}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":28}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":3}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":0}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":24}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":21}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":65}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":76}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":52}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":34}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":50}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":49}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":7}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":55}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":51}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":50}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":7}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":56}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":57}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":36}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":24}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":32}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":54}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":11}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":7}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":21}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":3}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":25}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":65}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":23}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":40}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":47}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":39}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":62}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":58}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":51}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":39}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":8}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":5}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":78}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":3}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":35}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":21}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":25}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":35}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":91}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":48}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":64}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":6}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":39}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":40}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":51}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":44}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":17}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":43}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":30}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":22}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":22}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":88}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":6}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":49}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":22}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":3}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":63}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":21}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":75}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":6}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":0}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":53}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":47}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":69}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":0}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":38}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":30}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":36}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":34}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":42}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":16}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":5}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":3}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":0}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":57}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":40}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":0}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":66}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":39}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":39}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":26}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":41}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":43}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":40}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":34}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":35}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":9}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":5}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":24}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":3}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":47}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":34}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":66}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":67}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":5}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":3}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":60}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":74}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":3}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":46}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":34}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":39}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":26}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":41}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":43}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":40}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":34}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":45}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":35}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":9}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":5}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":3}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":0}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":38}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":34}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":24}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":11}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":28}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":6}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":0}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":46}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":3}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":61}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":62}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":56}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":30}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":66}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":40}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":64}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":0}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":42}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":46}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":58}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":50}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":62}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":5}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":3}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":0}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":51}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":12}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":42}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":14}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":27}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":32}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":8}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":19}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":33}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":25}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":8}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":18}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":30}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":39}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":25}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":8}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":17}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":38}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":40}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":8}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":13}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":32}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":37}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":8}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":16}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":37}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":42}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":8}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":6}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":3}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":0}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":71}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":54}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":29}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":7}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":17}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":52}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":5}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":0}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":47}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":67}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":5}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":0}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":41}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":0}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":45}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":67}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":0}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":36}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":28}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":32}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":50}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":13}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":7}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":0}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":62}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":0}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":39}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":29}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":26}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":7}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":0}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":22}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":3}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":0}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":20}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":20}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":19}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":20}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":21}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":54}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":29}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":7}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":17}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":52}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":5}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":0}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":40}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":0}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":45}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":67}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":0}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":36}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":28}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":31}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":59}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":13}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":7}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":0}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":62}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":0}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":38}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":29}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":25}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":13}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":7}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":0}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":64}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":65}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":0}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":22}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":3}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":0}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":48}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":31}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":3}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":0}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":62}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":38}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":69}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":35}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":7}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":3}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":0}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":46}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":38}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":45}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":34}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":7}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":3}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":0}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":36}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":33}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":60}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":14}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":40}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":36}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":8}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":7}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":0}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":36}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":43}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":45}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":0}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":49}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":71}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":0}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":40}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":32}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":34}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":49}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":11}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":0}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":47}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":68}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":69}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":0}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":41}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":28}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":32}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":11}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":7}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":0}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":77}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":5}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":3}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":0}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":61}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":47}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":3}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":0}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":79}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":55}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":42}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":7}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":0}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":42}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":0}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":72}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":74}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":0}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":76}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":53}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":16}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":17}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":26}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":6}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":0}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":66}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":31}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":69}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":40}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":5}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":0}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":51}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":3}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":654,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":654,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":654,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":654,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/algorithms/geographic-matching.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/algorithms/geographic-matching.algorithm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":67}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":73}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":74}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":25}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":41}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":40}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":36}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":4}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":17}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":27}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":32}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":19}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":13}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":42}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":73}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":24}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":40}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":37}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":110}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":6}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":59}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":16}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":18}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":6}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":60}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":17}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":51}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":25}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":18}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":6}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":32}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":40}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":37}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":53}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":16}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":14}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":20}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":8}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":46}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":60}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":50}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":20}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":125}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":14}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":30}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":6}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":34}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":20}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":40}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":14}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":47}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":37}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":40}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":64}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":71}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":77}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":23}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":9}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":7}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":63}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":71}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":75}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":23}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":7}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":7}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":35}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":23}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":24}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":40}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":52}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":67}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":45}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":48}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":36}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":71}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":80}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":62}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":29}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":43}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":46}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":8}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":3}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":27}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":23}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":23}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":14}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":41}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":40}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":71}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":46}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":29}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":23}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":8}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":37}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":7}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":20}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":24}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":69}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":71}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":46}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":50}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":8}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":6}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":48}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":50}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":8}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":6}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":55}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":12}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":77}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":13}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":58}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":13}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":23}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":6}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":3}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":66}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":33}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":40}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":38}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":38}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":43}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":5}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":0}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":78}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":79}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":12}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":47}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":48}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":6}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":3}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":33}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":20}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":26}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":13}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":24}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":33}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":36}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":70}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":52}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":23}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":3}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":29}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":31}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":26}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":40}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":53}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":77}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":79}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":32}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":40}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":43}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":39}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":50}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":57}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":17}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":19}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":21}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":20}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":8}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":26}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":49}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":19}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":24}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":18}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":22}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":10}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":28}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":38}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":43}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":24}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":110}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":10}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":14}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":41}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":7}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":5}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":39}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":34}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":20}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":24}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":30}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":26}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":40}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":19}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":39}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":23}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":41}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":51}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":60}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":17}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":18}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":20}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":8}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":50}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":17}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":18}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":20}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":8}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":56}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":17}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":18}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":20}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":8}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":66}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":24}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":19}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":14}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":8}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":10}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":36}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":64}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":9}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":34}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":30}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":7}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":21}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":3}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":0}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":35}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":20}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":21}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":40}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":13}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":62}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":44}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":24}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":25}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":6}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":67}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":56}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":68}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":70}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":35}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":19}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":5}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":30}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":3}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":0}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":30}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":20}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":21}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":40}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":13}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":41}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":43}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":39}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":49}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":62}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":56}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":3}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":33}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":20}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":21}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":40}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":13}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":47}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":49}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":56}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":53}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":5}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":48}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":3}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":43}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":28}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":23}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":26}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":26}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":13}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":31}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":26}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":29}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":0}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":68}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":26}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":43}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":47}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":16}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":37}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":42}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":16}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":37}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":45}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":16}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":7}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":5}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":72}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":0}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":12}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":43}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":34}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":41}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":17}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":6}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":3}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":0}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":28}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":20}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":21}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":40}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":14}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":41}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":43}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":43}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":0}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":78}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":19}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":78}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":19}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":49}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":62}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":0}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":40}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":3}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":0}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":32}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":20}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":21}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":31}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":40}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":12}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":76}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":64}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":44}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":24}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":25}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":6}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":0}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":30}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":37}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":39}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":44}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":38}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":56}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":15}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":16}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":18}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":6}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":39}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":16}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":79}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":29}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":41}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":45}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":15}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":30}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":22}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":30}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":36}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":66}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":28}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":19}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":9}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":32}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":34}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":101}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":10}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":8}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":6}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":60}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":0}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":17}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":3}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":0}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":28}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":29}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":29}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":13}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":41}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":42}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":41}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":42}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":0}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":19}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":49}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":49}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":13}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":47}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":40}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":42}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":28}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":27}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":61}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":17}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":3}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":0}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":66}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":48}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":50}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":0}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":21}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":3}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":0}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":62}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":21}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":19}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":22}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":29}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":32}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":28}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":7}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":6}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":22}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":0}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":34}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":60}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":25}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":5}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":0}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":31}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":3}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":0}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":62}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":20}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":27}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":30}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":26}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":6}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":38}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":26}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":0}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":37}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":44}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":5}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":0}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":38}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":45}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":29}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":67}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":7}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":5}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":0}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":44}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":0}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":12}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":24}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":12}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":39}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":20}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":6}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":3}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":556,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":556,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":556,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":556,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/algorithms/partial-fulfillment.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/algorithms/partial-fulfillment.algorithm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":67}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":73}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":74}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":73}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":43}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":19}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":35}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":20}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":29}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":30}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":30}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":22}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":5}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":35}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":34}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":15}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":55}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":18}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":33}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":20}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":21}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":18}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":26}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":5}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":13}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":42}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":73}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":23}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":26}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":40}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":40}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":33}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":20}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":119}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":57}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":16}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":17}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":12}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":6}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":57}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":6}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":78}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":75}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":14}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":6}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":71}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":50}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":20}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":155}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":6}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":12}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":14}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":31}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":21}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":21}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":39}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":6}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":33}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":23}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":24}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":26}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":40}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":24}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":40}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":39}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":46}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":19}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":8}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":33}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":5}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":41}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":46}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":18}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":14}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":20}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":17}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":8}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":33}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":17}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":3}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":17}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":31}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":26}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":40}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":34}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":29}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":68}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":74}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":6}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":53}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":45}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":26}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":35}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":61}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":67}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":53}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":16}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":18}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":16}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":22}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":10}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":9}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":41}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":66}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":12}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":21}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":6}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":58}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":12}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":21}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":26}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":18}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":6}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":58}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":43}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":8}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":6}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":70}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":63}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":12}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":24}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":12}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":26}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":31}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":29}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":24}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":17}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":6}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":3}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":44}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":17}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":19}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":40}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":14}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":57}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":49}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":5}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":66}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":73}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":75}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":19}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":5}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":0}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":63}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":19}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":5}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":77}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":33}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":74}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":46}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":3}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":43}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":17}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":19}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":26}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":40}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":13}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":54}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":12}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":14}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":18}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":6}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":77}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":74}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":76}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":29}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":26}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":33}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":32}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":68}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":26}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":37}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":45}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":16}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":37}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":42}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":16}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":43}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":48}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":7}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":5}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":23}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":74}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":12}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":39}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":34}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":44}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":47}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":17}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":6}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":3}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":33}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":17}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":19}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":40}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":13}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":46}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":50}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":73}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":65}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":28}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":3}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":30}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":17}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":19}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":40}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":13}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":40}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":44}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":31}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":46}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":56}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":64}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":58}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":12}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":46}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":56}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":64}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":58}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":74}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":46}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":50}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":60}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":58}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":50}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":3}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":75}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":69}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":73}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":55}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":3}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":39}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":17}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":26}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":40}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":38}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":53}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":42}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":67}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":35}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":22}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":5}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":57}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":47}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":8}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":6}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":0}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":57}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":24}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":19}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":35}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":17}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":26}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":46}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":40}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":12}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":23}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":20}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":42}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":22}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":78}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":19}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":75}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":14}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":18}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":5}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":3}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":32}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":17}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":26}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":40}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":12}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":38}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":43}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":43}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":40}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":74}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":28}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":19}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":32}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":9}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":41}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":5}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":27}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":3}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":0}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":29}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":17}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":26}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":40}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":12}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":38}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":43}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":0}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":43}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":40}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":0}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":54}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":74}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":30}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":30}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":21}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":34}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":11}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":0}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":43}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":7}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":5}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":0}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":27}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":3}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":0}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":35}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":29}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":40}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":24}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":16}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":14}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":17}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":28}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":74}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":7}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":51}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":3}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":0}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":34}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":29}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":40}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":14}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":32}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":43}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":31}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":51}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":0}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":45}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":65}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":0}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":46}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":21}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":20}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":35}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":22}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":10}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":28}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":0}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":39}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":51}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":7}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":5}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":0}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":19}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":3}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":0}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":29}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":17}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":19}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":46}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":40}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":12}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":44}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":41}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":0}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":30}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":74}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":75}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":47}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":38}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":42}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":39}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":76}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":66}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":22}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":39}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":32}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":36}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":66}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":19}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":9}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":32}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":42}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":100}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":10}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":8}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":6}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":60}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":0}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":17}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":3}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":43}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":29}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":21}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":12}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":20}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":29}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":30}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":30}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":22}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":6}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":28}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":0}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":31}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":42}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":18}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":48}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":47}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":8}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":0}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":52}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":52}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":10}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":8}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":0}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":31}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":30}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":46}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":26}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":67}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":55}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":9}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":5}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":0}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":38}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":3}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":70}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":16}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":46}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":35}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":3}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":0}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":28}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":17}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":19}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":40}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":14}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":40}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":44}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":0}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":31}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":50}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":12}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":50}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":5}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":0}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":8}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":36}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":47}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":5}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":19}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":8}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":36}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":47}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":5}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":19}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":0}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":64}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":62}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":0}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":40}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":3}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":0}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":63}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":30}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":29}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":30}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":6}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":69}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":78}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":62}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":0}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":12}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":23}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":23}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":22}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":6}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":3}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":0}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":63}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":60}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":24}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":31}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":65}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":30}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":10}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":0}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":52}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":3}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":0}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":75}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":41}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":0}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":42}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":50}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":6}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":55}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":27}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":83}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":8}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":5}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":0}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":43}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":50}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":6}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":37}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":27}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":70}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":8}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":5}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":0}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":27}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":3}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":0}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":57}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":35}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":61}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":44}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":26}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":28}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":23}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":50}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":13}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":36}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":38}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":72}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":14}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":12}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":10}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":7}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":19}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":7}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":3}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":629,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":629,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":629,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":629,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/algorithms/priority-matching.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/algorithms/priority-matching.algorithm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":67}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":73}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":15}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":11}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":15}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":42}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":38}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":24}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":32}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":16}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":12}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":23}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":22}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":26}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":29}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":4}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":40}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":71}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":23}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":26}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":40}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":35}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":20}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":108}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":63}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":12}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":6}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":64}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":12}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":15}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":6}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":32}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":40}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":59}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":47}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":50}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":41}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":52}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":57}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":68}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":16}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":22}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":10}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":12}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":43}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":66}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":11}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":41}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":32}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":7}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":41}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":39}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":20}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":20}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":22}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":10}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":28}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":43}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":24}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":103}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":10}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":14}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":41}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":50}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":20}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":123}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":6}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":14}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":21}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":21}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":28}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":6}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":35}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":34}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":14}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":17}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":14}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":71}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":9}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":46}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":33}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":33}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":17}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":26}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":34}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":13}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":21}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":52}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":70}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":72}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":49}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":18}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":7}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":41}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":26}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":37}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":38}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":63}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":18}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":57}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":11}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":16}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":36}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":36}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":72}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":73}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":16}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":43}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":75}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":53}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":16}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":41}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":71}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":36}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":11}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":16}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":37}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":71}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":36}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":11}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":16}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":7}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":20}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":3}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":38}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":20}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":21}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":26}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":40}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":13}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":18}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":24}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":48}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":15}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":18}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":6}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":54}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":15}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":16}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":18}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":6}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":67}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":60}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":15}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":6}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":47}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":40}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":33}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":46}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":36}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":38}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":32}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":52}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":39}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":33}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":60}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":17}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":18}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":8}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":52}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":40}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":49}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":58}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":17}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":18}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":20}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":8}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":50}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":39}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":5}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":53}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":30}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":20}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":21}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":40}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":13}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":41}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":43}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":39}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":49}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":62}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":56}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":33}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":20}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":21}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":40}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":13}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":47}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":49}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":56}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":68}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":75}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":71}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":55}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":7}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":15}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":5}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":48}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":3}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":0}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":73}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":30}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":67}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":6}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":56}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":51}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":80}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":70}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":72}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":50}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":3}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":35}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":20}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":21}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":40}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":13}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":62}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":0}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":44}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":24}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":25}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":6}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":68}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":51}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":3}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":34}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":20}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":21}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":40}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":13}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":67}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":69}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":60}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":48}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":50}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":15}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":50}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":18}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":21}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":17}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":24}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":23}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":22}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":5}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":28}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":17}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":20}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":16}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":24}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":22}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":22}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":6}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":0}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":48}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":68}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":26}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":37}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":50}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":37}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":53}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":16}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":36}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":49}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":16}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":43}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":56}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":16}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":43}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":55}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":16}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":43}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":54}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":16}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":7}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":5}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":54}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":36}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":8}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":6}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":30}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":80}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":30}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":3}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":0}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":28}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":20}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":21}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":40}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":14}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":41}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":43}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":43}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":78}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":19}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":78}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":19}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":49}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":62}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":40}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":3}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":22}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":20}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":21}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":18}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":40}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":12}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":76}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":64}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":30}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":37}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":39}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":44}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":38}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":32}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":39}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":16}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":79}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":29}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":41}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":45}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":15}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":44}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":24}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":25}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":6}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":22}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":28}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":22}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":66}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":19}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":9}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":32}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":34}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":69}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":10}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":8}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":6}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":74}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":0}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":17}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":3}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":0}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":69}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":43}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":41}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":42}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":41}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":42}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":0}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":19}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":49}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":49}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":13}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":47}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":40}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":42}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":28}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":27}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":61}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":17}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":3}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":469,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":469,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":469,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":469,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/audit/audit.service.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/audit/audit.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":49}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":64}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":29}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":41}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":19}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":17}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":21}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":42}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":18}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":17}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":30}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":23}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":24}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":12}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":42}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":43}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":44}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":42}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":27}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":58}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":42}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":14}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":28}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":56}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":70}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":48}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":26}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":36}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":75}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":28}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":15}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":6}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":39}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":57}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":100}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":6}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":22}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":17}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":20}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":26}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":26}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":25}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":30}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":42}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":13}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":13}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":17}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":45}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":35}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":25}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":8}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":7}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":23}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":25}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":20}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":20}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":26}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":26}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":25}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":30}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":55}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":42}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":13}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":13}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":17}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":58}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":8}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":7}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":17}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":20}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":20}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":26}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":30}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":47}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":13}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":13}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":7}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":3}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":24}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":23}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":20}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":26}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":26}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":25}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":24}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":29}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":40}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":28}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":32}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":8}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":7}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":3}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":22}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":23}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":32}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":20}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":26}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":26}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":25}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":24}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":29}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":54}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":40}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":13}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":57}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":8}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":7}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":3}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":24}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":23}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":20}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":26}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":25}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":24}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":29}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":45}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":13}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":13}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":7}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":68}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":49}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":28}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":47}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":58}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":8}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":26}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":47}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":54}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":8}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":24}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":47}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":50}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":8}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":5}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":24}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":47}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":50}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":8}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":27}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":47}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":55}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":8}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":5}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":25}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":47}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":53}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":8}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":5}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":0}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":25}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":62}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":6}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":38}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":38}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":75}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":58}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":12}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":43}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":32}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":14}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":6}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":70}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":33}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":26}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":24}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":40}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":3}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":68}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":33}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":23}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":40}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":3}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":24}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":19}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":21}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":19}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":28}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":33}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":13}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":16}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":14}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":40}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":28}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":20}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":18}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":27}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":33}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":16}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":14}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":19}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":7}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":3}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":24}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":36}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":22}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":75}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":28}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":45}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":5}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":0}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":27}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":47}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":60}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":44}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":12}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":19}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":39}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":41}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":45}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":39}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":27}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":23}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":41}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":33}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":33}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":6}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":3}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":49}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":12}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":18}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":22}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":22}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":30}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":26}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":26}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":32}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":32}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":32}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":6}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":3}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":27}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":16}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":15}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":45}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":63}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":32}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":43}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":24}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":30}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":27}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":10}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":7}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":5}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":19}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":3}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":74}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":53}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":54}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":55}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":34}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":33}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":34}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":75}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":40}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":52}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":25}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":39}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":51}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":7}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":43}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":39}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":7}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":41}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":37}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":7}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":5}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":0}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":12}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":20}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":21}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":22}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":28}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":24}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":8}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":6}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":3}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":55}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":21}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":11}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":20}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":18}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":15}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":18}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":19}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":15}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":17}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":6}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":0}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":41}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":15}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":23}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":21}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":19}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":25}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":36}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":28}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":25}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":43}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":7}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":41}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":63}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":18}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":0}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":22}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":3}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":0}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":72}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":34}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":61}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":50}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":49}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":47}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":6}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":65}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":0}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":20}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":88}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":6}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":24}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":3}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":0}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":39}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":25}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":42}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":44}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":42}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":33}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":6}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":50}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":53}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":55}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":53}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":44}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":39}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":51}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":79}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":25}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":77}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":7}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":5}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":0}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":44}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":68}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":20}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":0}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":12}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":19}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":20}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":22}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":20}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":21}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":6}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":3}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":461,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":461,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":461,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":461,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/dto/matching-preferences.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/dto/matching-preferences.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":12}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":10}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":11}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":6}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":6}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":17}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":18}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":22}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":28}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":38}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":38}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":29}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":24}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":34}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":9}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":11}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":25}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":13}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":9}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":13}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":9}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":1}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":36}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":26}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":25}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":9}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":12}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":27}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":30}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":15}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":12}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":27}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":29}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":1}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":27}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":15}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":13}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":38}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":12}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":37}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":41}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":15}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":14}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":23}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":1}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":34}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":15}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":9}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":27}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":15}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":13}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":9}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":27}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":14}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":36}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":13}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":9}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":11}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":39}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":1}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":30}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":13}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":9}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":11}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":31}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":15}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":31}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":9}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":10}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":28}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":15}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":12}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":31}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":9}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":9}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":27}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":15}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":14}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":35}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":1}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":33}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":13}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":9}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":11}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":35}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":15}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":12}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":27}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":32}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":15}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":12}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":27}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":31}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":15}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":14}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":40}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":1}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":37}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":27}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":29}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":15}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":19}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":31}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":27}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":15}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":19}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":36}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":37}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":19}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":35}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":35}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":15}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":19}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":34}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":33}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":15}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":19}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":30}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":25}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":15}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":33}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":31}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":15}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":12}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":27}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":25}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":15}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":13}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":9}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":11}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":25}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":214,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":214,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":214,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":214,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/entities/match.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/entities/match.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":67}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":25}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":22}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":46}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":22}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":20}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":33}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":37}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":23}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":38}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":55}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":26}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":55}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":71}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":28}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":11}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":33}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":22}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":11}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":28}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":70}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":19}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":70}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":24}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":13}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":22}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":34}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":32}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":21}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":22}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":7}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":75}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":25}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":76}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":67}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":18}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":43}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":18}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":43}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":18}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":45}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":41}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":45}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":42}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":103,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":103,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":103,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":103,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/entities/matching-rule.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/entities/matching-rule.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":22}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":36}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":34}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":48}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":36}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":40}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":38}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":48}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":36}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":10}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":11}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":24}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":20}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":24}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":26}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":25}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":33}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":26}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":43}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":22}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":11}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":17}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":11}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":23}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":33}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":25}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":11}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":31}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":21}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":70}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":17}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":43}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":22}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":28}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":26}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":26}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":34}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":33}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":24}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":34}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":27}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":25}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":24}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":17}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":7}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":43}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":25}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":26}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":26}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":32}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":24}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":25}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":23}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":28}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":6}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":49}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":53}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":24}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":54}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":26}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":55}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":27}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":71}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":22}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":69}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":20}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":49}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":20}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":49}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":20}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":43}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":18}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":43}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":18}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":131,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":131,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":131,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":131,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/matching/events/matching-events.service.ts": {"path":"/workspaces/CurrentDao-backend/src/matching/events/matching-events.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":80}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":19}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":18}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":22}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":43}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":62}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":69}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":54}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":36}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":24}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":38}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":7}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":18}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":12}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":49}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":18}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":19}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":9}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":25}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":2}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":34}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":67}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":17}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":67}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":53}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":55}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":61}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":54}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":48}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":30}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":59}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":36}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":54}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":49}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":14}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":21}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":59}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":59}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":8}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":68}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":60}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":7}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":70}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":64}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":7}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":30}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":54}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":26}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":28}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":7}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":36}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":57}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":44}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":67}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":41}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":40}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":7}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":41}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":65}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":36}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":28}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":76}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":62}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":3}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":40}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":63}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":34}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":28}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":46}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":52}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":5}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":54}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":74}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":60}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":3}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":43}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":50}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":28}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":71}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":51}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":3}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":45}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":69}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":36}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":29}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":80}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":64}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":3}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":32}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":74}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":44}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":7}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":25}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":21}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":52}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":50}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":8}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":6}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":51}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":38}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":26}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":48}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":25}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":27}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":17}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":30}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":35}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":8}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":7}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":65}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":46}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":37}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":3}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":74}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":60}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":23}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":33}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":34}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":67}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":6}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":25}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":27}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":16}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":30}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":32}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":37}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":130}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":29}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":10}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":29}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":16}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":30}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":34}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":35}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":68}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":27}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":41}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":10}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":28}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":30}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":33}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":34}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":67}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":27}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":40}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":10}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":27}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":16}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":30}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":32}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":33}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":61}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":29}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":10}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":31}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":16}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":30}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":36}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":37}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":57}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":27}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":10}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":14}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":16}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":30}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":34}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":62}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":26}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":33}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":5}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":3}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":61}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":70}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":37}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":65}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":5}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":0}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":30}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":17}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":42}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":44}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":5}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":31}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":17}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":44}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":44}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":5}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":22}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":84}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":6}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":46}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":46}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":60}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":0}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":34}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":17}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":47}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":39}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":5}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":35}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":17}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":48}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":39}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":5}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":58}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":3}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":40}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":38}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":15}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":34}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":32}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":27}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":33}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":12}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":45}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":44}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":11}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":42}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":9}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":14}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":29}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":28}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":39}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":14}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":27}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":41}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":14}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":31}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":45}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":14}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":0}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":14}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":33}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":14}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":5}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":20}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":3}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":31}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":57}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":51}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":22}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":28}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":6}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":0}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":50}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":3}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":0}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":57}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":34}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":3}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":0}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":71}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":46}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":3}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":67}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":55}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":3}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":0}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":69}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":57}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":3}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":68}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":32}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":34}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":28}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":46}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":52}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":54}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":77}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":0}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":68}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":3}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":73}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":37}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":33}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":5}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":22}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":75}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":6}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":0}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":62}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":3}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":77}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":37}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":34}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":5}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":0}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":22}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":79}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":6}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":0}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":64}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":3}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":38}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":38}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":3}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":0}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":37}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":39}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":3}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":0}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":48}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":53}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":39}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":35}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":39}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":39}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":33}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":29}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":9}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":7}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":5}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":32}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":3}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":0}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":26}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":20}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":52}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":5}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":27}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":29}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":14}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":15}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":28}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":6}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":0}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":54}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":3}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":0}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":44}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":59}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":15}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":28}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":7}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":3}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":0}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":49}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":27}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":24}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":25}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":49}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":6}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":63}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":17}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":28}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":7}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":450,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":450,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":450,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":450,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/modules/dao/dao.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/modules/dao/dao.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":68}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":43}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":62}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":69}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":15}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":57}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":49}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":37}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":50}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":42}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":39}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":51}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":62}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":53}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":19}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":48}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":13}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":58}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":69}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":23}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":49}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":43}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":40}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":16}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":52}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":30}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":48}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":49,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":49,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":49,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":49,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/modules/dao/dao.service.ts": {"path":"/workspaces/CurrentDao-backend/src/modules/dao/dao.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":54}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":36}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":22}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":19}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":1}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":26}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":17}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":25}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":46}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":40}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":55}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":73}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":73}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":32}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":37}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":49}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":43}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":39}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":47}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":22}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":23}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":81}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":28}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":34}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":21}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":31}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":61}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":51}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":28}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":14}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":32}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":7}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":38}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":56}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":61}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":19}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":67}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":74}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":38}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":28}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":51}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":77}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":80,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":80,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":80,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":80,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/modules/dao/dto/create-proposal.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/modules/dao/dto/create-proposal.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":58}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":32}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":22}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":17}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":19,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":19,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":19,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":19,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/modules/dao/entities/proposal.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/modules/dao/entities/proposal.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":16}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":22}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":17}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":19}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":43}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":18}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":14,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/modules/energy/energy.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/modules/energy/energy.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":68}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":49}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":69}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":31}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":63}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":53}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":40}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":54}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":42}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":42}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":55}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":68}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":59}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":52}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":47}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":47}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":56}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":47}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":54}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":56}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":52}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":46,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":46,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":46,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":46,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/modules/energy/energy.service.ts": {"path":"/workspaces/CurrentDao-backend/src/modules/energy/energy.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":61}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":39}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":18}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":1}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":33}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":20}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":28}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":46}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":50}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":43}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":58}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":64}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":15}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":47}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":27}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":32}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":46}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":44}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":42}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":40}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":38}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":6}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":28}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":63}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":55}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":32}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":5}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":25}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":51}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":12}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":30}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":28}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":40}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":6}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":63}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":30}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":71}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":6}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":72,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/modules/energy/dto/create-energy-trade.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/modules/energy/dto/create-energy-trade.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":19}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":18}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":17}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":23}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":7,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":7,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/modules/energy/entities/energy-trade.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/modules/energy/entities/energy-trade.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":30}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":19}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":18}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":17}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":23}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":47}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":18}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":11,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":11,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":11,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":11,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/monitoring/monitoring.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/monitoring/monitoring.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":74}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":8}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":29}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":28}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":38}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":35}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":14}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":74}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":6}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":74}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":71}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":3}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":28}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":53}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":63}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":68}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":65}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":19}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":21}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":77}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":77}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":30}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":63}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":40,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":40,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/monitoring/monitoring.module.ts": {"path":"/workspaces/CurrentDao-backend/src/monitoring/monitoring.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":50}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":79}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":74}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":53}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":54}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":78}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":63}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":12}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":56}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":4}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":38}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":30}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":31}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":4}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":12}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":17}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":17}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":4}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":2}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":32}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":30,"column":32}},"locations":[{"start":{"line":1,"column":0},"end":{"line":30,"column":32}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":30,"column":32}},"loc":{"start":{"line":1,"column":0},"end":{"line":30,"column":32}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/monitoring/transaction-monitor.service.ts": {"path":"/workspaces/CurrentDao-backend/src/monitoring/transaction-monitor.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":66}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":26}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":22}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":46}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":29}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":28}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":38}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":53}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":54}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":42}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":64}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":71}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":77}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":14}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":46}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":86}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":48}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":48}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":79}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":24}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":63}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":41}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":26}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":42}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":39}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":65}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":19}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":40}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":44}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":7}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":63}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":59}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":76}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":28}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":23}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":28}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":46}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":53}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":33}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":7}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":68}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":44}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":18}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":6}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":11}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":13}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":15}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":20}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":25}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":16}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":16}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":15}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":17}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":25}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":14}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":26}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":38}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":44}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":59}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":74}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":68}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":32}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":62}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":31}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":72}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":27}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":54}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":25}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":52}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":33}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":59}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":14}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":39}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":33}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":20}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":35}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":32}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":30}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":26}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":46}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":67}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":23}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":67}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":18}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":5}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":41}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":32}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":39}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":49}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":43}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":43}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":66}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":53}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":59}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":43}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":60}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":59}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":14}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":50}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":90}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":80}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":10}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":7}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":5}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":61}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":31}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":52}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":18}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":15}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":8}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":23}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":58}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":77}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":51}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":7}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":20}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":82}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":52}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":56}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":3}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":58}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":58}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":13}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":53}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":57}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":13}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":69}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":3}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":57}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":76}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":26}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":37}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":57}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":3}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":80}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":9}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":69}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":77}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":45}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":15}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":7}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":50}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":37}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":42}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":43}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":26}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":38}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":10}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":54}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":30}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":56}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":10}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":14}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":43}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":26}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":35}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":42}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":52}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":10}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":7}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":26}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":43}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":15}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":7}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":24}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":57}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":14}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":8}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":69}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":24}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":31}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":46}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":80}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":45}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":28}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":38}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":36}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":12}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":9}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":7}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":5}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":3}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":36}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":52}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":66}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":77}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":14}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":42}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":46}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":8}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":7}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":52}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":41}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":36}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":34}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":48}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":8}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":5}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":3}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":0}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":32}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":57}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":39}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":27}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":24}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":24}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":18}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":61}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":14}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":17}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":66}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":14}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":18}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":70}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":14}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":19}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":71}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":14}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":5}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":70}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":14}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":39}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":8}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":7}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":50}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":52}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":52}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":13}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":54}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":54}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":13}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":51}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":51}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":13}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":53}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":53}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":13}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":52}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":52}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":13}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":0}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":23}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":27}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":59}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":12}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":44}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":71}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":6}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":35}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":28}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":43}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":75}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":30}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":17}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":30}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":14}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":12}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":29}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":29}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":68}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":29}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":12}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":48}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":20}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":51}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":19}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":8}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":46}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":6}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":50}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":20}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":55}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":19}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":8}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":48}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":6}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":80}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":0}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":12}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":24}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":26}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":28}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":25}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":27}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":26}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":18}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":30}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":24}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":22}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":24}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":18}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":6}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":3}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":31}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":44}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":20}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":18}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":12}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":11}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":63}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":5}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":30}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":13}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":65}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":11}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":28}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":67}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":6}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":37}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":75}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":69}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":63}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":0}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":51}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":68}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":8}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":0}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":54}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":58}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":8}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":25}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":35}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":68}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":14}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":0}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":21}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":34}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":49}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":35}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":24}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":23}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":76}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":18}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":15}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":25}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":42}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":14}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":30}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":39}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":20}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":29}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":8}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":5}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":0}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":23}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":3}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":0}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":49}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":78}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":0}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":73}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":14}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":46}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":26}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":8}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":7}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":0}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":48}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":36}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":63}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":5}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":0}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":75}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":0}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":45}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":50}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":40}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":44}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":3}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":0}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":61}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":77}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":14}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":40}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":42}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":8}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":7}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":0}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":52}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":41}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":36}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":33}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":30}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":8}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":5}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":20}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":70}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":6}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":3}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":0}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":25}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":27}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":30}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":32}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":5}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":12}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":54}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":27}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":29}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":6}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":3}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":489,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":489,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":489,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":489,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/monitoring/alerts/alert.service.ts": {"path":"/workspaces/CurrentDao-backend/src/monitoring/alerts/alert.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":26}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":47}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":31}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":15}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":36}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":1}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":24}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":51}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":18}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":56}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":17}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":54}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":43}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":34}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":58}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":56}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":17}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":24}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":54}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":43}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":34}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":58}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":58}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":24}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":56}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":43}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":34}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":60}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":1}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":13}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":27}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":58}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":67}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":61}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":59}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":14}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":46}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":86}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":56}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":56}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":60}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":30}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":41}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":33}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":33}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":20}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":76}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":114}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":26}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":28}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":14}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":51}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":17}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":18}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":18}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":39}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":43}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":8}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":28}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":6}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":32}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":47}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":3}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":26}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":20}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":35}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":20}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":26}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":23}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":27}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":14}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":61}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":6}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":32}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":3}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":41}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":25}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":20}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":20}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":59}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":20}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":17}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":89}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":22}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":15}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":14}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":51}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":21}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":43}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":43}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":39}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":8}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":28}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":6}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":32}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":47}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":79}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":59}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":20}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":17}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":91}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":26}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":22}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":15}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":14}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":51}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":17}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":32}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":39}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":8}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":28}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":6}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":32}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":47}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":3}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":23}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":41}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":20}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":20}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":121}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":26}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":20}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":25}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":14}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":51}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":17}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":43}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":39}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":8}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":28}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":32}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":47}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":3}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":29}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":22}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":35}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":20}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":89}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":26}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":26}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":62}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":14}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":32}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":17}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":15}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":14}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":20}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":8}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":28}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":6}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":32}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":3}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":56}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":41}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":67}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":13}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":5}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":70}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":18}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":30}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":63}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":6}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":53}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":13}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":20}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":25}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":80}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":10}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":6}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":39}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":39}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":72}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":3}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":28}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":41}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":17}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":20}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":76}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":23}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":30}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":21}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":5}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":63}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":50}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":23}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":23}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":29}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":31}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":30}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":7}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":50}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":55}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":31}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":6}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":3}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":27}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":30}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":34}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":45}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":8}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":44}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":42}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":7}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":77}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":5}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":48}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":75}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":17}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":79}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":57}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":44}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":34}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":28}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":6}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":69}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":40}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":3}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":53}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":27}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":58}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":34}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":44}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":3}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":54}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":48}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":3}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":68}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":56}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":3}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":64}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":34}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":54}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":32}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":5}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":0}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":20}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":68}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":23}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":3}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":20}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":24}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":41}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":45}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":31}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":5}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":34}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":0}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":54}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":32}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":42}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":23}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":53}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":19}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":8}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":35}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":6}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":46}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":23}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":61}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":19}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":8}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":35}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":6}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":12}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":36}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":19}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":23}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":60}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":6}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":3}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":53}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":45}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":65}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":3}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":63}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":30}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":19}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":22}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":51}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":30}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":28}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":6}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":48}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":0}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":50}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":32}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":13}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":40}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":31}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":25}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":32}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":71}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":9}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":14}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":30}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":7}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":5}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":19}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":3}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":402,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":402,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":402,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":402,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/monitoring/dto/transaction-status.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/monitoring/dto/transaction-status.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":11}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":12}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":10}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":17}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":25}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":41}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":8}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":20}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":47}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":41}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":26}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":15}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":33}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":15}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":13}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":15}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":13}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":30}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":15}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":13}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":21}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":15}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":23}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":15}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":16}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":33}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":13}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":22}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":41}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":15}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":28}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":29}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":24}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":15}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":13}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":33}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":15}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":13}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":22}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":15}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":15}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":17}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":23}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":15}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":17}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":17}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":21}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":15}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":17}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":15}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":14}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":23}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":40}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":15}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":28}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":29}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":30}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":33}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":13}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":25}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":15}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":13}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":30}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":17}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":21}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":15}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":19}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":15}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":13}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":21}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":15}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":13}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":21}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":15}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":13}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":20}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":15}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":13}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":22}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":15}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":13}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":32}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":15}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":13}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":38}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":1}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":34}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":13}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":15}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":13}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":18}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":13}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":19}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":17}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":17}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":1}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":43}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":11}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":13}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":13}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":28}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":28}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":30}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":32}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":15}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":13}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":25}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":15}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":13}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":30}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":15}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":13}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":18}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":15}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":13}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":21}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":15}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":13}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":23}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":0}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":15}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":13}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":16}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":15}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":13}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":24}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":15}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":13}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":33}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":13}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":21}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":13}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":21}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":15}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":13}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":26}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":15}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":17}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":15}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":17}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":23}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":15}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":17}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":21}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":17}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":20}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":17}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":20}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":15}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":17}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":21}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":14}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":15}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":12}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":33}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":34}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":33}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":1}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":38}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":13}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":28}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":13}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":30}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":13}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":32}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":0}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":13}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":29}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":13}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":31}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":13}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":30}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":13}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":22}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":13}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":34}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":13}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":28}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":13}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":53}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":13}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":57}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":0}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":13}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":22}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":11}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":5}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":20}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":26}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":26}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":5}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":4}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":1}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":34}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":11}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":24}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":15}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":30}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":33}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":15}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":13}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":22}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":15}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":13}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":317,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":317,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":317,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":317,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/monitoring/entities/transaction-status.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/monitoring/entities/transaction-status.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":31}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":26}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":20}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":33}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":29}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":38}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":33}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":13}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":26}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":11}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":39}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":28}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":11}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":30}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":40}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":29}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":71}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":17}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":29}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":29}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":43}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":43}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":32}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":25}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":21}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":45}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":25}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":48}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":48}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":20}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":48}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":18}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":21}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":18}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":21}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":18}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":48}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":18}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":43}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":17}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":17}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":17}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":112,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":112,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":112,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":112,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/monitoring/retry/retry.service.ts": {"path":"/workspaces/CurrentDao-backend/src/monitoring/retry/retry.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":69}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":26}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":47}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":68}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":42}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":32}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":73}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":72}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":66}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":74}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":50}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":66}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":40}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":54}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":73}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":26}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":61}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":58}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":47}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":63}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":40}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":36}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":38}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":21}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":61}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":74}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":50}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":31}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":73}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":64}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":49}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":16}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":16}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":19}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":61}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":51}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":44}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":6}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":63}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":40}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":36}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":20}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":38}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":20}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":35}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":20}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":5}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":3}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":13}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":27}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":58}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":66}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":53}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":70}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":14}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":46}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":86}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":5}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":73}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":63}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":69}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":3}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":22}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":41}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":37}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":62}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":23}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":83}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":8}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":13}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":25}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":70}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":8}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":33}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":46}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":31}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":31}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":7}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":22}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":75}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":8}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":13}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":5}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":47}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":33}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":27}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":6}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":56}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":49}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":11}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":45}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":23}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":26}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":73}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":10}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":17}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":63}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":60}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":7}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":14}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":67}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":54}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":151}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":6}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":3}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":20}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":34}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":39}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":72}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":44}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":7}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":23}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":22}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":66}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":8}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":5}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":8}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":56}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":54}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":7}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":22}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":69}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":8}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":28}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":47}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":5}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":30}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":51}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":56}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":42}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":23}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":0}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":75}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":71}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":6}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":9}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":69}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":36}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":8}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":41}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":54}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":59}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":11}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":48}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":36}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":53}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":36}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":12}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":10}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":24}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":88}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":10}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":15}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":7}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":42}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":24}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":75}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":10}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":7}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":26}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":63}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":31}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":47}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":43}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":61}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":54}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":65}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":26}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":102}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":10}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":24}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":71}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":10}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":7}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":10}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":34}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":16}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":33}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":33}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":9}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":9}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":56}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":65}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":0}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":46}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":14}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":54}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":65}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":26}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":117}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":10}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":65}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":7}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":5}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":3}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":42}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":28}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":19}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":46}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":49}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":79}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":6}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":9}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":77}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":26}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":43}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":60}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":7}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":5}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":3}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":42}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":41}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":50}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":55}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":7}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":43}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":47}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":32}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":8}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":6}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":3}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":61}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":62}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":33}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":46}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":49}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":52}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":28}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":45}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":8}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":76}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":5}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":43}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":59}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":37}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":35}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":71}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":3}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":20}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":26}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":26}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":30}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":12}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":45}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":42}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":58}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":6}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":3}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":59}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":28}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":23}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":23}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":23}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":25}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":22}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":22}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":21}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":20}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":7}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":6}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":72}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":33}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":7}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":0}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":23}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":66}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":5}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":31}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":22}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":22}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":21}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":20}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":12}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":0}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":55}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":58}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":69}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":0}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":25}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":19}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":73}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":14}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":9}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":5}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":0}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":12}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":51}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":41}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":41}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":43}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":19}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":6}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":3}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":0}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":44}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":78}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":52}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":67}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":7}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":53}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":65}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":61}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":7}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":5}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":20}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":75}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":6}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":3}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":70}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":40}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":58}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":3}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":0}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":61}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":37}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":3}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":0}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":42}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":34}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":3}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":434,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":434,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":434,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":434,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/monitoring/workflows/transaction.workflow.ts": {"path":"/workspaces/CurrentDao-backend/src/monitoring/workflows/transaction.workflow.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":26}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":22}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":47}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":75}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":54}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":55}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":42}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":31}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":15}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":62}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":64}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":31}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":4}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":1}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":45}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":39}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":27}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":14}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":32}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":28}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":20}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":26}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":13}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":41}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":72}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":45}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":11}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":29}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":26}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":28}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":42}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":22}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":5}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":46}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":86}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":74}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":48}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":48}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":6}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":23}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":28}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":65}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":22}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":72}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":33}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":7}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":23}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":66}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":5}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":67}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":49}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":18}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":58}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":42}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":48}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":6}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":58}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":42}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":37}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":21}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":12}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":14}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":28}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":7}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":20}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":74}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":6}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":22}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":60}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":58}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":20}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":58}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":45}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":9}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":74}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":39}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":33}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":24}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":75}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":64}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":53}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":32}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":11}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":7}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":49}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":52}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":74}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":73}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":8}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":48}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":120}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":8}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":71}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":26}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":46}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":58}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":65}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":18}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":46}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":5}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":3}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":37}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":40}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":20}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":59}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":39}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":62}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":11}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":36}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":15}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":28}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":25}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":74}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":24}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":10}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":36}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":64}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":34}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":9}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":7}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":5}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":24}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":11}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":37}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":70}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":36}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":26}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":51}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":24}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":7}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":20}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":3}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":76}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":39}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":62}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":60}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":3}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":38}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":23}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":17}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":20}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":58}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":26}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":45}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":50}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":55}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":7}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":41}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":36}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":8}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":6}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":73}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":58}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":57}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":5}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":3}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":27}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":25}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":41}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":39}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":7}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":37}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":37}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":53}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":60}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":11}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":44}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":10}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":53}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":8}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":7}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":37}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":37}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":15}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":69}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":59}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":77}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":11}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":10}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":77}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":8}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":7}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":42}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":37}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":15}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":50}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":29}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":63}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":22}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":51}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":45}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":32}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":49}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":66}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":13}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":24}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":11}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":10}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":54}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":8}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":7}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":45}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":37}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":55}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":28}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":77}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":14}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":11}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":51}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":10}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":8}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":7}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":35}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":37}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":56}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":69}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":13}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":64}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":38}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":14}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":12}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":48}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":10}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":53}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":8}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":6}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":27}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":22}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":16}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":23}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":11}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":42}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":41}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":18}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":77}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":17}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":80}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":15}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":55}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":14}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":12}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":11}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":40}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":41}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":56}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":122}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":16}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":57}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":14}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":12}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":10}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":19}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":16}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":23}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":11}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":37}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":41}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":39}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":61}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":26}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":54}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":54}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":20}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":27}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":19}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":68}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":53}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":14}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":57}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":12}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":10}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":14}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":25}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":3}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":59}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":58}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":20}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":58}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":5}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":47}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":0}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":50}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":72}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":79}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":6}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":44}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":56}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":56}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":27}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":24}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":23}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":20}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":22}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":13}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":58}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":31}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":0}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":12}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":30}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":40}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":40}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":36}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":59}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":6}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":3}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":38}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":11}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":25}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":30}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":29}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":26}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":25}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":22}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":6}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":5}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":28}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":25}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":30}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":29}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":26}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":25}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":22}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":12}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":0}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":52}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":37}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":8}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":22}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":19}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":70}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":32}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":42}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":42}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":38}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":9}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":5}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":21}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":3}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":0}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":50}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":27}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":42}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":0}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":52}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":37}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":8}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":57}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":39}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":0}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":32}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":42}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":7}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":5}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":0}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":48}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":44}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":5}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":38}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":22}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":66}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":8}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":5}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":0}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":44}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":61}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":3}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":0}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":23}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":28}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":31}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":28}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":33}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":5}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":64}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":0}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":39}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":51}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":13}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":36}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":48}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":13}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":0}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":36}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":59}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":54}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":0}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":32}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":31}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":63}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":31}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":12}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":0}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":12}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":40}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":36}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":30}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":27}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":6}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":3}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":487,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":487,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":487,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":487,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/multisig/multisig.module.ts": {"path":"/workspaces/CurrentDao-backend/src/multisig/multisig.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":53}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":67}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":56}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":88}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":62}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":67}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":77}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":75}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":18}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":30}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":15,"column":30}},"locations":[{"start":{"line":1,"column":0},"end":{"line":15,"column":30}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":15,"column":30}},"loc":{"start":{"line":1,"column":0},"end":{"line":15,"column":30}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/multisig/multisig.service.ts": {"path":"/workspaces/CurrentDao-backend/src/multisig/multisig.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":20}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":22}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":20}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":51}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":76}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":56}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":15}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":43}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":8}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":18}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":37}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":8}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":26}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":19}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":88}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":62}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":30}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":47}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":14}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":37}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":66}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":32}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":64}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":78}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":54}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":44}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":21}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":45}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":22}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":30}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":49}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":61}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":30}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":32}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":49}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":25}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":29}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":24}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":44}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":51}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":7}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":65}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":20}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":86}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":6}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":62}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":56}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":30}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":32}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":7}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":18}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":63}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":5}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":18}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":70}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":56}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":25}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":32}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":7}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":18}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":63}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":24}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":43}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":21}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":25}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":49}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":55}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":6}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":45}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":80}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":8}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":46}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":47}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":7}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":80}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":5}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":70}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":14}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":60}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":17}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":40}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":8}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":7}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":28}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":34}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":56}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":8}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":33}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":75}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":55}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":28}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":26}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":15}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":16}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":27}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":7}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":74}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":60}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":13}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":21}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":6}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":20}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":104}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":6}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":26}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":24}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":34}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":21}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":25}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":62}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":14}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":51}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":40}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":8}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":7}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":21}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":65}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":31}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":67}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":47}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":37}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":50}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":76}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":61}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":23}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":23}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":6}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":20}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":93}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":6}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":28}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":3}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":27}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":38}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":25}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":60}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":14}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":52}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":42}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":8}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":28}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":7}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":34}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":34}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":61}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":8}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":5}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":40}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":47}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":36}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":53}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":8}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":57}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":49}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":36}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":100}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":8}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":9}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":68}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":23}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":35}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":43}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":33}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":8}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":50}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":45}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":54}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":44}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":70}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":58}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":11}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":8}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":44}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":35}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":24}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":47}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":22}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":74}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":8}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":21}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":24}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":71}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":14}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":8}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":68}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":5}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":3}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":69}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":60}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":33}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":28}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":7}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":34}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":59}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":5}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":40}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":64}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":50}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":52}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":6}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":49}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":51}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":6}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":0}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":73}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":16}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":40}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":26}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":15}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":37}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":41}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":7}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":25}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":63}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":23}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":5}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":12}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":22}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":26}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":42}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":52}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":54}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":29}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":13}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":64}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":71}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":6}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":3}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":31}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":70}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":45}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":35}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":59}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":28}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":53}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":36}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":9}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":5}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":26}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":55}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":32}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":9}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":5}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":28}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":72}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":43}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":9}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":37}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":28}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":30}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":17}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":0}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":51}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":38}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":55}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":0}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":28}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":65}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":36}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":9}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":5}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":35}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":79}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":50}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":9}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":5}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":35}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":70}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":50}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":9}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":5}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":28}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":67}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":46}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":9}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":5}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":26}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":65}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":42}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":9}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":5}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":43}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":28}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":30}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":17}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":35}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":3}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":34}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":51}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":67}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":14}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":40}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":40}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":8}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":28}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":7}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":48}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":49}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":53}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":59}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":25}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":18}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":8}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":5}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":39}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":22}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":68}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":8}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":5}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":3}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":33}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":45}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":11}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":8}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":43}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":41}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":7}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":36}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":53}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":8}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":5}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":0}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":8}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":38}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":64}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":7}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":36}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":64}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":8}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":5}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":0}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":44}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":10}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":72}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":74}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":9}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":38}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":86}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":10}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":7}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":5}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":59}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":64}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":62}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":5}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":40}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":22}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":22}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":22}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":70}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":0}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":43}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":26}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":28}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":25}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":40}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":43}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":72}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":3}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":459,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":459,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":459,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":459,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/multisig/dto/multisig.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/multisig/dto/multisig.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":10}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":11}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":9}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":13}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":9}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":6}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":6}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":12}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":66}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":80}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":38}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":13}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":15}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":13}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":12}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":27}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":13}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":9}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":10}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":9}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":10}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":15}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":11}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":33}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":33}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":26}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":13}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":26}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":35}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":39}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":21}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":15}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":23}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":23}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":22}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":33}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":13}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":26}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":17}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":17}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":1}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":34}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":13}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":13}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":17}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":17}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":15}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":13}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":9}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":10}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":24}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":15}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":12}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":27}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":24}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":36}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":13}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":26}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":11}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":38}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":1}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":30}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":15}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":13}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":17}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":15}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":13}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":18}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":15}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":12}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":27}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":21}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":15}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":13}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":10}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":15}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":23}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":24}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":15}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":11}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":33}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":40}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":13}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":18}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":15}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":22}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":20}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":20}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":16}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":33}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":29}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":29}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":31}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":18}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":18}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":27}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":27}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":26}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":29}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":1}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":35}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":13}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":19}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":26}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":19}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":26}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":35}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":39}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":21}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":18}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":18}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":19}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":20}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":27}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":23}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":23}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":22}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":22}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":4}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":28}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":18}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":21}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":21}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":19}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":21}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":1}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":35}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":13}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":26}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":0}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":13}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":19}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":13}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":13}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":29}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":13}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":30}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":12}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":33}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":35}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":37}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":13}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":66}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":13}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":22}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":13}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":1}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":32}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":13}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":19}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":23}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":23}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":13}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":27}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":13}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":37}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":13}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":38}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":13}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":30}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":13}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":28}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":15}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":13}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":21}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":15}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":12}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":33}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":35}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":46}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":1}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":31}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":15}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":13}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":20}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":15}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":23}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":24}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":15}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":13}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":20}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":15}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":26}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":36}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":15}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":26}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":36}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":15}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":13}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":20}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":15}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":13}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":18}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":15}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":13}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":9}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":11}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":22}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":15}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":13}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":9}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":22}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":302,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":302,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":302,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":302,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/multisig/entities/multisig-wallet.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/multisig/entities/multisig-wallet.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":47}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":26}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":20}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":28}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":27}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":21}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":29}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":33}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":11}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":15}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":11}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":22}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":11}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":20}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":27}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":20}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":11}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":11}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":23}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":33}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":41}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":43}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":32}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":28}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":48}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":28}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":29}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":30}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":21}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":18}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":21}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":62}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":26}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":48}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":26}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":49}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":36}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":56}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":30}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":52}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":58}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":94,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":94,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":94,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":94,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/multisig/entities/signature.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/multisig/entities/signature.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":58}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":22}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":24}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":29}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":34}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":32}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":44}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":39}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":20}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":18}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":21}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":24}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":33}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":11}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":67}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":11}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":19}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":27}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":11}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":26}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":26}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":11}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":17}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":26}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":35}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":27}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":39}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":72}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":17}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":29}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":32}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":18}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":48}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":48}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":18}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":48}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":43}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":26}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":43}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":14}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":23}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":23}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":22}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":22}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":4}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":43}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":27}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":18}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":48}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":20}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":28}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":39}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":26}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":70}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":28}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":70}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":30}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":49}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":3}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":124,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":124,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":124,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":124,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/multisig/recovery/recovery.service.ts": {"path":"/workspaces/CurrentDao-backend/src/multisig/recovery/recovery.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":20}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":22}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":9}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":51}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":49}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":56}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":15}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":8}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":18}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":38}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":58}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":34}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":17}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":24}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":34}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":72}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":30}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":61}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":46}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":51}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":14}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":37}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":66}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":32}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":64}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":44}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":25}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":45}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":56}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":50}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":7}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":18}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":63}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":5}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":48}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":80}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":50}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":34}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":58}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":8}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":52}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":36}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":57}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":8}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":62}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":79}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":6}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":33}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":74}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":58}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":44}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":46}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":47}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":45}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":68}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":7}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":33}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":59}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":28}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":49}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":30}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":56}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":22}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":34}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":10}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":42}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":60}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":26}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":37}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":45}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":53}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":57}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":10}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":18}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":29}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":33}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":40}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":29}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":29}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":9}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":44}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":7}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":60}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":13}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":30}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":6}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":74}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":77}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":69}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":6}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":3}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":21}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":21}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":28}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":21}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":25}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":56}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":30}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":7}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":61}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":70}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":5}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":45}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":80}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":5}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":70}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":14}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":24}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":17}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":8}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":7}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":28}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":71}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":5}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":68}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":14}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":17}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":24}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":60}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":42}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":8}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":7}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":41}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":60}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":6}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":58}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":36}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":59}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":8}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":55}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":15}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":22}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":15}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":54}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":17}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":24}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":8}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":40}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":58}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":24}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":33}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":17}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":8}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":26}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":46}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":54}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":8}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":27}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":74}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":62}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":58}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":12}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":40}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":15}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":24}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":38}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":27}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":8}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":5}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":62}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":20}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":71}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":6}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":26}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":3}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":71}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":56}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":30}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":7}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":18}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":63}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":5}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":50}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":70}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":5}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":68}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":14}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":17}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":60}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":42}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":8}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":33}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":7}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":43}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":13}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":45}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":6}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":3}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":23}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":21}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":24}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":19}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":56}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":30}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":7}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":18}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":63}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":5}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":50}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":70}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":5}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":48}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":36}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":54}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":8}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":5}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":58}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":42}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":40}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":40}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":33}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":27}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":18}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":9}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":19}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":62}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":42}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":10}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":9}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":42}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":32}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":60}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":10}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":8}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":7}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":58}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":70}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":0}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":20}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":68}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":6}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":3}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":34}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":51}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":69}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":14}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":38}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":38}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":67}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":10}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":8}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":7}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":50}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":40}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":44}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":22}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":81}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":8}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":3}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":32}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":27}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":28}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":20}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":9}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":70}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":16}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":30}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":26}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":62}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":44}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":10}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":9}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":58}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":64}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":8}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":0}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":24}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":75}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":26}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":79}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":0}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":39}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":23}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":19}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":21}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":51}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":8}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":60}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":36}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":40}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":44}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":42}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":42}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":0}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":35}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":29}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":20}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":11}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":32}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":28}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":12}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":11}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":45}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":35}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":12}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":10}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":9}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":76}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":69}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":0}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":68}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":21}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":24}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":62}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":14}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":8}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":65}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":5}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":3}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":0}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":71}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":58}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":42}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":40}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":40}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":33}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":0}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":27}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":18}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":9}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":30}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":62}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":42}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":10}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":9}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":42}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":10}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":8}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":7}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":0}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":44}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":43}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":0}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":64}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":3}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":37}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":27}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":29}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":31}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":68}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":14}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":28}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":60}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":52}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":8}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":33}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":7}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":0}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":56}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":62}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":6}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":0}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":41}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":60}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":6}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":71}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":0}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":54}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":8}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":46}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":35}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":7}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":27}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":28}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":26}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":48}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":25}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":5}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":0}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":12}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":26}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":52}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":65}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":71}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":67}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":25}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":60}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":43}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":19}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":50}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":58}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":11}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":21}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":13}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":6}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":3}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":0}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":34}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":27}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":29}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":11}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":8}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":23}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":63}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":7}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":36}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":53}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":8}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":5}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":0}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":45}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":77}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":38}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":66}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":10}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":7}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":5}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":0}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":25}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":52}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":57}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":68}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":7}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":5}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":0}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":44}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":60}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":6}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":56}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":36}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":59}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":8}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":5}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":3}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":0}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":48}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":21}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":22}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":91}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":3}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":0}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":42}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":21}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":28}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":22}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":71}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":3}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":0}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":76}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":60}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":3}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":0}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":50}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":27}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":37}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":20}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":16}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":73}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":6}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":3}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":0}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":39}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":27}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":28}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":22}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":21}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":20}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":16}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":86}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":6}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":3}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":0}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":41}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":27}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":25}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":25}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":20}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":73}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":3}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":0}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":43}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":27}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":19}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":20}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":16}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":75}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":6}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":3}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":0}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":38}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":26}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":25}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":25}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":25}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":20}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":45}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":16}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":115}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":6}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":3}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":0}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":40}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":27}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":37}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":24}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":20}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":80}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":3}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":0}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":39}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":27}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":25}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":20}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":16}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":82}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":6}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":3}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":0}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":40}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":27}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":28}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":20}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":16}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":88}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":6}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":3}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":0}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":42}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":27}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":24}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":19}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":20}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":16}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":80}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":6}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":3}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":615,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":615,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":615,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":615,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/multisig/workflows/signature-collection.workflow.ts": {"path":"/workspaces/CurrentDao-backend/src/multisig/workflows/signature-collection.workflow.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":17}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":44}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":74}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":41}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":7}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":25}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":26}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":25}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":24}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":27}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":18}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":42}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":73}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":14}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":64}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":6}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":25}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":33}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":9}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":54}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":51}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":53}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":67}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":34}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":8}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":55}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":54}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":27}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":41}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":51}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":37}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":51}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":54}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":30}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":9}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":71}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":58}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":42}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":17}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":36}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":30}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":7}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":52}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":98}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":8}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":24}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":84}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":14}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":8}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":18}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":27}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":25}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":20}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":9}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":67}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":34}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":8}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":52}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":54}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":27}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":39}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":28}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":51}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":37}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":53}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":53}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":54}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":30}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":9}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":80}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":22}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":105}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":8}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":21}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":24}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":95}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":14}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":8}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":22}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":25}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":20}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":67}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":34}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":8}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":52}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":54}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":8}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":27}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":28}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":51}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":37}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":39}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":53}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":54}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":30}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":9}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":76}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":22}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":107}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":8}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":91}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":14}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":8}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":18}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":5}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":3}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":36}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":28}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":27}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":33}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":34}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":7}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":66}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":25}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":31}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":32}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":30}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":30}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":30}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":21}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":25}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":6}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":79}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":34}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":61}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":5}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":18}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":29}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":7}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":48}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":37}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":32}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":15}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":40}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":52}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":13}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":38}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":66}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":13}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":38}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":65}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":13}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":38}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":50}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":13}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":76}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":12}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":42}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":52}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":37}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":33}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":33}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":33}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":44}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":19}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":6}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":3}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":34}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":27}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":25}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":20}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":8}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":46}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":47}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":7}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":66}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":30}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":47}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":5}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":70}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":14}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":51}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":70}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":8}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":7}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":28}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":54}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":5}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":3}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":39}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":28}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":28}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":20}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":9}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":27}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":39}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":28}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":24}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":53}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":42}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":54}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":30}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":9}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":77}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":22}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":100}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":8}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":21}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":24}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":81}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":14}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":8}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":5}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":3}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":0}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":30}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":27}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":25}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":37}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":20}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":30}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":34}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":26}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":30}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":49}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":35}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":49}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":47}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":61}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":37}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":6}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":76}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":42}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":27}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":25}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":34}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":20}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":30}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":32}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":26}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":30}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":49}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":35}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":51}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":51}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":52}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":6}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":76}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":3}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":38}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":27}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":25}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":34}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":20}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":30}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":32}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":26}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":30}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":49}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":35}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":37}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":51}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":52}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":6}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":76}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":39}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":27}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":28}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":28}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":20}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":30}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":32}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":26}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":30}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":22}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":51}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":40}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":52}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":23}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":6}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":76}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":3}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":0}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":43}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":22}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":14}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":20}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":59}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":3}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":52}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":36}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":3}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":362,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":362,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":362,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":362,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/pricing.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/pricing.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":68}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":79}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":20}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":23}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":35}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":19}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":32}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":65}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":20}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":79}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":77}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":70}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":65}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":60}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":16}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":16}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":59}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":65}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":59}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":49}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":56}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":13}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":20}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":41}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":4}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":40}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":4}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":13}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":20}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":38}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":60}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":61}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":63}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":54}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":19}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":68}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":80}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":13}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":21}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":20}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":13}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":23}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":41}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":21}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":41}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":45}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":73}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":83,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":83,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":83,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":83,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/pricing.module.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/pricing.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":57}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":81}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":89}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":75}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":72}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":54}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":35}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":28}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":25}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":24}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":28}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":32}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":25}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":29}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":29}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":29}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":29}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":29}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/pricing.service.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/pricing.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":47}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":20}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":23}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":35}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":81}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":89}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":75}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":72}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":29}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":60}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":14}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":35}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":61}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":61}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":69}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":55}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":53}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":6}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":71}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":23}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":29}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":30}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":24}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":28}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":32}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":6}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":11}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":13}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":13}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":15}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":29}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":32}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":33}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":26}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":46}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":80}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":13}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":13}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":30}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":77}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":26}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":67}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":72}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":71}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":79}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":45}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":41}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":5}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":75}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":61}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":53}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":69}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":61}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":65}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":67}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":6}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":28}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":58}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":17}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":12}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":8}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":63}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":31}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":8}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":80}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":74}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":5}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":33}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":37}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":17}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":15}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":13}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":13}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":24}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":25}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":21}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":23}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":44}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":52}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":54}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":37}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":7}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":18}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":3}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":69}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":31}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":30}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":31}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":34}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":36}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":6}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":37}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":62}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":12}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":23}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":23}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":27}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":3}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":66}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":27}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":17}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":6}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":80}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":20}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":17}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":6}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":61}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":21}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":17}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":21}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":6}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":12}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":72}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":64}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":34}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":6}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":3}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":63}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":28}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":18}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":21}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":21}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":6}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":11}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":15}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":17}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":16}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":14}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":17}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":14}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":32}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":50}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":56}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":73}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":69}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":77}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":25}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":35}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":31}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":18}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":7}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":0}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":52}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":24}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":23}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":71}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":12}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":65}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":65}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":12}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":14}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":12}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":57}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":49}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":49}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":6}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":3}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":34}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":21}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":23}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":18}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":30}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":68}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":45}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":14}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":17}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":19}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":40}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":8}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":35}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":16}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":7}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":3}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":33}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":37}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":20}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":71}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":57}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":3}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":28}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":22}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":24}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":14}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":30}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":25}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":28}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":28}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":29}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":31}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":6}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":32}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":50}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":56}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":60}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":25}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":35}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":17}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":7}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":31}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":14}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":29}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":24}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":27}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":27}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":30}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":28}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":30}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":8}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":5}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":52}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":24}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":68}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":20}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":64}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":10}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":24}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":48}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":34}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":34}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":32}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":37}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":35}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":32}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":27}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":31}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":65}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":31}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":12}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":30}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":34}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":68}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":34}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":12}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":35}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":35}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":32}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":38}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":36}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":32}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":28}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":32}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":66}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":32}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":12}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":31}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":35}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":69}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":35}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":12}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":28}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":29}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":72}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":12}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":51}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":43}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":6}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":30}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":40}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":41}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":51}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":14}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":44}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":12}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":12}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":40}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":57}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":63}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":63}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":69}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":65}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":69}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":6}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":3}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":34}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":41}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":71}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":61}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":38}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":7}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":71}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":3}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":364,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":364,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":364,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":364,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/algorithms/dynamic-pricing.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/algorithms/dynamic-pricing.algorithm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":38}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":69}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":21}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":19}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":19}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":23}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":74}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":5}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":74}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":18}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":46}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":76}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":61}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":38}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":22}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":23}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":30}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":30}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":30}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":29}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":29}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":60}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":31}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":23}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":30}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":30}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":29}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":30}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":35}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":30}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":12}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":35}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":69}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":17}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":36}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":11}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":70}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":8}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":22}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":66}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":76}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":43}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":63}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":3}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":18}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":28}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":28}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":13}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":57}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":73}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":34}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":22}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":17}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":29}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":17}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":29}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":18}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":29}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":17}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":29}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":12}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":17}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":3}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":113,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":113,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":113,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":113,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/algorithms/location-adjustment.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/algorithms/location-adjustment.algorithm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":31}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":19}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":20}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":23}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":28}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":32}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":22}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":1}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":42}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":73}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":74}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":5}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":27}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":25}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":33}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":35}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":26}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":8}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":6}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":5}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":36}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":8}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":19}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":14}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":26}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":33}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":36}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":6}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":26}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":32}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":35}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":25}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":8}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":19}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":14}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":26}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":33}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":36}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":25}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":8}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":6}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":57}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":56}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":24}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":76}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":8}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":5}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":72}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":32}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":6}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":39}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":80}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":76}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":41}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":6}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":65}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":31}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":6}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":27}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":30}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":35}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":32}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":23}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":51}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":71}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":78}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":57}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":3}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":69}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":35}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":35}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":35}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":35}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":73}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":37}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":37}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":36}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":36}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":70}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":25}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":3}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":66}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":36}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":34}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":35}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":34}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":16}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":35}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":22}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":22}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":13}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":50}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":50}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":27}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":17}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":5}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":58}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":36}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":37}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":37}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":37}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":15}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":3}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":77}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":19}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":63}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":65}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":13}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":47}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":47}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":49}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":28}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":27}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":61}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":17}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":46}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":37}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":3}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":63}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":78}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":56}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":182,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":182,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":182,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":182,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/algorithms/prediction.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/algorithms/prediction.algorithm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":64}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":65}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":35}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":23}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":27}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":67}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":36}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":24}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":68}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":8}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":58}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":6}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":64}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":6}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":32}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":57}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":72}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":20}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":6}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":21}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":25}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":26}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":45}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":51}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":55}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":58}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":32}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":50}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":58}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":62}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":65}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":12}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":61}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":53}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":16}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":31}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":37}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":41}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":45}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":8}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":6}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":35}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":23}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":44}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":59}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":52}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":80}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":32}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":10}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":59}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":6}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":49}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":38}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":35}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":23}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":44}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":32}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":47}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":17}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":37}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":47}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":15}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":58}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":45}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":45}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":45}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":8}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":39}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":47}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":63}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":8}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":34}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":24}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":64}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":28}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":52}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":7}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":44}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":20}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":65}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":29}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":66}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":43}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":3}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":74}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":23}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":59}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":43}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":20}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":80}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":26}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":60}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":10}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":30}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":50}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":58}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":26}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":70}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":74}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":49}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":3}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":42}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":35}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":27}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":27}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":44}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":69}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":67}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":63}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":48}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":28}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":43}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":48}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":48}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":49}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":31}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":75}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":55}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":27}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":49}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":3}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":51}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":18}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":24}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":28}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":53}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":46}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":51}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":68}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":58}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":72}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":27}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":27}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":31}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":63}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":8}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":6}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":35}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":62}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":6}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":35}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":67}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":6}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":23}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":39}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":11}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":52}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":34}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":3}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":30}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":62}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":13}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":43}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":50}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":57}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":8}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":6}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":30}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":77}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":39}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":67}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":66}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":0}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":44}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":230,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":230,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":230,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":230,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/algorithms/time-pricing.algorithm.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/algorithms/time-pricing.algorithm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":35}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":66}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":54}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":37}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":33}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":36}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":66}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":69}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":70}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":62}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":51}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":59}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":32}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":40}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":17}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":41}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":41}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":17}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":41}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":40}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":17}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":15}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":63}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":45}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":17}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":17}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":33}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":15}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":59}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":34}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":31}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":36}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":17}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":41}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":44}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":17}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":59}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":18}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":75}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":18}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":5}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":15}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":42}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":37}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":33}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":36}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":45}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":65}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":45}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":37}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":33}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":34}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":35}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":22}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":23}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":13}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":67}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":75}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":60}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":66}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":37}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":34}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":29}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":13}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":14}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":13}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":14}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":13}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":14}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":13}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":13}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":14}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":14}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":15}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":6}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":41}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":3}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":75}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":37}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":36}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":45}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":14}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":30}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":31}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":8}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":12}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":27}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":29}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":6}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":3}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":35}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":27}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":25}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":51}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":46}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":31}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":31}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":31}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":33}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":15}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":152,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":152,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":152,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":152,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/dto/calculate-price.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/dto/calculate-price.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":12}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":6}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":6}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":41}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":24}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":18}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":28}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":32}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":13}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":9}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":19}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":15}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":34}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":13}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":14}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":38}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":9}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":11}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":38}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":1}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":35}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":13}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":21}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":13}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":21}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":13}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":15}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":13}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":15}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":13}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":22}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":1}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":33}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":13}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":21}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":25}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":13}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":9}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":10}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":21}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":15}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":9}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":15}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":13}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":9}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":26}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":109,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":109,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":109,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":109,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/pricing/entities/price-history.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/pricing/entities/price-history.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":33}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":27}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":33}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":11}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":11}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":11}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":11}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":11}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":11}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":11}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":28}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":29}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":29}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":27}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":25}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":29}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":23}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":70}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":10}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":63,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":63,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":63,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":63,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/risk/risk-management.module.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/risk-management.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":61}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":73}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":80}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":76}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":77}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":66}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":83}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":56}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":42}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":25}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":22}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":25}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":36}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":36}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":36}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/risk/assessment/risk-assessor.service.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/assessment/risk-assessor.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":62}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":11}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":12}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":36}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":65}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":37}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":68}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":6}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":41}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":20}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":81}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":6}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":71}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":52}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":24}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":53}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":49}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":43}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":26}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":27}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":26}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":62}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":34}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":7}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":71}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":108}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":6}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":27}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":41}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":25}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":68}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":36}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":27}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":79}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":27}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":51}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":14}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":32}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":72}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":14}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":70}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":14}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":31}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":71}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":14}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":14}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":48}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":34}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":47}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":50}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":48}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":30}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":35}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":41}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":22}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":50}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":36}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":27}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":22}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":41}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":57}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":45}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":21}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":67}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":47}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":36}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":27}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":28}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":22}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":41}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":64}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":65}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":79}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":10}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":47}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":3}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":41}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":27}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":22}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":46}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":69}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":45}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":47}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":39}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":27}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":44}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":62}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":39}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":47}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":3}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":40}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":27}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":22}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":45}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":71}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":41}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":47}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":42}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":25}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":23}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":22}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":33}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":24}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":25}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":43}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":41}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":14}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":28}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":55}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":48}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":39}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":41}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":52}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":46}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":45}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":14}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":30}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":45}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":42}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":48}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":43}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":55}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":14}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":5}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":37}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":27}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":47}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":44}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":14}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":27}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":43}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":46}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":14}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":32}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":39}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":42}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":14}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":30}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":50}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":47}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":14}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":31}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":42}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":45}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":14}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":5}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":12}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":14}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":26}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":64}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":6}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":3}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":67}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":24}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":25}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":25}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":28}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":25}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":26}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":24}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":30}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":26}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":14}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":25}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":5}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":3}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":75}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":41}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":29}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":35}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":7}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":3}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":29}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":15}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":37}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":37}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":54}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":62}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":9,"16":9,"17":9,"18":1,"19":1,"20":4,"21":4,"22":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"30":4,"31":4,"32":4,"33":4,"34":4,"35":4,"36":4,"37":4,"38":4,"39":4,"40":4,"41":4,"42":4,"43":4,"44":4,"45":4,"46":4,"47":4,"48":4,"49":4,"50":4,"51":4,"52":4,"53":4,"54":4,"55":4,"56":1,"57":1,"58":6,"59":6,"60":6,"61":6,"62":6,"63":6,"64":6,"65":6,"66":6,"67":6,"68":3,"69":3,"70":6,"71":2,"72":2,"73":2,"74":2,"75":2,"76":6,"77":1,"78":1,"79":6,"80":0,"81":0,"82":6,"83":0,"84":0,"85":6,"86":6,"87":6,"88":6,"89":6,"90":6,"91":0,"92":0,"93":0,"94":0,"95":1,"96":1,"97":4,"98":4,"99":4,"100":4,"101":4,"102":4,"103":1,"104":1,"105":3,"106":3,"107":3,"108":3,"109":3,"110":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":1,"117":1,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":1,"149":1,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":1,"158":1,"159":4,"160":4,"161":4,"162":4,"163":4,"164":4,"165":4,"166":4,"167":4,"168":4,"169":4,"170":0,"171":0,"172":0,"173":0,"174":4,"175":0,"176":0,"177":0,"178":0,"179":0,"180":4,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":4,"188":4,"189":4,"190":4,"191":4,"192":2,"193":2,"194":2,"195":4,"196":1,"197":1,"198":1,"199":4,"200":1,"201":1,"202":1,"203":4,"204":0,"205":0,"206":0,"207":4,"208":0,"209":0,"210":0,"211":4,"212":4,"213":4,"214":4,"215":4,"216":4,"217":4,"218":4,"219":1,"220":1,"221":4,"222":4,"223":4,"224":4,"225":0,"226":4,"227":0,"228":4,"229":0,"230":4,"231":0,"232":4,"233":4,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":2},"end":{"line":18,"column":6}},"locations":[{"start":{"line":15,"column":2},"end":{"line":18,"column":6}}]},"1":{"type":"branch","line":20,"loc":{"start":{"line":20,"column":2},"end":{"line":56,"column":3}},"locations":[{"start":{"line":20,"column":2},"end":{"line":56,"column":3}}]},"2":{"type":"branch","line":58,"loc":{"start":{"line":58,"column":2},"end":{"line":95,"column":3}},"locations":[{"start":{"line":58,"column":2},"end":{"line":95,"column":3}}]},"3":{"type":"branch","line":68,"loc":{"start":{"line":68,"column":6},"end":{"line":70,"column":14}},"locations":[{"start":{"line":68,"column":6},"end":{"line":70,"column":14}}]},"4":{"type":"branch","line":71,"loc":{"start":{"line":71,"column":6},"end":{"line":76,"column":14}},"locations":[{"start":{"line":71,"column":6},"end":{"line":76,"column":14}}]},"5":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":6},"end":{"line":79,"column":14}},"locations":[{"start":{"line":77,"column":6},"end":{"line":79,"column":14}}]},"6":{"type":"branch","line":80,"loc":{"start":{"line":80,"column":6},"end":{"line":82,"column":14}},"locations":[{"start":{"line":80,"column":6},"end":{"line":82,"column":14}}]},"7":{"type":"branch","line":83,"loc":{"start":{"line":83,"column":6},"end":{"line":85,"column":14}},"locations":[{"start":{"line":83,"column":6},"end":{"line":85,"column":14}}]},"8":{"type":"branch","line":86,"loc":{"start":{"line":86,"column":6},"end":{"line":87,"column":22}},"locations":[{"start":{"line":86,"column":6},"end":{"line":87,"column":22}}]},"9":{"type":"branch","line":92,"loc":{"start":{"line":92,"column":-1},"end":{"line":95,"column":3}},"locations":[{"start":{"line":92,"column":-1},"end":{"line":95,"column":3}}]},"10":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":10},"end":{"line":103,"column":3}},"locations":[{"start":{"line":97,"column":10},"end":{"line":103,"column":3}}]},"11":{"type":"branch","line":105,"loc":{"start":{"line":105,"column":10},"end":{"line":116,"column":3}},"locations":[{"start":{"line":105,"column":10},"end":{"line":116,"column":3}}]},"12":{"type":"branch","line":110,"loc":{"start":{"line":110,"column":33},"end":{"line":110,"column":49}},"locations":[{"start":{"line":110,"column":33},"end":{"line":110,"column":49}}]},"13":{"type":"branch","line":110,"loc":{"start":{"line":110,"column":49},"end":{"line":110,"column":56}},"locations":[{"start":{"line":110,"column":49},"end":{"line":110,"column":56}}]},"14":{"type":"branch","line":111,"loc":{"start":{"line":111,"column":27},"end":{"line":111,"column":37}},"locations":[{"start":{"line":111,"column":27},"end":{"line":111,"column":37}}]},"15":{"type":"branch","line":111,"loc":{"start":{"line":111,"column":37},"end":{"line":111,"column":44}},"locations":[{"start":{"line":111,"column":37},"end":{"line":111,"column":44}}]},"16":{"type":"branch","line":118,"loc":{"start":{"line":118,"column":10},"end":{"line":130,"column":3}},"locations":[{"start":{"line":118,"column":10},"end":{"line":130,"column":3}}]},"17":{"type":"branch","line":123,"loc":{"start":{"line":123,"column":55},"end":{"line":123,"column":63}},"locations":[{"start":{"line":123,"column":55},"end":{"line":123,"column":63}}]},"18":{"type":"branch","line":124,"loc":{"start":{"line":124,"column":57},"end":{"line":124,"column":64}},"locations":[{"start":{"line":124,"column":57},"end":{"line":124,"column":64}}]},"19":{"type":"branch","line":132,"loc":{"start":{"line":132,"column":10},"end":{"line":139,"column":3}},"locations":[{"start":{"line":132,"column":10},"end":{"line":139,"column":3}}]},"20":{"type":"branch","line":159,"loc":{"start":{"line":159,"column":10},"end":{"line":219,"column":3}},"locations":[{"start":{"line":159,"column":10},"end":{"line":219,"column":3}}]},"21":{"type":"branch","line":170,"loc":{"start":{"line":170,"column":6},"end":{"line":174,"column":14}},"locations":[{"start":{"line":170,"column":6},"end":{"line":174,"column":14}}]},"22":{"type":"branch","line":175,"loc":{"start":{"line":175,"column":6},"end":{"line":180,"column":14}},"locations":[{"start":{"line":175,"column":6},"end":{"line":180,"column":14}}]},"23":{"type":"branch","line":181,"loc":{"start":{"line":181,"column":6},"end":{"line":187,"column":14}},"locations":[{"start":{"line":181,"column":6},"end":{"line":187,"column":14}}]},"24":{"type":"branch","line":192,"loc":{"start":{"line":192,"column":6},"end":{"line":195,"column":14}},"locations":[{"start":{"line":192,"column":6},"end":{"line":195,"column":14}}]},"25":{"type":"branch","line":196,"loc":{"start":{"line":196,"column":6},"end":{"line":199,"column":14}},"locations":[{"start":{"line":196,"column":6},"end":{"line":199,"column":14}}]},"26":{"type":"branch","line":200,"loc":{"start":{"line":200,"column":6},"end":{"line":203,"column":14}},"locations":[{"start":{"line":200,"column":6},"end":{"line":203,"column":14}}]},"27":{"type":"branch","line":204,"loc":{"start":{"line":204,"column":6},"end":{"line":207,"column":14}},"locations":[{"start":{"line":204,"column":6},"end":{"line":207,"column":14}}]},"28":{"type":"branch","line":208,"loc":{"start":{"line":208,"column":6},"end":{"line":211,"column":14}},"locations":[{"start":{"line":208,"column":6},"end":{"line":211,"column":14}}]},"29":{"type":"branch","line":221,"loc":{"start":{"line":221,"column":10},"end":{"line":234,"column":3}},"locations":[{"start":{"line":221,"column":10},"end":{"line":234,"column":3}}]},"30":{"type":"branch","line":225,"loc":{"start":{"line":225,"column":6},"end":{"line":226,"column":25}},"locations":[{"start":{"line":225,"column":6},"end":{"line":226,"column":25}}]},"31":{"type":"branch","line":227,"loc":{"start":{"line":227,"column":6},"end":{"line":228,"column":24}},"locations":[{"start":{"line":227,"column":6},"end":{"line":228,"column":24}}]},"32":{"type":"branch","line":229,"loc":{"start":{"line":229,"column":6},"end":{"line":230,"column":26}},"locations":[{"start":{"line":229,"column":6},"end":{"line":230,"column":26}}]},"33":{"type":"branch","line":231,"loc":{"start":{"line":231,"column":6},"end":{"line":232,"column":25}},"locations":[{"start":{"line":231,"column":6},"end":{"line":232,"column":25}}]},"34":{"type":"branch","line":236,"loc":{"start":{"line":236,"column":2},"end":{"line":241,"column":3}},"locations":[{"start":{"line":236,"column":2},"end":{"line":241,"column":3}}]},"35":{"type":"branch","line":243,"loc":{"start":{"line":243,"column":2},"end":{"line":249,"column":3}},"locations":[{"start":{"line":243,"column":2},"end":{"line":249,"column":3}}]}},"b":{"0":[9],"1":[4],"2":[6],"3":[3],"4":[2],"5":[1],"6":[0],"7":[0],"8":[0],"9":[0],"10":[4],"11":[3],"12":[2],"13":[1],"14":[2],"15":[1],"16":[2],"17":[0],"18":[0],"19":[1],"20":[4],"21":[0],"22":[0],"23":[0],"24":[2],"25":[1],"26":[1],"27":[0],"28":[0],"29":[4],"30":[0],"31":[0],"32":[0],"33":[0],"34":[1],"35":[1]},"fnMap":{"0":{"name":"RiskAssessorService","decl":{"start":{"line":15,"column":2},"end":{"line":18,"column":6}},"loc":{"start":{"line":15,"column":2},"end":{"line":18,"column":6}},"line":15},"1":{"name":"assessRisk","decl":{"start":{"line":20,"column":2},"end":{"line":56,"column":3}},"loc":{"start":{"line":20,"column":2},"end":{"line":56,"column":3}},"line":20},"2":{"name":"calculateRiskLevel","decl":{"start":{"line":58,"column":2},"end":{"line":95,"column":3}},"loc":{"start":{"line":58,"column":2},"end":{"line":95,"column":3}},"line":58},"3":{"name":"calculateRiskScore","decl":{"start":{"line":97,"column":10},"end":{"line":103,"column":3}},"loc":{"start":{"line":97,"column":10},"end":{"line":103,"column":3}},"line":97},"4":{"name":"calculateMarketRisk","decl":{"start":{"line":105,"column":10},"end":{"line":116,"column":3}},"loc":{"start":{"line":105,"column":10},"end":{"line":116,"column":3}},"line":105},"5":{"name":"calculateCreditRisk","decl":{"start":{"line":118,"column":10},"end":{"line":130,"column":3}},"loc":{"start":{"line":118,"column":10},"end":{"line":130,"column":3}},"line":118},"6":{"name":"calculateOperationalRisk","decl":{"start":{"line":132,"column":10},"end":{"line":139,"column":3}},"loc":{"start":{"line":132,"column":10},"end":{"line":139,"column":3}},"line":132},"7":{"name":"calculateLiquidityRisk","decl":{"start":{"line":141,"column":10},"end":{"line":148,"column":3}},"loc":{"start":{"line":141,"column":10},"end":{"line":148,"column":3}},"line":141},"8":{"name":"calculateRegulatoryRisk","decl":{"start":{"line":150,"column":10},"end":{"line":157,"column":3}},"loc":{"start":{"line":150,"column":10},"end":{"line":157,"column":3}},"line":150},"9":{"name":"generateMitigationActions","decl":{"start":{"line":159,"column":10},"end":{"line":219,"column":3}},"loc":{"start":{"line":159,"column":10},"end":{"line":219,"column":3}},"line":159},"10":{"name":"getImplementationTimeline","decl":{"start":{"line":221,"column":10},"end":{"line":234,"column":3}},"loc":{"start":{"line":221,"column":10},"end":{"line":234,"column":3}},"line":221},"11":{"name":"getRiskAssessment","decl":{"start":{"line":236,"column":2},"end":{"line":241,"column":3}},"loc":{"start":{"line":236,"column":2},"end":{"line":241,"column":3}},"line":236},"12":{"name":"updateRiskAssessment","decl":{"start":{"line":243,"column":2},"end":{"line":249,"column":3}},"loc":{"start":{"line":243,"column":2},"end":{"line":249,"column":3}},"line":243}},"f":{"0":9,"1":4,"2":6,"3":4,"4":3,"5":2,"6":1,"7":0,"8":0,"9":4,"10":4,"11":1,"12":1}} +,"/workspaces/CurrentDao-backend/src/risk/calculations/var-calculator.service.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/calculations/var-calculator.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":62}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":35}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":66}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":68}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":6}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":66}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":87}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":6}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":28}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":24}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":62}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":14}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":62}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":25}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":62}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":14}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":14}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":68}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":50}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":60}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":31}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":72}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":40}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":68}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":124}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":12}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":21}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":79}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":6}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":39}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":30}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":22}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":60}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":47}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":75}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":45}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":56}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":24}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":18}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":6}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":38}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":41}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":54}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":39}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":47}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":6}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":54}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":34}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":69}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":58}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":12}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":27}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":16}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":17}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":18}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":43}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":20}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":34}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":27}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":85}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":8}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":16}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":52}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":64}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":60}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":60}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":8}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":6}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":3}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":39}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":30}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":22}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":60}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":31}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":65}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":45}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":57}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":49}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":46}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":31}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":71}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":48}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":73}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":69}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":58}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":15}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":16}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":17}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":18}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":19}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":13}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":15}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":31}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":25}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":8}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":31}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":25}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":33}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":8}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":16}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":13}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":19}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":39}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":8}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":6}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":3}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":39}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":30}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":22}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":11}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":18}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":18}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":26}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":15}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":31}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":65}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":45}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":57}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":39}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":58}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":11}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":17}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":18}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":6}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":29}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":43}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":54}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":39}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":49}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":6}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":56}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":69}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":58}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":12}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":28}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":15}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":16}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":17}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":18}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":19}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":13}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":19}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":37}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":31}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":8}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":20}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":31}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":38}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":27}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":8}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":51}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":63}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":65}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":61}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":8}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":6}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":3}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":78}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":47}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":61}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":33}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":69}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":35}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":103}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":19}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":3}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":74}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":55}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":29}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":29}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":72}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":33}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":3}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":34}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":22}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":24}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":15}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":57}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":40}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":61}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":28}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":45}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":40}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":7}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":41}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":5}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":26}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":3}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":49}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":42}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":21}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":17}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":18}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":18}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":18}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":18}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":18}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":19}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":6}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":40}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":3}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":34}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":17}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":23}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":24}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":15}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":42}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":43}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":26}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":45}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":67}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":7}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":41}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":28}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":73}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":34}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":60}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":50}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":3}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":52}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":71}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":3}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":58}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":45}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":71}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":20}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":73}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":31}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":3}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":56}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":45}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":57}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":43}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":45}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":6}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":76}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":3}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":56}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":45}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":57}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":49}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":45}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":6}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":12}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":76}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":6}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":59}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":24}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":17}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":29}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":32}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":30}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":46}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":47}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":52}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":23}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":3}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":59}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":61}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":12}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":65}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":65}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":66}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":65}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":66}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":66}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":66}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":6}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":3}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":56}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":52}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":54}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":55}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":65}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":52}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":54}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":49}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":56}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":49}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":49}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":3}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":37}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":24}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":35}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":22}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":44}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":75}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":67}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":59}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":56}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":0}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":76}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":3}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":0}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":28}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":24}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":35}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":35}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":49}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":75}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":48}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":0}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":21}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":42}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":31}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":19}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":7}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":5}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":59}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":12}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":15}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":50}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":17}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":54}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":47}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":17}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":33}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":36}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":8}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":6}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":3}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":0}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":32}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":21}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":25}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":31}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":13}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":61}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":53}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":0}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":33}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":0}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":38}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":14}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":9}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":67}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":35}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":71}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":0}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":55}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":40}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":3}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":0}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":55}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":44}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":54}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":53}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":3}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":0}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":38}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":24}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":35}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":20}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":66}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":29}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":35}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":7}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":0}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":26}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":13}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":5}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":0}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":61}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":38}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":45}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":7}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":3}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":0}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":26}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":24}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":23}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":24}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":35}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":75}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":0}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":73}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":44}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":0}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":35}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":41}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":20}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":19}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":20}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":15}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":66}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":8}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":0}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":56}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":5}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":0}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":12}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":18}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":17}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":18}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":14}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":19}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":78}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":79}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":41}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":56}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":10}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":59}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":8}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":6}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":3}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":0}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":55}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":75}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":70}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":77}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":3}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":0}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":70}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":45}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":45}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":46}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":0}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":55}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":28}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":38}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":38}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":39}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":6}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":0}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":59}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":30}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":12}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":0}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":88}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":3}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":527,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":527,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":527,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":527,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/risk/controller/risk-management.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/controller/risk-management.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":6}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":7}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":13}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":10}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":15}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":11}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":11}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":74}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":81}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":77}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":78}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":67}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":8}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":20}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":16}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":36}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":39}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":14}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":62}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":68}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":68}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":64}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":58}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":6}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":26}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":71}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":16}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":58}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":76}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":66}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":66}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":33}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":75}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":65}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":66}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":4}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":70}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":67}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":27}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":79}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":16}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":16}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":61}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":67}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":69}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":12}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":46}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":45}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":6}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":39}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":26}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":78}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":65}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":16}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":16}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":61}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":67}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":66}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":68}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":27}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":26}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":71}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":16}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":16}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":57}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":71}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":73}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":42}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":69}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":65}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":16}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":62}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":79}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":79}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":3}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":38}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":26}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":71}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":65}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":16}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":58}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":4}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":30}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":46}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":32}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":5}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":61}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":18}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":6}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":24}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":77}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":16}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":16}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":58}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":57}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":58}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":3}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":34}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":79}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":65}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":13}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":23}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":48}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":20}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":4}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":13}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":24}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":40}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":20}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":4}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":16}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":65}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":4}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":26}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":46}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":51}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":51}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":5}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":55}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":18}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":17}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":18}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":22}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":73}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":16}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":16}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":54}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":4}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":61}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":63}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":3}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":29}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":75}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":16}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":62}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":4}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":32}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":57}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":3}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":27}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":26}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":68}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":16}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":54}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":4}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":62}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":42}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":3}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":32}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":71}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":65}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":62}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":4}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":69}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":46}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":3}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":16}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":54}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":13}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":21}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":44}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":4}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":13}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":42}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":20}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":4}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":16}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":16}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":54}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":4}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":22}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":41}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":47}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":5}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":49}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":3}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":25}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":64}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":16}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":63}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":4}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":33}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":36}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":3}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":0}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":68}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":75}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":74}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":0}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":24}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":18}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":17}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":30}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":31}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":16}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":23}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":72}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":70}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":22}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":15}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":13}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":10}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":71}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":22}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":80}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":11}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":27}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":71}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":24}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":12}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":8}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":61}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":6}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":22}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":3}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":72}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":11}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":21}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":20}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":25}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":24}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":27}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":62}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":73}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":74}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":44}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":20}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":59}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":9}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":7}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":44}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":77}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":68}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":12}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":30}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":17}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":60}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":58}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":73}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":72}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":8}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":15}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":60}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":22}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":52}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":8}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":59}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":54}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":6}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":3}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":26}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":22}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":25}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":24}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":71}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":20}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":7}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":16}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":35}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":25}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":31}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":49}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":30}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":28}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":8}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":7}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":16}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":35}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":27}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":27}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":39}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":30}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":27}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":8}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":6}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":32}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":0}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":19}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":45}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":47}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":8}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":5}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":0}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":22}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":45}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":53}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":8}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":5}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":0}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":26}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":3}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":54}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":12}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":27}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":27}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":29}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":24}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":24}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":33}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":31}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":30}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":6}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":3}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":77}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":12}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":26}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":26}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":50}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":77}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":24}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":42}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":44}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":8}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":30}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":6}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":3}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":0}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":72}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":72}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":12}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":57}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":17}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":9}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":30}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":47}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":43}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":53}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":10}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":9}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":27}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":59}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":43}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":53}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":10}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":8}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":6}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":3}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":411,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":411,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":411,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":411,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/risk/dto/risk-assessment.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/dto/risk-assessment.dto.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":6}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":6}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":12}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":10}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":22}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":20}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":28}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":10}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":13}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":11}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":15}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":32}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":22}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":9}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":17}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":25}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":13}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":22}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":15}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":26}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":15}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":27}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":32}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":13}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":15}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":13}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":12}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":12}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":13}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":9}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":10}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":33}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":33}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":13}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":13}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":9}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":9}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":21}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":13}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":13}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":9}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":11}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":15}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":13}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":28}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":28}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":13}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":22}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":12}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":22}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":15}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":13}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":12}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":11}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":26}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":15}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":13}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":26}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":1}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":32}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":13}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":22}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":13}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":12}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":12}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":13}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":10}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":22}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":54}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":54}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":15}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":13}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":11}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":23}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":1}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":13}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":22}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":54}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":59}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":15}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":12}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":28}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":15}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":13}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":34}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1},"branchMap":{"0":{"type":"branch","line":13,"loc":{"start":{"line":13,"column":0},"end":{"line":19,"column":1}},"locations":[{"start":{"line":13,"column":0},"end":{"line":19,"column":1}}]},"1":{"type":"branch","line":21,"loc":{"start":{"line":21,"column":0},"end":{"line":26,"column":1}},"locations":[{"start":{"line":21,"column":0},"end":{"line":26,"column":1}}]}},"b":{"0":[1],"1":[1]},"fnMap":{},"f":{}} +,"/workspaces/CurrentDao-backend/src/risk/entities/risk-data.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/entities/risk-data.entity.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":20}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":29}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":33}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":35}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":75}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":74}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":19}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":78}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":24}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":55}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":53}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":55}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":28}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":60}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":27}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":33}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":43}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":18}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":43}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":18}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1},"branchMap":{},"b":{},"fnMap":{},"f":{}} +,"/workspaces/CurrentDao-backend/src/risk/hedging/hedging-strategy.service.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/hedging/hedging-strategy.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":62}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":64}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":37}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":68}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":68}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":6}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":80}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":75}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":6}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":75}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":67}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":17}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":15}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":6}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":59}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":29}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":42}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":15}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":11}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":90}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":70}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":62}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":6}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":45}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":49}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":20}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":140}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":27}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":47}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":22}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":79}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":79}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":73}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":22}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":24}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":69}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":17}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":72}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":73}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":27}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":64}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":30}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":27}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":61}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":47}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":75}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":56}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":12}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":27}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":22}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":24}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":39}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":40}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":6}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":69}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":67}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":54}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":52}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":28}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":80}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":75}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":12}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":76}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":72}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":42}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":54}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":42}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":68}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":26}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":63}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":72}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":77}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":67}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":38}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":50}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":49}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":54}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":3}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":43}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":29}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":64}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":37}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":58}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":44}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":64}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":42}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":47}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":43}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":3}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":75}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":49}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":54}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":41}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":42}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":21}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":3}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":46}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":35}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":21}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":22}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":53}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":60}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":65}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":36}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":6}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":61}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":27}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":6}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":42}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":53}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":11}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":6}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":30}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":25}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":23}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":21}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":27}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":60}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":3}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":71}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":21}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":19}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":20}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":21}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":18}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":6}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":39}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":67}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":53}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":55}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":55}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":13}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":3}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":73}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":30}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":70}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":62}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":68}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":12}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":23}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":19}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":22}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":67}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":23}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":104}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":6}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":3}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":63}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":53}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":46}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":23}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":29}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":26}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":30}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":27}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":6}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":93}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":3}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":0}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":59}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":66}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":53}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":33}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":17}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":17}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":18}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":6}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":32}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":18}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":18}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":19}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":17}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":6}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":12}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":49}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":44}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":6}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":62}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":53}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":46}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":61}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":51}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":54}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":3}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":79}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":12}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":15}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":9}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":25}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":31}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":18}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":36}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":45}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":42}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":12}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":10}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":9}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":33}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":28}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":18}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":49}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":38}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":35}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":12}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":10}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":9}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":30}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":30}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":18}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":51}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":40}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":42}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":12}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":10}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":8}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":18}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":31}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":23}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":29}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":29}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":8}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":14}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":28}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":25}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":21}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":27}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":8}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":6}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":3}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":75}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":12}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":50}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":16}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":30}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":24}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":25}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":32}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":28}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":8}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":15}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":40}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":33}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":40}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":34}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":8}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":18}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":53}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":50}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":64}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":8}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":6}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":50}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":24}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":28}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":20}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":66}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":29}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":35}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":7}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":26}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":13}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":5}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":61}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":22}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":7}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":3}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":74}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":20}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":69}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":6}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":60}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":29}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":35}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":7}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":49}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":65}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":5}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":31}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":59}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":76}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":73}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":0}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":12}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":18}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":26}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":28}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":23}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":74}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":30}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":6}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":3}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":45}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":24}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":22}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":77}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":56}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":57}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":3}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":0}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":74}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":68}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":72}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":69}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":46}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":3}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":0}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":30}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":24}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":24}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":22}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":80}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":0}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":78}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":57}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":22}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":18}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":6}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":80}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":12}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":18}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":40}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":23}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":18}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":28}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":6}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":3}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":42}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":24}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":22}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":60}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":29}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":35}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":7}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":43}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":3}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":0}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":33}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":28}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":24}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":22}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":12}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":25}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":21}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":31}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":26}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":56}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":9}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":32}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":22}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":10}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":8}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":6}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":443,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":443,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":443,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":443,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/risk/monitoring/real-time-monitor.service.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/monitoring/real-time-monitor.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":62}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":37}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":68}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":75}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":18}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":4}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":37}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":68}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":6}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":74}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":11}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":18}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":34}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":22}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":20}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":68}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":51}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":37}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":72}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":46}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":34}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":20}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":8}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":14}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":56}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":28}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":60}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":63}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":19}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":30}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":51}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":74}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":5}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":33}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":24}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":24}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":34}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":9}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":35}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":29}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":71}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":28}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":77}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":15}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":7}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":39}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":30}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":58}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":55}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":22}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":20}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":32}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":56}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":25}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":33}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":8}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":57}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":61}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":7}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":45}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":49}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":36}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":17}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":22}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":32}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":9}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":52}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":24}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":73}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":8}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":66}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":33}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":25}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":69}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":10}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":7}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":21}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":24}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":64}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":14}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":8}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":3}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":0}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":34}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":24}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":37}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":44}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":29}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":35}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":42}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":24}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":42}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":80}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":49}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":76}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":54}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":74}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":37}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":24}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":24}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":22}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":43}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":79}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":69}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":52}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":83}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":66}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":75}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":3}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":73}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":41}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":60}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":50}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":59}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":47}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":48}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":18}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":18}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":18}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":6}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":40}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":3}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":43}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":36}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":69}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":71}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":71}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":36}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":24}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":25}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":14}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":23}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":23}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":6}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":52}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":65}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":54}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":14}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":24}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":41}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":29}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":8}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":5}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":50}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":14}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":24}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":37}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":25}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":8}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":44}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":14}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":24}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":37}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":55}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":8}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":5}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":0}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":23}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":25}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":22}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":6}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":3}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":33}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":24}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":20}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":20}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":21}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":113}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":6}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":72}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":48}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":23}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":18}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":39}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":36}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":28}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":66}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":6}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":0}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":34}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":41}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":3}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":66}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":73}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":71}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":34}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":24}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":20}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":20}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":66}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":29}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":35}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":7}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":26}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":13}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":5}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":69}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":3}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":38}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":45}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":51}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":53}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":62}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":0}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":49}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":59}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":3}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":0}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":58}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":41}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":55}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":3}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":45}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":24}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":20}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":53}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":21}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":18}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":51}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":60}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":68}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":64}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":61}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":6}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":0}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":74}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":6}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":3}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":71}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":43}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":30}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":3}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":0}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":75}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":47}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":30}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":3}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":73}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":37}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":28}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":3}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":0}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":69}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":41}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":28}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":3}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":35}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":21}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":69}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":30}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":5}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":37}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":3}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":341,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":341,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":341,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":341,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/risk/testing/stress-test.service.ts": {"path":"/workspaces/CurrentDao-backend/src/risk/testing/stress-test.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":62}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":59}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":32}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":63}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":68}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":6}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":70}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":72}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":6}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":37}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":35}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":9}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":45}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":26}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":6}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":31}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":53}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":59}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":34}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":37}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":8}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":38}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":39}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":65}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":34}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":37}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":8}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":78}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":75}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":24}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":48}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":80}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":120}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":6}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":28}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":24}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":28}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":22}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":69}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":64}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":23}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":26}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":56}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":25}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":25}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":14}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":33}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":62}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":25}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":25}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":10}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":29}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":59}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":25}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":25}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":10}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":35}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":64}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":25}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":19}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":25}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":10}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":14}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":27}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":57}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":25}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":19}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":25}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":10}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":14}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":30}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":60}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":25}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":14}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":33}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":63}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":25}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":19}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":10}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":14}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":31}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":61}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":25}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":19}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":10}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":14}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":33}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":63}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":25}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":25}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":10}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":14}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":22}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":53}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":25}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":19}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":25}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":10}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":14}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":14}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":57}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":25}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":19}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":25}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":12}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":15}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":24}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":63}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":62}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":6}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":34}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":24}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":27}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":22}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":69}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":64}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":59}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":71}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":63}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":65}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":59}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":67}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":24}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":20}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":21}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":18}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":7}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":12}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":25}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":35}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":70}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":39}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":48}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":37}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":9}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":80}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":6}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":3}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":36}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":27}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":21}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":28}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":22}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":71}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":63}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":40}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":27}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":85}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":87}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":91}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":54}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":6}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":12}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":22}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":20}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":83}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":71}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":73}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":6}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":3}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":42}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":27}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":21}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":28}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":22}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":72}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":54}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":0}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":34}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":78}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":30}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":105}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":54}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":12}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":22}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":17}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":19}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":46}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":33}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":33}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":6}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":39}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":27}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":21}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":28}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":22}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":80}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":75}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":65}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":35}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":29}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":54}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":60}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":60}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":56}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":6}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":12}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":22}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":22}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":45}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":72}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":6}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":3}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":44}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":27}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":21}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":28}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":22}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":80}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":78}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":66}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":36}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":30}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":55}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":61}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":91}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":6}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":12}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":22}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":23}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":45}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":33}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":6}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":3}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":37}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":27}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":21}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":28}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":22}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":86}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":72}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":65}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":41}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":27}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":60}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":59}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":58}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":60}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":6}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":12}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":22}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":46}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":43}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":39}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":6}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":3}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":0}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":40}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":27}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":21}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":28}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":22}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":78}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":71}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":89}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":12}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":22}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":36}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":38}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":42}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":35}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":6}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":3}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":0}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":43}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":27}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":21}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":28}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":22}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":77}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":81}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":64}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":12}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":22}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":46}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":45}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":45}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":48}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":35}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":6}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":3}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":41}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":27}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":21}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":28}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":22}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":76}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":77}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":0}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":66}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":12}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":22}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":44}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":44}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":49}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":35}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":6}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":3}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":0}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":43}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":27}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":21}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":28}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":22}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":73}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":63}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":12}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":22}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":24}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":63}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":61}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":65}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":8}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":45}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":50}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":6}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":3}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":0}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":33}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":27}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":21}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":28}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":22}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":75}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":63}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":12}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":22}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":22}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":63}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":63}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":68}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":68}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":66}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":8}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":44}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":43}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":6}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":3}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":0}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":37}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":27}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":21}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":21}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":28}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":22}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":44}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":63}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":12}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":22}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":15}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":45}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":27}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":6}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":3}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":0}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":80}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":24}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":0}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":56}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":38}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":64}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":7}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":5}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":0}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":23}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":3}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":0}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":32}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":21}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":28}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":13}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":53}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":78}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":53}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":3}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":0}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":69}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":68}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":0}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":43}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":39}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":41}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":17}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":3}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":0}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":64}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":68}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":0}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":27}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":31}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":26}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":27}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":24}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":6}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":51}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":3}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":0}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":79}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":53}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":46}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":42}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":6}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":77}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":0}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":12}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":46}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":20}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":74}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":50}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":46}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":48}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":64}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":15}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":44}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":60}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":15}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":66}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":6}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":3}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":0}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":65}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":43}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":21}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":72}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":0}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":49}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":37}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":8}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":50}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":6}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":39}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":3}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":0}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":50}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":22}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":24}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":41}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":54}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":0}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":53}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":53}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":76}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":6}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":0}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":39}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":27}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":69}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":8}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":27}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":63}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":8}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":5}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":0}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":49}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":72}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":6}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":0}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":35}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":79}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":27}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":63}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":8}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":5}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":0}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":36}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":47}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":68}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":6}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":58}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":30}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":6}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":61}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":33}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":6}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":0}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":24}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":65}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":65}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":5}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":0}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":24}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":64}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":62}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":5}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":0}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":27}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":64}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":66}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":5}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":0}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":27}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":3}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":0}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":73}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":34}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":60}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":50}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":3}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":0}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":74}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":46}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":12}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":19}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":22}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":17}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":16}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":6}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":3}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":0}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":45}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":24}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":30}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":20}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":66}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":29}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":35}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":7}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":0}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":26}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":13}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":5}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":0}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":61}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":42}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":7}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":3}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":0}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":49}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":12}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":28}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":9}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":31}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":62}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":41}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":28}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":10}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":9}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":38}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":65}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":41}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":34}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":10}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":9}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":34}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":60}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":41}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":28}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":10}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":9}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":40}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":60}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":41}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":34}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":10}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":9}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":32}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":60}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":41}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":28}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":10}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":9}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":35}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":60}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":40}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":34}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":10}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":9}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":38}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":57}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":40}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":32}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":10}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":9}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":36}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":56}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":40}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":34}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":10}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":9}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":38}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":63}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":41}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":28}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":10}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":9}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":27}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":46}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":41}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":33}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":10}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":8}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":24}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":79}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":21}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":24}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":30}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":26}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":27}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":24}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":10}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":8}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":6}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":3}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":695,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":695,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":695,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":695,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/scheduler.module.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/scheduler.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":63}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":54}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":56}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":69}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":73}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":9}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":45}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":30}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":4}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":37}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":14}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":22}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":4}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":50}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":2}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":27,"column":31}},"locations":[{"start":{"line":1,"column":0},"end":{"line":27,"column":31}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":27,"column":31}},"loc":{"start":{"line":1,"column":0},"end":{"line":27,"column":31}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/scheduler.service.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/scheduler.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":75}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":10}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":14}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":16}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":41}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":34}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":63}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":54}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":56}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":35}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":22}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":21}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":22}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":38}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":46}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":37}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":17}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":13}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":55}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":62}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":58}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":34}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":14}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":70}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":44}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":58}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":58}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":50}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":52}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":24}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":57}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":75}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":66}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":68}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":36}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":66}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":39}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":20}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":76}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":52}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":32}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":24}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":71}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":75}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":74}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":26}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":24}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":24}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":28}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":28}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":28}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":30}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":8}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":7}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":39}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":63}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":65}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":65}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":20}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":3}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":23}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":41}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":20}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":45}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":43}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":71}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":0}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":30}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":77}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":42}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":40}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":64}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":5}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":67}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":50}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":22}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":3}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":21}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":37}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":20}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":30}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":75}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":36}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":59}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":45}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":57}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":61}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":68}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":55}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":7}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":59}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":48}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":28}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":48}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":25}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":10}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":52}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":7}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":78}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":16}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":3}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":64}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":45}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":43}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":78}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":30}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":65}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":53}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":20}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":69}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":0}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":61}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":33}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":35}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":9}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":66}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":16}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":41}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":14}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":46}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":33}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":8}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":71}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":21}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":23}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":14}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":46}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":29}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":8}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":64}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":18}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":3}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":18}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":20}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":20}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":28}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":45}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":43}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":71}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":5}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":45}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":72}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":5}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":37}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":45}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":25}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":28}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":26}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":13}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":48}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":7}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":69}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":78}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":24}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":3}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":22}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":39}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":20}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":63}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":77}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":32}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":51}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":52}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":32}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":46}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":58}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":8}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":59}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":31}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":9}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":73}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":59}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":44}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":9}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":5}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":79}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":65}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":48}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":9}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":5}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":75}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":55}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":40}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":9}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":5}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":0}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":52}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":43}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":38}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":35}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":33}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":56}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":42}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":39}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":0}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":47}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":27}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":30}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":36}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":15}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":40}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":9}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":0}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":69}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":35}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":39}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":5}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":21}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":69}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":6}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":12}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":38}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":19}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":6}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":3}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":29}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":20}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":63}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":32}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":63}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":58}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":64}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":14}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":30}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":36}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":8}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":7}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":43}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":38}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":36}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":61}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":36}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":39}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":38}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":39}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":85}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":49}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":29}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":32}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":38}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":17}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":42}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":11}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":71}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":37}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":41}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":7}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":5}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":33}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":30}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":20}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":67}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":6}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":12}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":38}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":19}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":6}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":3}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":51}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":25}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":18}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":17}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":18}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":6}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":79}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":0}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":21}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":70}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":5}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":0}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":23}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":78}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":5}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":25}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":57}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":33}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":9}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":5}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":21}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":53}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":32}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":9}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":5}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":26}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":59}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":35}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":9}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":5}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":0}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":46}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":71}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":5}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":0}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":31}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":67}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":55}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":9}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":5}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":32}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":68}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":57}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":9}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":5}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":39}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":57}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":33}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":9}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":5}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":0}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":46}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":71}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":47}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":9}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":5}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":0}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":47}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":48}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":53}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":33}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":51}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":36}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":0}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":40}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":0}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":63}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":12}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":11}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":12}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":11}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":12}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":6}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":3}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":0}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":58}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":59}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":27}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":34}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":7}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":0}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":15}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":48}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":5}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":0}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":15}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":3}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":52}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":45}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":53}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":0}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":67}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":49}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":5}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":0}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":12}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":20}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":21}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":21}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":25}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":27}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":35}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":35}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":33}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":33}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":6}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":3}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":0}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":58}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":11}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":16}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":17}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":18}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":18}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":20}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":17}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":27}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":27}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":42}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":71}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":41}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":45}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":9}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":41}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":45}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":9}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":41}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":47}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":9}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":41}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":44}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":9}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":78}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":7}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":0}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":50}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":58}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":0}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":72}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":78}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":0}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":12}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":16}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":17}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":18}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":18}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":20}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":17}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":23}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":18}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":17}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":21}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":27}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":6}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":3}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":0}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":36}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":45}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":31}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":13}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":5}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":0}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":9}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":66}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":16}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":36}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":25}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":33}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":44}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":10}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":56}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":53}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":9}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":0}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":38}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":51}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":40}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":9}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":7}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":21}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":64}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":5}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":3}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":0}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":39}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":45}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":9}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":66}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":16}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":36}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":92}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":10}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":9}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":0}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":38}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":38}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":21}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":33}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":32}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":37}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":37}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":10}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":0}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":52}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":7}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":0}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":35}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":73}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":7}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":21}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":65}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":5}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":3}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":0}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":55}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":51}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":0}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":24}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":7}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":28}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":55}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":34}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":60}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":35}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":31}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":26}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":46}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":8}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":7}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":29}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":55}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":35}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":60}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":35}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":31}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":26}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":47}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":8}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":6}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":0}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":41}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":69}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":62}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":9}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":0}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":25}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":56}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":23}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":36}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":25}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":69}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":59}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":24}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":30}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":23}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":27}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":30}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":12}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":20}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":30}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":28}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":28}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":32}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":32}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":32}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":34}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":12}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":11}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":0}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":52}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":69}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":7}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":5}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":3}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":0}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":53}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":50}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":0}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":64}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":43}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":7}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":0}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":36}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":66}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":50}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":0}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":39}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":38}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":21}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":49}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":32}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":37}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":37}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":10}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":0}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":52}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":25}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":74}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":10}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":7}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":5}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":3}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":0}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":75}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":76}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":18}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":5}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":0}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":67}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":49}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":7}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":0}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":42}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":50}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":21}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":7}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":5}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":0}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":16}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":3}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":0}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":67}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":49}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":0}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":51}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":65}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":33}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":9}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":5}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":0}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":18}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":3}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":0}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":75}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":53}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":0}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":56}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":66}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":28}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":9}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":5}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":0}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":18}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":3}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":0}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":66}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":57}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":45}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":26}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":7}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":0}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":36}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":0}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":34}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":63}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":8}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":6}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":35}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":3}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":0}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":56}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":66}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":55}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":49}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":3}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":0}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":66}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":27}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":0}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":9}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":51}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":17}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":24}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":22}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":24}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":8}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":0}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":66}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":65}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":61}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":75}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":0}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":63}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":21}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":23}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":63}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":14}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":8}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":18}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":5}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":3}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":0}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":60}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":20}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":19}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":20}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":27}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":6}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":27}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":53}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":0}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":23}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":24}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":0}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":17}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":32}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":53}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":0}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":31}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":47}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":61}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":12}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":31}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":58}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":0}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":28}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":49}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":7}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":0}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":37}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":41}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":5}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":0}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":12}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":13}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":15}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":16}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":49}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":6}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":3}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":816,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":816,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":816,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":816,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/controllers/scheduler.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/controllers/scheduler.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":6}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":6}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":7}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":12}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":10}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":8}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":10}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":14}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":11}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":56}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":70}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":8}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":19}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":20}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":14}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":35}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":64}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":28}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":34}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":56}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":60}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":6}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":50}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":16}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":31}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":46}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":23}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":4}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":16}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":35}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":36}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":47}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":28}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":79}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":29}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":54}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":16}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":31}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":47}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":25}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":45}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":30}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":77}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":14}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":65}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":16}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":26}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":47}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":46}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":48}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":50}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":60}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":61}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":46}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":48}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":45}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":16}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":26}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":46}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":23}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":78}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":50}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":64}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":48}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":18}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":52}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":16}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":44}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":23}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":78}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":50}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":18}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":28}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":49}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":28}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":48}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":9}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":24}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":6}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":57}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":16}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":45}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":4}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":78}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":50}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":59}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":48}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":3}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":21}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":26}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":54}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":16}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":26}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":46}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":4}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":78}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":50}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":18}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":28}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":38}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":19}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":28}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":74}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":3}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":26}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":57}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":26}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":50}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":4}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":78}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":50}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":62}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":51}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":67}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":16}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":26}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":56}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":4}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":22}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":47}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":19}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":19}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":79}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":3}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":27}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":61}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":16}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":26}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":45}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":4}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":60}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":68}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":3}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":17}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":53}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":16}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":26}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":50}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":4}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":36}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":55}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":3}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":30}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":70}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":16}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":26}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":55}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":4}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":74}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":71}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":58}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":3}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":37}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":57}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":16}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":26}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":56}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":4}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":74}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":72}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":59}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":3}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":38}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":55}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":16}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":26}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":56}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":4}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":74}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":21}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":36}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":35}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":70}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":22}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":40}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":60}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":16}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":26}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":60}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":4}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":74}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":26}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":36}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":34}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":77}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":24}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":3}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":41}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":60}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":16}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":26}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":60}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":4}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":74}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":27}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":36}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":35}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":79}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":25}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":3}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":26}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":55}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":16}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":26}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":62}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":4}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":62}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":58}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":3}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":29}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":60}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":16}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":26}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":57}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":4}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":47}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":54}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":3}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":39}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":68}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":16}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":26}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":63}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":4}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":56}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":66}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":22}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":3}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":45}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":72}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":16}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":26}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":45}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":4}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":74}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":30}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":36}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":44}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":19}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":55}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":80}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":3}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":0}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":43}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":69}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":16}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":45}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":4}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":74}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":29}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":36}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":44}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":38}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":55}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":76}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":13}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":20}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":6}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":28}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":3}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":46}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":71}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":16}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":26}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":51}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":4}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":74}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":78}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":20}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":36}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":33}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":24}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":54}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":64}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":3}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":45}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":72}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":16}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":26}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":59}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":4}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":74}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":50}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":27}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":36}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":32}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":19}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":35}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":71}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":3}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":59}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":16}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":26}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":56}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":4}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":30}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":49}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":20}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":17}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":27}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":23}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":31}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":6}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":70}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":65}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":0}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":59}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":26}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":5}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":59}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":27}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":5}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":12}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":13}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":28}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":14}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":75}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":38}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":74}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":6}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":3}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":0}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":16}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":66}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":16}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":26}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":49}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":4}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":30}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":16}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":25}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":21}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":19}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":6}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":33}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":11}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":20}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":22}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":22}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":24}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":21}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":6}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":13}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":26}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":23}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":24}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":6}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":6}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":70}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":80}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":0}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":43}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":78}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":12}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":18}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":24}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":33}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":16}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":8}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":30}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":13}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":33}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":37}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":37}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":41}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":35}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":8}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":15}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":40}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":68}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":69}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":8}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":6}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":3}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":0}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":30}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":62}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":16}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":26}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":58}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":4}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":27}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":53}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":19}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":43}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":12}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":20}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":34}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":56}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":6}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":3}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":0}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":28}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":54}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":16}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":26}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":61}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":4}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":46}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":65}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":12}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":34}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":34}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":21}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":6}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":3}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":477,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":477,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":477,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":477,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/dto/schedule-trade.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/dto/schedule-trade.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":10}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":11}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":15}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":6}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":6}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":67}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":8}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":10}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":14}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":16}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":42}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":34}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":55}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":15}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":13}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":20}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":44}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":18}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":49}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":15}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":23}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":45}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":19}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":46}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":15}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":1}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":33}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":23}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":25}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":22}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":24}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":15}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":21}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":23}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":22}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":32}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":24}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":13}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":13}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":23}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":25}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":22}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":1}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":31}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":65}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":15}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":20}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":12}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":22}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":53}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":19}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":20}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":23}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":16}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":5}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":1}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":32}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":41}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":15}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":13}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":10}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":39}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":15}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":13}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":9}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":11}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":18}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":38}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":15}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":13}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":9}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":29}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":1}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":28}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":41}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":15}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":14}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":15}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":14}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":24}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":63}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":15}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":17}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":19}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":40}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":15}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":13}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":9}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":19}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":42}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":15}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":14}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":26}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":41}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":22}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":4}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":41}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":47}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":1}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":31}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":51}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":13}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":15}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":79}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":15}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":13}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":23}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":67}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":18}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":16}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":72}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":15}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":22}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":46}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":13}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":25}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":55}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":17}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":22}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":24}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":15}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":13}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":21}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":26}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":21}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":21}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":37}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":4}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":24}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":24}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":47}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":4}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":15}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":24}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":32}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":38}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":15}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":13}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":9}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":10}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":22}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":40}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":15}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":13}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":11}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":22}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":40}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":15}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":13}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":10}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":12}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":26}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":15}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":19}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":34}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":41}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":24}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":15}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":19}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":31}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":34}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":24}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":15}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":19}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":33}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":37}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":24}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":15}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":19}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":32}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":37}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":24}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":15}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":19}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":28}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":29}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":72}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":15}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":12}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":27}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":18}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":41}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":15}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":14}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":28}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":55}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":15}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":13}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":20}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":1}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":32}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":62}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":15}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":13}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":16}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":58}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":15}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":13}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":23}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":76}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":15}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":22}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":25}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":54}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":15}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":13}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":26}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":63}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":15}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":17}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":23}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":24}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":15}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":13}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":35}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":42}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":15}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":14}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":21}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":38}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":15}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":13}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":9}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":10}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":22}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":40}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":15}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":13}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":10}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":12}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":26}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":1}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":0}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":30}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":47}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":12}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":33}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":31}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":27}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":0}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":60}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":15}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":13}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":21}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":0}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":80}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":15}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":13}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":28}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":41}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":15}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":14}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":32}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":39}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":15}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":13}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":9}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":11}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":28}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":1}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":31}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":58}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":13}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":17}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":24}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":50}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":19}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":4}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":15}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":50}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":51}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":24}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":59}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":4}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":15}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":12}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":34}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":23}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":0}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":24}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":59}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":4}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":15}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":12}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":38}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":29}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":65}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":15}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":12}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":27}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":20}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":0}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":42}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":15}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":14}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":25}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":63}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":15}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":17}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":21}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":1}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":26}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":41}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":15}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":18}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":17}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":0}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":24}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":11}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":16}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":16}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":18}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":15}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":18}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":17}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":6}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":4}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":15}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":11}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":14}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":14}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":16}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":13}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":16}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":15}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":4}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":18}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":0}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":45}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":15}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":22}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":25}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":0}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":48}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":15}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":13}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":16}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":0}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":48}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":15}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":13}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":21}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":0}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":58}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":15}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":12}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":27}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":18}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":0}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":63}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":15}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":17}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":26}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":63}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":15}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":17}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":27}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":0}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":41}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":15}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":14}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":21}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":0}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":42}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":15}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":14}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":28}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":0}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":38}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":15}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":13}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":9}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":16}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":39}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":15}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":13}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":9}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":11}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":17}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":0}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":24}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":61}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":27}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":4}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":15}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":61}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":18}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":0}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":65}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":15}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":26}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":29}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":492,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":492,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":492,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":492,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/entities/scheduled-job.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/entities/scheduled-job.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":21}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":38}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":28}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":30}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":30}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":32}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":32}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":42}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":26}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":10}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":13}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":11}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":15}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":27}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":26}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":46}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":36}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":36}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":27}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":13}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":26}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":22}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":11}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":18}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":11}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":17}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":20}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":31}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":20}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":11}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":22}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":32}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":27}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":25}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":53}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":20}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":67}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":69}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":68}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":68}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":43}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":21}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":23}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":21}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":37}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":4}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":43}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":11}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":15}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":20}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":28}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":22}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":43}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":10}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":18}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":20}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":23}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":23}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":23}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":4}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":11}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":17}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":24}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":47}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":31}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":46}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":21}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":46}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":21}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":11}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":24}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":20}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":13}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":19}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":4}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":22}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":52}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":25}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":43}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":21}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":22}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":20}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":25}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":21}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":4}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":43}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":17}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":22}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":24}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":55}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":21}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":25}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":25}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":18}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":7}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":4}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":43}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":18}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":17}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":23}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":25}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":27}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":24}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":6}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":17}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":23}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":25}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":27}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":24}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":34}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":6}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":15}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":23}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":25}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":27}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":24}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":6}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":4}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":43}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":12}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":27}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":25}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":25}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":29}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":29}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":29}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":31}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":31}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":4}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":43}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":15}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":22}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":25}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":21}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":27}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":48}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":4}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":43}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":19}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":23}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":20}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":31}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":4}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":49}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":21}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":49}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":21}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":50}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":22}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":56}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":27}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":60}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":31}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":77}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":28}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":43}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":21}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":20}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":19}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":20}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":20}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":31}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":26}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":18}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":5}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":43}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":17}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":47}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":20}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":52}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":23}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":0}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":56}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":27}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":48}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":19}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":0}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":43}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":43}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":18}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":272,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":272,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":272,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":272,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/jobs/maintenance.job.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/jobs/maintenance.job.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":56}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":59}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":42}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":72}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":36}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":17}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":21}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":22}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":12}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":64}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":76}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":65}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":51}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":13}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":60}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":35}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":70}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":56}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":44}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":34}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":51}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":66}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":9}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":66}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":37}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":36}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":25}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":44}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":10}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":56}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":9}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":37}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":63}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":15}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":7}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":78}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":46}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":7}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":65}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":45}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":50}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":61}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":9}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":62}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":49}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":61}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":5}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":34}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":51}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":62}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":9}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":64}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":50}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":21}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":62}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":5}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":78}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":33}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":74}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":9}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":57}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":28}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":23}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":58}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":73}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":59}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":50}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":8}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":46}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":70}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":32}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":66}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":16}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":35}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":73}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":16}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":29}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":67}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":16}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":33}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":63}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":16}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":29}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":66}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":73}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":67}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":63}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":16}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":16}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":73}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":7}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":47}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":40}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":10}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":8}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":44}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":44}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":10}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":8}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":40}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":22}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":19}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":23}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":46}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":16}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":8}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":50}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":22}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":137}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":8}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":20}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":21}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":51}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":67}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":61}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":23}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":23}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":26}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":23}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":22}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":18}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":60}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":75}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":61}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":52}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":10}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":8}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":5}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":3}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":64}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":33}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":32}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":22}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":9}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":52}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":0}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":41}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":68}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":46}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":71}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":70}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":0}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":36}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":68}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":44}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":69}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":68}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":36}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":66}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":45}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":70}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":69}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":78}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":21}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":59}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":54}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":5}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":12}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":27}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":35}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":13}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":39}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":6}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":3}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":71}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":33}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":32}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":22}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":9}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":59}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":34}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":63}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":41}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":75}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":32}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":61}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":39}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":68}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":26}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":64}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":39}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":0}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":22}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":70}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":8}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":21}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":66}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":61}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":5}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":12}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":34}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":35}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":16}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":13}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":39}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":6}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":3}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":65}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":33}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":32}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":22}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":9}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":60}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":22}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":41}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":42}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":38}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":36}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":39}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":8}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":35}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":20}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":27}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":46}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":16}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":46}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":77}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":9}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":7}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":22}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":126}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":8}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":21}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":60}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":55}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":5}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":12}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":28}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":35}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":16}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":13}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":39}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":6}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":3}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":61}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":33}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":32}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":9}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":59}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":23}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":45}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":42}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":47}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":8}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":37}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":29}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":22}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":54}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":16}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":22}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":73}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":12}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":9}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":7}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":22}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":70}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":8}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":21}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":64}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":59}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":5}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":0}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":12}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":32}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":35}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":16}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":13}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":39}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":6}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":3}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":0}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":71}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":33}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":32}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":22}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":9}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":59}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":39}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":41}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":41}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":20}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":0}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":22}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":70}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":8}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":21}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":66}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":61}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":5}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":12}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":34}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":35}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":16}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":13}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":39}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":6}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":3}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":50}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":20}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":23}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":6}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":34}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":66}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":0}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":52}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":27}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":15}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":55}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":17}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":0}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":12}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":36}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":75}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":6}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":3}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":52}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":20}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":23}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":6}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":34}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":66}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":0}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":52}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":27}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":15}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":55}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":45}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":79}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":8}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":17}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":0}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":12}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":36}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":79}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":6}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":3}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":0}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":49}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":20}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":23}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":6}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":68}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":41}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":12}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":17}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":20}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":6}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":3}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":0}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":75}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":9}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":61}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":36}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":30}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":21}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":69}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":30}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":5}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":3}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":0}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":50}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":20}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":21}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":6}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":9}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":44}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":36}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":43}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":21}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":56}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":44}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":5}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":3}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":0}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":74}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":9}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":46}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":36}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":28}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":21}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":68}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":28}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":5}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":3}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":48}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":17}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":20}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":19}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":6}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":9}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":46}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":48}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":21}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":71}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":5}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":3}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":49}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":17}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":20}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":19}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":6}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":9}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":67}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":45}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":9}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":49}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":21}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":72}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":5}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":3}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":0}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":45}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":17}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":20}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":19}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":6}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":9}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":45}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":45}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":43}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":66}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":0}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":36}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":16}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":25}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":24}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":69}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":10}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":7}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":0}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":46}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":21}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":69}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":5}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":3}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":0}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":43}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":17}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":20}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":19}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":6}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":9}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":36}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":34}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":50}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":21}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":73}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":5}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":3}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":0}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":46}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":17}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":20}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":19}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":6}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":9}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":47}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":34}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":52}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":21}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":75}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":5}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":3}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":0}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":52}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":17}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":21}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":19}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":6}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":9}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":66}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":67}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":45}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":9}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":66}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":44}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":9}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":0}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":22}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":97}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":8}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":57}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":21}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":80}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":5}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":3}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":0}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":49}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":17}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":21}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":19}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":6}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":9}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":45}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":22}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":83}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":8}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":54}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":21}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":77}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":5}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":3}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":0}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":54}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":17}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":21}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":19}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":6}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":9}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":48}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":54}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":59}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":21}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":14}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":35}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":23}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":29}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":8}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":5}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":3}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":0}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":68}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":52}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":39}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":55}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":33}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":32}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":28}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":48}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":30}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":19}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":41}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":8}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":55}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":20}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":41}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":24}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":19}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":23}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":26}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":8}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":7}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":0}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":55}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":3}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":0}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":69}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":52}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":40}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":71}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":33}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":32}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":26}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":53}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":30}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":19}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":41}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":26}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":8}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":55}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":20}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":37}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":24}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":19}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":23}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":26}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":8}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":7}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":0}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":55}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":3}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":0}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":32}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":22}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":22}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":20}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":24}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":31}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":0}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":39}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":33}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":5}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":0}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":48}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":3}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":0}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":36}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":22}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":30}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":20}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":73}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":33}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":18}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":30}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":27}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":44}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":37}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":37}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":6}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":0}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":21}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":21}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":26}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":24}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":24}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":28}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":28}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":28}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":30}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":8}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":0}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":33}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":25}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":33}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":12}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":33}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":5}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":0}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":59}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":34}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":66}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":0}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":8}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":43}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":57}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":7}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":58}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":5}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":0}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":62}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":58}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":5}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":0}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":65}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":53}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":37}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":5}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":0}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":48}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":3}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":0}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":33}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":22}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":15}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":26}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":20}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":21}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":34}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":33}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":17}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":29}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":25}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":28}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":33}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":33}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":6}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":0}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":32}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":59}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":42}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":38}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":36}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":5}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":0}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":48}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":3}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":0}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":51}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":79}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":3}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":0}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":49}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":29}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":16}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":25}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":26}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":21}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":28}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":6}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":0}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":61}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":51}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":44}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":6}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":3}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":0}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":59}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":82}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":22}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":0}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":32}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":35}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":18}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":14}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":45}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":60}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":14}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":40}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":43}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":14}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":40}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":26}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":14}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":14}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":26}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":5}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":0}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":58}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":38}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":0}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":47}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":3}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":0}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":57}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":27}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":0}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":51}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":50}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":69}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":39}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":22}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":58}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":54}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":58}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":34}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":62}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":8}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":41}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":24}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":5}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":0}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":26}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":57}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":3}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":0}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":47}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":63}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":44}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":37}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":15}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":7}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":0}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":40}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":45}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":50}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":13}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":28}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":39}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":58}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":24}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":0}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":12}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":38}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":74}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":41}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":50}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":73}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":6}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":3}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":0}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":69}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":63}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":14}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":35}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":34}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":23}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":8}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":36}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":7}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":0}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":40}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":3}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":862,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":862,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":862,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":862,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/jobs/settlement.job.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/jobs/settlement.job.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":56}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":59}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":42}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":14}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":17}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":26}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":28}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":5}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":25}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":12}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":33}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":28}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":59}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":14}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":35}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":70}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":28}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":56}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":44}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":39}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":54}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":71}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":9}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":66}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":36}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":36}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":25}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":33}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":44}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":10}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":56}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":9}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":37}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":62}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":7}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":77}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":38}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":45}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":7}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":64}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":76}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":73}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":9}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":57}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":75}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":49}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":55}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":31}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":33}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":34}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":30}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":11}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":7}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":55}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":50}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":51}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":139}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":8}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":20}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":51}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":66}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":61}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":65}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":31}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":32}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":28}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":9}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":3}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":34}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":32}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":44}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":49}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":23}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":67}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":12}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":53}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":40}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":25}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":32}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":33}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":9}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":56}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":36}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":38}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":9}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":59}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":7}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":43}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":24}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":103}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":7}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":62}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":14}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":22}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":38}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":30}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":44}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":26}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":46}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":24}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":8}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":21}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":14}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":23}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":26}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":28}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":11}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":34}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":33}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":52}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":12}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":10}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":23}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":26}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":46}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":18}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":31}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":33}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":34}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":30}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":8}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":40}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":22}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":32}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":33}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":54}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":39}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":36}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":22}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":20}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":25}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":12}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":24}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":21}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":27}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":29}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":30}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":26}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":9}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":71}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":22}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":73}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":8}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":43}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":13}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":66}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":39}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":48}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":69}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":73}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":75}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":67}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":70}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":25}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":34}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":30}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":33}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":52}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":38}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":13}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":73}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":9}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":7}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":77}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":53}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":0}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":14}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":16}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":22}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":26}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":20}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":39}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":46}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":16}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":8}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":21}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":14}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":23}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":22}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":26}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":20}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":72}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":46}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":16}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":8}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":5}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":3}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":70}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":44}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":14}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":9}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":42}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":51}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":47}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":10}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":9}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":42}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":51}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":50}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":10}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":8}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":36}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":18}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":44}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":7}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":3}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":0}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":52}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":12}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":50}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":50}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":59}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":61}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":55}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":57}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":6}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":3}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":0}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":34}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":17}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":19}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":65}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":33}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":30}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":37}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":51}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":8}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":0}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":32}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":35}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":31}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":58}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":50}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":30}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":7}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":62}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":51}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":7}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":66}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":14}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":16}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":8}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":52}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":44}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":49}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":29}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":7}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":43}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":52}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":37}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":44}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":0}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":51}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":29}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":30}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":32}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":25}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":56}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":35}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":9}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":32}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":48}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":14}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":31}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":0}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":22}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":26}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":29}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":43}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":37}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":39}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":26}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":29}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":25}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":8}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":77}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":20}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":7}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":3}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":75}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":64}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":48}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":67}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":43}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":39}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":97}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":9}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":7}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":5}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":0}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":51}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":30}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":3}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":0}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":76}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":65}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":0}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":52}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":43}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":0}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":30}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":3}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":46}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":17}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":17}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":22}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":49}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":65}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":0}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":25}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":22}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":71}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":8}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":0}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":59}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":51}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":54}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":62}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":32}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":5}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":0}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":22}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":3}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":54}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":12}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":75}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":6}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":3}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":0}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":74}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":63}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":0}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":80}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":0}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":27}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":51}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":36}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":59}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":55}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":41}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":51}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":115}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":32}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":5}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":3}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":0}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":47}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":17}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":18}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":17}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":20}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":79}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":3}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":0}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":32}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":22}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":22}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":20}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":24}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":31}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":0}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":39}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":33}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":5}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":0}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":48}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":3}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":0}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":36}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":22}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":29}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":20}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":73}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":33}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":18}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":30}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":27}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":44}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":50}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":37}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":6}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":0}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":21}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":21}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":26}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":24}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":24}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":28}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":28}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":28}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":30}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":8}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":0}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":33}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":25}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":33}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":12}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":33}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":5}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":0}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":59}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":34}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":66}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":0}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":8}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":43}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":57}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":7}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":58}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":5}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":0}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":62}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":58}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":5}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":0}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":65}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":53}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":37}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":5}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":48}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":3}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":0}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":33}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":22}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":15}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":26}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":20}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":21}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":34}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":33}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":17}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":29}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":25}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":28}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":33}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":33}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":6}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":0}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":32}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":59}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":42}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":38}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":36}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":5}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":0}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":48}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":3}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":0}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":51}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":79}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":3}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":0}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":49}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":29}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":16}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":25}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":26}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":21}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":28}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":30}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":6}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":0}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":61}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":51}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":44}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":6}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":3}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":0}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":59}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":81}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":22}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":0}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":32}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":35}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":18}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":14}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":45}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":60}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":14}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":40}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":43}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":14}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":40}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":26}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":14}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":14}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":26}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":5}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":0}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":57}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":38}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":0}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":47}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":3}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":0}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":57}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":27}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":89}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":0}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":70}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":38}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":5}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":0}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":19}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":3}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":0}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":66}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":27}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":0}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":9}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":51}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":17}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":24}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":22}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":8}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":0}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":66}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":47}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":0}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":54}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":17}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":24}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":8}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":0}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":68}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":68}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":0}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":63}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":21}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":23}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":63}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":14}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":8}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":51}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":5}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":3}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":0}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":76}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":64}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":37}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":35}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":0}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":48}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":0}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":20}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":96}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":6}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":3}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":0}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":61}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":27}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":67}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":0}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":9}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":44}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":71}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":0}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":51}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":17}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":24}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":8}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":0}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":72}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":0}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":55}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":27}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":68}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":10}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":7}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":0}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":24}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":21}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":23}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":70}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":14}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":8}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":82}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":5}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":3}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":0}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":23}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":21}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":28}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":30}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":22}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":20}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":25}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":22}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":7}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":24}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":26}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":17}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":23}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":12}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":14}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":20}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":24}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":18}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":70}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":20}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":14}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":6}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":3}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":0}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":51}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":47}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":3}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":0}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":59}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":59}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":27}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":7}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":0}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":15}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":59}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":5}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":0}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":58}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":47}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":37}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":16}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":7}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":0}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":45}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":44}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":53}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":8}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":6}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":29}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":43}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":51}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":18}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":75}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":12}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":9}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":19}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":27}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":0}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":12}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":20}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":21}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":25}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":27}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":35}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":35}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":26}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":21}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":20}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":84}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":8}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":6}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":3}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":755,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":755,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":755,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":755,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/jobs/trade-execution.job.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/jobs/trade-execution.job.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":56}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":49}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":8}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":16}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":42}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":14}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":17}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":39}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":28}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":5}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":25}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":15}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":63}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":14}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":35}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":70}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":28}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":56}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":44}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":6}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":36}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":49}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":66}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":9}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":66}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":16}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":41}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":36}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":25}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":33}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":44}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":10}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":56}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":9}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":67}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":7}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":22}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":67}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":40}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":7}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":69}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":75}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":33}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":68}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":9}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":57}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":75}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":49}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":76}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":41}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":59}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":50}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":51}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":22}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":127}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":8}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":20}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":51}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":61}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":61}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":65}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":29}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":9}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":3}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":38}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":36}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":44}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":39}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":57}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":12}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":48}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":3}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":35}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":20}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":36}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":33}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":9}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":56}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":31}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":38}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":9}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":54}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":7}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":47}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":46}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":9}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":24}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":74}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":10}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":7}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":66}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":14}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":22}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":35}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":25}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":26}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":46}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":24}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":8}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":21}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":14}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":23}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":28}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":23}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":11}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":20}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":33}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":52}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":12}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":10}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":26}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":46}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":42}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":8}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":3}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":35}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":36}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":33}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":54}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":41}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":31}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":22}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":20}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":25}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":12}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":9}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":61}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":16}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":40}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":49}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":10}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":38}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":24}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":36}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":9}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":0}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":76}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":0}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":42}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":13}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":70}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":41}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":71}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":25}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":29}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":30}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":33}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":52}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":13}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":74}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":9}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":7}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":74}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":48}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":14}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":21}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":23}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":46}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":18}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":63}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":10}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":8}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":21}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":14}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":23}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":24}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":21}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":69}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":46}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":42}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":8}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":5}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":3}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":38}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":17}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":19}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":65}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":32}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":27}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":37}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":8}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":45}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":54}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":51}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":29}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":30}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":42}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":25}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":55}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":34}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":9}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":32}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":59}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":75}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":22}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":26}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":29}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":45}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":36}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":62}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":8}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":0}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":76}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":7}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":3}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":0}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":42}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":17}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":17}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":20}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":46}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":72}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":29}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":32}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":57}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":47}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":14}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":56}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":7}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":32}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":5}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":3}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":37}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":17}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":18}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":17}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":20}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":79}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":3}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":0}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":32}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":20}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":24}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":31}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":39}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":33}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":48}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":3}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":0}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":36}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":22}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":33}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":20}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":73}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":33}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":18}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":30}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":27}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":44}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":45}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":37}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":6}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":0}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":21}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":21}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":26}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":24}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":24}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":28}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":28}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":28}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":30}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":8}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":33}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":25}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":33}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":12}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":33}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":5}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":59}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":34}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":66}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":8}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":43}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":57}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":7}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":58}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":5}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":62}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":58}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":5}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":65}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":53}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":37}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":5}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":48}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":3}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":0}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":33}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":22}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":15}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":26}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":20}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":21}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":34}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":33}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":17}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":29}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":25}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":28}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":33}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":33}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":6}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":32}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":59}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":42}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":38}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":36}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":5}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":48}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":3}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":0}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":51}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":79}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":3}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":0}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":49}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":29}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":16}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":25}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":26}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":21}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":28}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":6}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":61}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":51}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":44}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":6}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":3}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":59}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":42}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":22}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":0}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":32}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":35}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":18}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":14}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":45}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":60}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":14}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":40}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":43}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":14}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":40}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":26}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":14}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":14}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":26}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":5}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":0}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":40}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":38}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":0}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":47}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":3}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":0}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":57}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":27}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":89}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":0}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":70}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":38}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":5}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":0}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":19}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":3}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":0}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":66}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":27}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":9}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":51}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":17}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":24}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":22}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":8}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":0}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":66}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":47}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":0}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":54}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":17}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":24}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":8}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":0}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":68}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":68}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":0}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":63}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":21}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":23}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":63}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":14}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":8}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":51}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":5}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":3}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":0}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":76}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":64}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":37}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":35}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":0}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":48}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":0}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":20}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":85}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":6}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":3}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":0}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":61}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":27}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":67}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":0}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":9}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":44}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":71}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":0}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":51}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":17}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":24}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":8}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":72}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":0}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":55}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":27}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":68}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":10}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":7}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":0}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":24}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":21}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":23}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":70}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":14}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":8}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":82}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":5}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":3}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":0}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":23}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":21}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":30}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":80}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":27}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":26}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":17}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":27}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":12}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":14}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":22}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":19}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":21}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":20}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":14}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":6}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":3}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":0}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":52}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":59}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":27}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":7}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":0}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":15}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":48}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":5}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":0}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":12}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":20}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":21}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":21}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":25}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":27}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":35}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":35}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":33}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":33}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":6}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":3}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":0}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":69}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":59}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":27}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":7}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":0}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":15}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":48}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":5}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":0}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":31}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":37}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":40}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":37}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":0}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":48}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":0}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":77}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":3}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":598,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":598,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":598,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":598,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/scheduler/services/market-hours.service.ts": {"path":"/workspaces/CurrentDao-backend/src/scheduler/services/market-hours.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":30}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":31}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":32}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":49}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":41}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":1}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":31}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":17}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":67}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":35}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":36}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":26}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":15}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":15}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":41}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":26}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":13}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":33}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":64}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":68}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":11}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":7}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":23}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":37}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":51}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":19}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":41}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":53}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":42}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":38}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":39}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":43}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":36}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":43}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":40}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":10}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":8}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":5}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":11}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":7}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":22}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":23}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":34}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":34}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":41}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":40}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":36}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":40}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":37}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":10}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":8}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":6}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":7}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":22}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":23}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":31}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":19}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":41}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":45}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":50}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":45}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":41}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":36}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":52}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":39}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":41}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":39}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":51}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":41}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":37}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":38}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":49}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":10}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":6}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":71}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":54}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":24}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":56}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":27}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":76}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":63}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":70}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":72}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":76}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":69}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":71}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":12}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":13}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":15}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":16}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":21}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":20}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":21}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":38}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":6}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":3}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":63}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":54}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":56}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":76}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":55}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":65}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":54}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":24}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":56}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":27}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":76}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":60}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":3}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":66}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":54}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":24}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":5}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":27}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":76}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":61}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":3}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":69}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":54}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":24}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":56}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":0}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":24}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":3}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":71}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":54}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":51}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":11}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":62}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":23}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":78}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":7}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":5}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":20}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":3}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":44}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":55}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":67}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":3}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":47}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":55}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":35}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":45}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":36}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":3}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":30}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":19}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":24}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":14}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":20}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":25}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":6}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":54}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":24}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":72}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":5}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":48}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":20}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":28}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":61}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":72}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":14}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":21}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":49}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":32}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":8}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":60}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":72}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":14}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":21}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":56}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":32}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":8}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":0}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":76}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":79}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":48}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":52}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":0}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":66}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":51}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":54}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":41}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":49}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":57}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":14}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":21}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":55}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":22}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":8}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":5}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":42}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":72}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":14}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":21}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":55}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":32}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":8}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":5}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":27}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":29}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":19}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":24}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":20}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":79}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":0}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":27}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":27}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":5}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":53}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":3}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":67}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":9}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":51}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":17}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":24}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":25}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":23}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":24}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":26}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":26}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":22}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":8}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":66}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":50}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":28}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":65}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":8}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":19}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":80}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":27}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":64}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":8}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":28}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":65}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":8}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":30}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":67}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":8}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":30}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":67}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":8}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":62}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":21}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":80}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":18}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":3}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":0}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":72}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":55}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":19}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":54}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":19}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":5}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":0}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":70}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":73}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":0}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":80}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":51}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":54}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":74}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":62}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":30}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":34}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":3}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":62}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":56}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":41}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":3}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":28}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":21}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":24}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":55}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":8}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":53}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":49}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":7}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":22}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":70}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":73}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":0}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":80}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":51}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":54}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":44}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":26}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":80}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":20}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":15}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":39}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":41}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":7}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":27}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":12}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":22}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":5}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":3}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":0}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":74}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":42}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":0}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":23}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":45}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":30}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":11}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":51}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":47}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":7}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":47}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":5}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":0}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":27}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":70}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":50}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":0}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":20}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":3}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":0}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":75}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":73}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":0}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":41}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":53}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":0}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":65}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":8}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":32}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":52}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":48}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":7}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":61}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":55}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":5}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":21}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":3}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":0}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":72}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":22}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":67}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":6}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":3}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":69}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":54}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":24}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":56}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":5}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":0}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":56}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":47}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":22}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":78}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":8}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":5}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":3}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":68}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":54}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":24}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":56}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":5}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":54}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":21}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":45}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":71}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":5}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":0}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":71}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":54}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":24}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":56}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":5}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":0}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":15}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":51}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":41}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":8}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":5}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":0}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":33}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":3}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":0}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":26}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":19}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":32}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":20}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":54}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":24}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":56}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":5}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":0}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":39}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":58}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":3}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":0}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":27}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":19}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":17}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":14}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":24}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":27}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":33}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":6}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":54}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":24}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":56}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":5}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":0}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":35}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":38}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":0}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":54}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":52}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":23}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":28}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":49}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":33}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":11}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":7}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":5}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":0}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":12}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":15}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":18}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":36}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":6}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":3}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":0}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":48}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":50}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":37}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":49}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":38}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":34}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":35}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":39}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":32}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":39}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":36}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":6}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":0}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":43}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":3}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":527,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":527,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":527,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":527,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/security.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/security/security.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":6}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":7}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":12}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":8}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":10}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":15}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":14}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":25}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":79}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":79}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":65}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":33}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":61}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":63}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":6}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":16}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":58}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":78}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":24}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":39}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":55}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":27}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":62}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":54}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":57}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":54}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":56}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":75}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":33}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":66}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":36}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":60}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":78}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":74}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":60}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":35}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":59}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":77}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":73}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":59}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":52}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":72}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":30}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":52}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":29}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":25}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":7}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":38}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":67}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":77}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":32}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":37}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":44}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":38}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":23}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":64}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":30}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":77}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":16}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":16}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":54}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":4}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":73}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":67}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":3}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":105,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":105,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":105,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":105,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/security.module.ts": {"path":"/workspaces/CurrentDao-backend/src/security/security.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":80}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":52}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":76}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":47}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":71}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":79}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":70}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":70}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":66}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":71}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":79}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":65}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":59}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":9}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":9}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":12}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":34}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":38}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":7}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":46}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":4}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":36}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":14}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":15}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":26}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":27}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":25}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":28}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":4}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":12}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":27}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":15}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":26}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":27}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":25}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":25}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":28}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":4}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":2}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":51}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":43}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":54}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":51,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/alerts/security-alert.service.ts": {"path":"/workspaces/CurrentDao-backend/src/security/alerts/security-alert.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":16}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":16}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":43}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":31}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":18}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":15}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":26}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":31}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":33}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":52}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":18}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":35}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":66}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":42}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":56}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":35}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":24}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":37}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":33}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":31}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":56}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":34}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":47}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":66}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":40}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":44}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":11}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":40}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":23}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":78}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":36}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":7}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":30}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":67}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":76}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":40}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":47}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":11}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":33}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":59}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":18}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":61}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":18}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":23}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":59}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":18}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":63}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":18}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":9}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":23}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":72}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":7}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":5}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":3}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":36}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":25}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":32}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":44}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":34}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":52}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":22}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":78}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":75}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":8}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":55}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":22}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":71}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":68}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":8}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":57}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":23}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":22}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":49}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":9}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":45}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":45}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":23}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":24}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":52}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":9}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":47}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":3}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":80}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":79}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":60}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":3}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":78}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":55}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":39}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":21}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":54}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":28}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":33}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":39}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":35}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":33}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":9}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":7}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":71}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":5}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":3}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":26}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":23}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":24}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":20}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":43}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":56}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":46}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":21}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":54}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":28}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":22}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":11}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":18}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":54}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":21}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":15}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":34}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":52}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":28}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":16}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":71}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":79}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":15}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":30}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":53}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":28}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":16}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":14}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":49}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":61}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":12}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":10}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":9}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":23}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":77}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":5}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":3}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":80}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":47}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":39}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":21}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":54}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":28}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":55}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":32}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":33}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":37}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":64}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":47}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":28}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":32}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":41}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":10}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":9}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":7}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":0}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":23}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":73}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":5}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":3}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":61}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":23}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":34}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":24}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":30}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":25}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":32}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":25}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":29}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":22}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":3}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":67}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":23}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":34}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":26}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":30}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":23}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":32}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":25}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":29}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":22}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":5}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":3}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":45}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":34}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":3}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":37}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":250,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":250,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":250,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":250,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/ddos/ddos-protection.service.ts": {"path":"/workspaces/CurrentDao-backend/src/security/ddos/ddos-protection.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":26}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":27}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":71}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":67}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":52}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":68}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":7}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":44}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":8}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":7}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":48}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":8}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":7}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":31}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":46}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":8}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":6}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":49}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":21}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":74}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":40,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":40,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/detectors/anomaly.detector.ts": {"path":"/workspaces/CurrentDao-backend/src/security/detectors/anomaly.detector.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":16}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":16}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":43}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":32}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":26}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":15}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":1}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":37}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":68}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":37}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":41}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":42}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":47}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":48}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":4}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":73}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":42}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":31}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":72}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":24}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":36}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":30}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":74}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":23}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":35}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":34}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":78}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":27}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":39}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":5}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":29}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":70}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":34}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":5}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":34}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":25}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":36}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":54}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":52}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":75}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":37}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":46}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":14}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":29}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":49}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":32}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":35}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":69}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":83}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":76}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":8}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":16}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":3}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":37}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":25}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":36}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":51}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":44}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":66}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":53}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":32}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":17}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":56}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":32}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":35}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":76}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":93}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":69}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":8}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":3}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":37}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":25}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":36}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":57}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":38}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":61}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":16}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":6}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":77}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":42}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":49}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":14}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":32}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":17}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":52}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":36}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":33}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":72}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":85}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":66}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":8}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":16}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":34}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":25}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":36}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":54}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":68}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":64}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":47}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":14}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":29}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":17}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":50}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":32}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":70}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":94}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":76}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":8}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":5}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":16}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":3}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":64}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":43}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":26}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":22}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":46}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":16}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":3}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":42}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":26}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":20}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":22}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":46}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":3}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":0}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":45}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":26}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":22}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":46}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":13}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":40}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":26}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":48}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":46}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":39}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":3}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":189,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":189,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":189,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":189,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/detectors/fraud.detector.ts": {"path":"/workspaces/CurrentDao-backend/src/security/detectors/fraud.detector.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":16}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":16}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":43}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":38}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":24}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":26}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":20}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":1}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":36}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":25}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":32}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":35}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":66}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":25}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":34}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":23}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":25}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":28}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":80}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":34}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":76}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":28}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":36}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":48}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":5}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":31}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":80}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":30}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":38}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":50}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":33}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":77}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":40}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":52}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":42}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":59}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":34}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":42}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":55}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":5}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":55}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":12}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":36}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":15}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":28}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":16}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":6}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":77}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":36}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":45}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":23}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":38}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":60}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":47}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":24}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":41}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":72}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":22}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":41}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":24}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":47}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":44}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":29}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":58}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":28}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":44}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":5}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":0}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":33}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":78}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":26}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":42}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":12}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":38}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":17}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":26}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":6}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":75}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":65}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":52}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":31}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":18}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":5}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":48}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":77}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":22}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":3}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":77}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":65}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":80}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":62}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":20}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":16}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":13}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":33}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":6}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":26}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":3}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":79}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":45}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":52}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":51}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":79}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":32}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":5}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":17}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":41}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":25}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":23}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":76}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":78}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":41}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":40}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":74}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":35}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":17}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":3}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":40}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":25}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":23}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":65}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":65}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":43}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":26}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":68}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":72}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":66}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":3}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":79}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":54}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":66}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":75}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":37}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":62}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":3}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":63}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":56}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":52}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":54}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":29}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":3}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":63}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":40}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":20}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":20}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":23}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":70}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":32}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":3}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":0}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":40}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":19}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":20}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":19}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":21}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":23}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":57}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":32}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":3}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":0}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":80}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":52}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":32}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":3}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":0}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":75}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":67}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":32}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":77}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":61}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":32}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":78}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":36}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":29}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":3}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":79}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":42}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":32}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":43}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":26}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":22}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":3}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":254,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":254,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":254,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":254,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/entities/security-event.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/security/entities/security-event.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":40}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":38}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":52}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":32}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":48}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":40}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":38}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":27}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":14}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":1}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":28}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":52}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":10}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":79}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":10}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":16}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":10}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":10}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":27}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":29}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":29}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":22}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":21}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":18}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":25}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":28}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":32}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":67}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":54}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":42}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":76,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":76,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":76,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":76,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/headers/security-headers.service.ts": {"path":"/workspaces/CurrentDao-backend/src/security/headers/security-headers.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":37}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":68}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":66}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":19}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":30}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":33}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":104}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":21}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":21}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":43}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":12}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":69}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":59}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":32}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":31}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":38}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":10}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":8}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":38}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":36}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":59}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":43}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":37}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":26}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":32}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":22}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":8}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":21}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":20}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":48}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":7}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":46,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":46,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":46,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":46,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/middleware/security.middleware.ts": {"path":"/workspaces/CurrentDao-backend/src/security/middleware/security.middleware.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":17}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":58}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":48}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":80}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":59}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":64}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":32}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":44}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":53}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":6}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":56}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":49}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":46}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":40}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":29}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":72}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":28}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":39}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":28}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":30}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":17}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":14}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":35}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":11}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":25}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":99}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":10}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":37}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":65}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":10}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":7}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":59}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":64}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":63}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":64}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":41}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":33}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":16}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":76}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":13}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":74}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":12}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":64}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":9}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":7}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":13}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":7}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":69,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":69,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/monitoring/security-monitor.service.ts": {"path":"/workspaces/CurrentDao-backend/src/security/monitoring/security-monitor.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":46}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":8}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":20}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":16}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":71}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":67}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":37}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":68}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":36}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":66}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":61}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":57}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":6}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":65}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":9}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":28}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":23}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":68}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":40}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":56}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":42}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":64}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":51}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":55}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":48}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":11}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":7}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":33}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":69}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":40}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":55}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":45}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":88}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":57}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":55}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":48}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":11}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":7}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":31}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":31}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":68}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":44}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":40}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":52}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":39}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":57}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":59}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":55}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":48}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":11}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":7}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":21}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":63}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":28}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":38}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":59}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":59}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":0}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":20}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":82}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":48}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":79}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":7}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":37}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":5}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":59}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":55}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":21}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":67}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":6}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":77}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":71}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":40}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":35}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":7}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":3}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":57}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":40}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":35}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":35}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":7}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":21}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":23}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":29}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":56}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":29}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":7}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":17}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":50}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":28}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":34}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":34}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":46}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":3}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":0}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":61}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":56}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":29}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":7}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":16}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":36}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":47}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":5}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":60}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":56}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":29}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":7}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":16}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":35}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":47}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":39}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":14}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":76}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":67}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":29}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":25}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":7}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":48}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":12}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":33}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":44}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":47}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":66}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":29}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":68}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":29}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":77}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":23}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":63}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":19}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":8}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":35}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":6}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":3}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":76}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":25}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":23}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":61}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":8}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":35}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":6}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":3}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":193,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":193,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":193,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":193,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/response/incident-response.service.ts": {"path":"/workspaces/CurrentDao-backend/src/security/response/incident-response.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":16}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":20}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":43}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":80}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":35}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":67}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":28}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":36}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":1}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":15}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":40}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":15}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":38}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":69}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":74}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":32}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":32}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":74}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":40}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":36}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":30}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":9}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":32}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":36}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":30}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":39}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":37}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":10}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":8}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":60}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":57}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":41}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":31}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":20}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":49}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":52}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":60}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":5}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":30}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":42}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":54}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":14}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":45}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":48}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":14}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":46}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":50}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":14}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":50}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":62}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":14}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":29}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":65}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":36}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":5}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":42}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":31}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":25}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":75}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":32}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":30}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":74}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":29}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":28}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":63}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":30}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":30}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":9}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":34}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":32}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":79}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":29}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":28}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":66}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":24}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":30}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":29}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":9}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":36}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":51}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":3}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":0}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":34}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":31}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":25}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":20}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":54}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":46}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":77}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":22}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":7}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":66}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":27}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":34}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":53}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":22}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":28}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":23}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":7}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":33}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":57}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":3}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":0}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":28}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":31}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":25}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":20}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":47}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":45}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":27}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":34}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":68}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":22}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":28}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":7}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":22}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":61}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":27}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":30}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":53}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":22}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":28}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":29}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":7}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":3}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":0}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":30}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":31}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":25}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":20}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":49}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":0}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":76}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":27}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":32}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":61}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":22}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":28}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":31}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":7}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":26}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":75}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":27}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":34}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":59}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":28}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":32}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":3}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":0}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":42}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":31}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":25}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":20}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":53}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":0}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":42}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":27}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":30}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":68}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":22}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":28}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":7}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":31}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":55}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":3}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":35}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":31}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":25}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":28}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":28}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":38}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":77}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":7}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":3}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":41}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":31}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":25}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":20}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":28}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":28}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":43}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":74}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":7}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":53}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":68}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":59}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":47}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":44}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":3}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":74}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":64}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":48}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":46}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":3}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":80}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":66}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":58}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":3}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":0}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":69}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":33}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":71}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":3}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":45}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":25}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":19}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":63}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":56}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":3}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":80}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":42}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":50}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":3}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":39}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":31}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":25}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":20}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":28}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":28}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":42}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":51}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":7}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":0}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":29}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":23}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":39}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":20}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":75}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":36}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":3}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":24}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":23}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":46}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":20}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":70}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":39}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":3}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":310,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":310,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":310,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":310,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/security/waf/waf.service.ts": {"path":"/workspaces/CurrentDao-backend/src/security/waf/waf.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":25}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":29}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":15}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":1}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":27}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":1}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":13}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":49}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":56}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":28}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":31}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":11}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":18}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":9}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":80}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":55}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":37}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":32}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":45}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":26}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":47}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":28}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":11}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":7}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":80}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":21}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":24}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":66}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":8}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":54}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":5}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":59}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":14}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":41}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":78}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":74}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":36}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":44}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":37}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":80}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":11}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":9}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":59}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":32}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":46}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":42}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":9}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":7}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":6}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":42}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":46}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":40}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":44}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":26}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":90,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":90,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/sentiment-analysis.module.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/sentiment-analysis.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":65}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":68}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":76}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":78}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":79}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":84}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":61}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":55}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":37}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":25}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":27}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":29}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":4}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":25}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":30}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":26}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":27}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":29}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":39}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":39}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":39}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":39}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":39}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/sentiment.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/sentiment.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":68}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":69}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":68}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":76}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":78}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":79}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":84}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":30}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":34}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":14}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":57}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":62}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":59}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":61}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":65}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":6}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":57}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":64}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":61}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":68}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":11}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":6}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":12}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":19}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":19}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":12}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":22}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":34}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":24}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":6}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":67}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":48}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":52}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":54}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":41}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":71}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":28}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":73}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":46}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":77}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":70}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":63}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":20}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":17}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":6}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":3}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":24}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":74}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":71}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":78}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":7}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":47}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":3}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":24}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":60}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":70}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":23}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":31}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":63}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":70}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":13}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":8}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":74}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":3}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":88,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":88,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":88,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":88,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/aggregators/news-aggregator.service.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/aggregators/news-aggregator.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":36}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":67}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":58}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":53}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":73}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":58}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":20}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":69}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":45}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":12}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":7}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":61}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":31}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":44}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":32}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":16}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":80}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":6}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":50}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":68}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":32,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":32,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":32,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":32,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/algorithms/sentiment-scorer.service.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/algorithms/sentiment-scorer.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":37}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":68}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":27}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":24}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":53}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":51}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":86}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":27}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":15}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":6}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":16}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":13}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":13}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":13}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":50}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":26}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":56}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":56}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":7}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":31}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":69}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":61}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":73}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":50}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":23}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":57}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":17}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":44}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":46}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":49}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":32}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":65,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":65,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":65,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":65,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/correlation/market-correlation.service.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/correlation/market-correlation.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":39}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":70}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":37}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":22}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":19}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":67}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":78}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":57}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":49}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":43}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":6}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":12}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":42}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":57}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":49}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":6}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":30}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":49}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":75}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":15}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":39}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":36}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":7}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":23}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":73}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":43}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":51}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":51}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":19}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":33}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":30}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":30}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":27}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":24}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":24}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":51}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":59}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":63}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":38}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":36}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":34}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":24}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":71,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":71,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":71,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":71,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/dto/sentiment-query.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/dto/sentiment-query.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":8}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":11}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":11}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":15}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":78}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":32}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":73}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":15}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":62}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":15}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":21}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":60}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":15}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":19}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":24}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":4}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":15}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":24}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":38}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":20}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":4}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":21}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":61}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":13}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":1}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":35}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":58}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":23}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":50}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":46}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":58}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":24}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":54}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":54}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":53}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":49}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":51}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":72,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":72,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/entities/sentiment-data.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/entities/sentiment-data.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":24}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":1}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":32}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":36}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":16}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":25}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":28}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":33}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":13}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":40}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":36}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":48}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":31}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":40}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":45}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":11}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":20}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":29}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":18}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":10}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":23}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":10}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":18}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":21}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":25}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":26}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":21}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":20}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":21}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":53}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":54}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":21}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":75,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":75,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":75,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":75,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/monitors/social-media.service.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/monitors/social-media.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":40}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":71}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":62}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":57}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":68}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":50}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":50}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":20}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":6}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":64}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":45}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":12}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":7}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":28}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":52}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":32}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":30}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":47}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":8}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":36,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":36,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":36,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":36,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sentiment/nlp/text-processor.service.ts": {"path":"/workspaces/CurrentDao-backend/src/sentiment/nlp/text-processor.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":32}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":19}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":21}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":19}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":22}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":1}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":35}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":66}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":55}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":56}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":39}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":50}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":44}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":48}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":25}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":47}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":26}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":63}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":64}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":44}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":67}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":15}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":20}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":19}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":41}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":55}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":56}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":23}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":12}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":11}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":11}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":11}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":11}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":12}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":11}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":13}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":6}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":40}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":23}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":41}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":45}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":9}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":8}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":35}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":6}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":40}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":34}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":19}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":29}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":3}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":51}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":62}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":58}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":34}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":0}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":48}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":36}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":38}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":75}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":53}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":27}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":15}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":14}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":18}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":13}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":14}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":16}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":13}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":6}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":0}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":51}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":46}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":6}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":50}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":6}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":51}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":65}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":62}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":42}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":79}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":0}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":57}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":119,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":119,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":119,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":119,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/settings/settings.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/settings/settings.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":80}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":53}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":8}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":25}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":25}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":34}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":26}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":26}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":35}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":23}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":33}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":67}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":57}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":61}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":67}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":65}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":29}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":40}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":42}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":69}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":34}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":31}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":38}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":33}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":42}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":5}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":80}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":22}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":61}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":59}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":15}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":69}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":59}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":22}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":30}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":36}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":41}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":42}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":78}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":40}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":32}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":36}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":38}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":42}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":5}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":56}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":13}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":16}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":16}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":26}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":61}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":28}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":18}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":24}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":37}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":44}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":72}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":57}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":89,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":89,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":89,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":89,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/settings/settings.module.ts": {"path":"/workspaces/CurrentDao-backend/src/settings/settings.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":65}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":67}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":53}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":59}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":58}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":12}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":62}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":4}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":36}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":31}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":29}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":2}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":30}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":18,"column":30}},"locations":[{"start":{"line":1,"column":0},"end":{"line":18,"column":30}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":18,"column":30}},"loc":{"start":{"line":1,"column":0},"end":{"line":18,"column":30}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/settings/settings.service.ts": {"path":"/workspaces/CurrentDao-backend/src/settings/settings.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":9}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":20}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":22}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":37}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":65}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":67}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":8}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":25}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":34}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":8}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":35}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":60}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":61}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":59}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":67}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":14}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":36}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":63}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":37}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":65}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":43}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":6}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":80}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":8}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":33}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":59}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":39}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":7}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":64}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":44}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":7}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":19}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":70}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":39}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":19}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":29}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":29}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":55}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":33}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":61}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":61}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":21}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":36}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":58}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":8}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":5}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":25}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":46}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":25}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":60}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":43}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":60}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":13}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":26}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":27}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":28}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":28}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":7}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":70}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":37}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":17}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":70}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":75}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":17}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":36}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":18}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":21}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":8}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":7}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":17}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":36}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":32}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":65}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":72}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":7}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":19}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":76}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":51}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":58}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":8}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":61}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":67}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":37}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":17}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":31}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":29}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":63}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":54}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":7}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":79}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":46}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":37}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":60}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":6}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":22}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":46}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":24}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":59}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":6}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":51}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":67}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":74}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":77}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":60}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":7}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":69}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":48}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":59}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":41}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":5}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":62}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":40}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":7}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":64}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":48}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":16}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":30}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":19}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":33}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":22}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":30}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":58}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":25}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":47}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":25}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":60}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":6}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":25}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":43}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":58}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":17}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":13}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":26}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":21}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":16}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":27}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":28}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":28}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":7}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":68}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":49}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":71}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":76}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":17}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":15}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":36}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":19}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":8}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":7}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":17}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":3}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":0}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":30}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":33}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":30}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":66}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":52}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":7}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":19}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":77}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":5}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":59}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":65}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":53}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":17}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":3}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":32}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":19}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":20}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":22}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":30}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":64}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":50}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":7}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":18}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":34}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":58}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":8}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":5}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":25}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":47}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":33}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":60}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":6}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":22}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":47}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":24}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":59}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":6}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":45}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":58}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":75}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":78}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":68}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":7}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":19}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":43}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":69}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":71}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":20}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":21}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":22}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":42}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":6}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":43}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":3}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":80}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":9}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":44}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":51}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":48}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":11}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":74}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":8}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":49}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":11}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":74}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":8}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":40}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":52}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":28}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":21}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":24}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":69}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":37}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":32}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":32}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":49}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":32}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":10}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":60}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":7}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":50}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":25}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":18}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":24}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":39}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":34}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":32}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":32}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":46}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":32}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":10}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":58}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":7}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":21}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":38}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":40}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":78}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":72}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":62}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":9}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":21}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":59}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":5}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":3}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":312,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":312,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":312,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":312,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/settings/dto/market-setting.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/settings/dto/market-setting.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":11}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":11}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":6}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":6}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":10}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":25}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":51}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":68}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":37}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":43}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":46}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":4}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":43}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":46}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":19}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":36}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":9}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":25}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":36}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":9}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":25}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":13}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":22}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":67}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":56}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":25}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":4}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":52,"column":4}},"locations":[{"start":{"line":1,"column":0},"end":{"line":52,"column":4}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":52,"column":4}},"loc":{"start":{"line":1,"column":0},"end":{"line":52,"column":4}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/settings/dto/user-preference.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/settings/dto/user-preference.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":38}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":13}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":13}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":31}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":15}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":57}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":26}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":4}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":19,"column":4}},"locations":[{"start":{"line":1,"column":0},"end":{"line":19,"column":4}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":19,"column":4}},"loc":{"start":{"line":1,"column":0},"end":{"line":19,"column":4}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/settings/entities/market-setting.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/settings/entities/market-setting.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":26}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":34}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":28}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":33}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":62}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":42}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":35}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":42}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":42}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":55}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":25}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":55}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":27}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":67}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":38}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":18}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":45}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":59}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":20}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":59}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":18}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":18}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":55,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":55,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":55,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":55,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/settings/entities/user-preference.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/settings/entities/user-preference.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":42}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":15}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":30}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":22}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":39}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":28}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":34}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":34}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":30}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":29}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":33}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":43}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":17}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":31}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":38}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":45}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":20}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":59}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":59}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":20}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":21}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":21}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":62,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":62,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":62,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":62,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/settings/validators/setting.validator.ts": {"path":"/workspaces/CurrentDao-backend/src/settings/validators/setting.validator.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":20}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":20}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":22}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":25}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":74}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":58}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":33}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":33}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":33}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":57}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":72}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":61}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":74}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":46}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":40}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":40}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":13}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":11}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":10}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":51}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":96}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":10}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":8}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":7}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":4}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":37,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":37,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":37,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":37,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sync/sync.module.ts": {"path":"/workspaces/CurrentDao-backend/src/sync/sync.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":50}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":57}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":45}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":65}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":64}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":74}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":62}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":9}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":77}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":14}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":21}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":21}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":20}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":4}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":12}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":20}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":4}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":26}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":26}},"locations":[{"start":{"line":1,"column":0},"end":{"line":29,"column":26}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":29,"column":26}},"loc":{"start":{"line":1,"column":0},"end":{"line":29,"column":26}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sync/sync.service.ts": {"path":"/workspaces/CurrentDao-backend/src/sync/sync.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":66}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":69}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":56}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":67}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":79}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":12}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":12}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":13}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":15}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":80}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":66}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":65}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":75}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":63}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":30}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":28}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":32}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":17}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":25}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":28}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":70}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":12}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":26}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":50}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":57}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":58}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":48}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":54}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":14}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":18}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":41}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":55}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":35}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":47}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":47}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":55}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":45}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":24}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":60}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":55}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":0}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":35}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":48}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":40}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":38}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":41}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":44}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":43}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":36}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":68}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":64}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":9}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":59}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":34}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":30}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":34}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":68}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":34}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":11}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":55}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":7}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":5}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":61}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":44}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":17}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":16}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":52}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":21}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":72}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":15}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":29}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":58}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":61}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":12}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":49}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":17}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":31}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":70}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":51}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":11}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":7}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":37}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":45}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":12}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":61}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":7}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":37}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":28}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":40}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":9}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":9}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":45}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":31}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":30}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":33}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":9}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":66}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":62}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":43}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":9}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":43}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":59}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":40}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":22}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":45}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":26}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":12}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":9}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":7}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":45}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":34}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":21}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":53}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":18}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":15}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":33}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":0}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":35}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":26}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":24}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":5}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":42}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":24}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":56}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":30}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":24}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":51}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":74}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":34}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":6}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":78}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":0}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":34}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":11}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":67}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":0}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":49}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":42}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":71}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":55}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":30}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":25}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":55}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":32}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":36}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":11}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":23}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":61}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":7}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":5}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":39}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":48}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":51}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":3}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":72}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":23}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":51}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":20}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":17}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":46}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":9}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":5}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":19}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":3}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":29}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":25}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":26}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":24}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":5}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":28}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":77}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":11}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":75}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":37}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":25}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":30}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":23}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":21}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":18}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":39}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":75}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":28}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":43}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":11}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":9}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":23}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":73}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":20}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":7}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":5}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":38}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":74}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":3}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":35}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":58}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":25}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":5}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":9}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":28}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":70}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":21}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":34}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":55}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":30}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":27}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":49}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":32}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":11}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":73}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":7}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":50}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":58}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":28}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":28}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":26}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":30}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":9}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":25}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":21}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":73}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":29}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":53}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":18}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":5}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":3}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":0}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":33}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":58}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":5}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":61}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":55}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":12}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":16}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":24}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":43}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":30}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":6}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":3}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":33}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":25}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":15}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":42}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":5}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":40}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":43}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":27}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":51}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":0}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":26}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":44}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":28}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":7}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":58}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":35}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":61}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":5}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":0}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":60}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":9}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":66}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":63}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":0}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":43}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":71}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":30}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":54}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":22}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":9}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":7}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":19}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":21}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":69}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":47}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":3}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":42}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":51}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":61}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":41}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":48}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":48}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":53}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":5}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":0}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":50}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":3}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":0}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":45}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":52}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":54}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":0}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":42}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":46}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":24}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":24}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":68}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":17}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":48}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":67}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":14}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":6}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":34}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":3}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":23}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":19}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":41}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":3}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":0}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":19}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":42}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":3}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":0}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":16}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":39}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":3}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":0}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":60}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":45}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":38}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":7}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":3}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":0}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":65}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":79}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":60}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":25}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":7}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":0}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":41}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":41}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":58}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":53}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":5}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":3}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":34}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":28}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":34}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":52}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":43}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":38}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":30}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":7}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":3}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":427,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":427,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":427,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":427,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sync/entities/sync-state.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/sync/entities/sync-state.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":24}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":30}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":28}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":18}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":22}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":30}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":24}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":33}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":13}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":42}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":43}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":19}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":71}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":21}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":74}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":59}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":29}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":61}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":31}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":43}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":43}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":23}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":38}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":21}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":65}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":24}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":75}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":29}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":63}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":24}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":70}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":32}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":69}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":43}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":18}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":43}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":18}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":69}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":69}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":19}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":80}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":29}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":65}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":21}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":92,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":92,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":92,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":92,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sync/handlers/partition.handler.ts": {"path":"/workspaces/CurrentDao-backend/src/sync/handlers/partition.handler.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":49}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":46}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":58}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":66}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":70}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":33}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":7}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":26}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":18}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":29}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":1}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":35}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":25}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":29}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":27}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":20}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":31}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":62}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":62}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":58}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":59}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":22}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":26}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":27}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":20}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":41}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":31}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":34}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":14}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":41}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":55}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":35}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":5}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":60}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":55}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":42}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":51}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":41}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":34}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":31}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":28}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":57}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":7}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":9}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":42}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":39}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":38}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":39}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":42}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":43}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":43}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":45}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":56}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":66}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":18}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":5}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":3}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":54}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":60}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":44}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":7}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":0}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":41}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":48}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":61}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":53}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":5}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":67}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":3}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":0}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":54}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":38}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":26}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":45}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":30}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":30}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":47}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":58}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":30}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":0}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":45}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":12}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":50}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":53}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":31}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":71}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":11}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":7}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":35}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":26}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":34}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":16}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":34}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":66}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":75}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":37}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":11}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":9}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":58}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":9}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":50}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":44}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":18}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":16}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":71}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":7}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":46}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":61}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":63}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":21}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":43}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":65}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":39}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":7}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":66}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":21}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":60}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":5}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":3}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":51}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":70}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":31}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":31}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":28}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":57}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":7}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":41}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":9}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":40}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":41}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":0}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":39}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":40}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":0}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":43}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":40}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":37}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":38}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":31}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":58}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":37}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":32}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":33}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":35}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":30}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":49}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":59}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":9}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":57}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":21}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":50}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":46}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":5}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":0}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":56}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":65}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":61}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":41}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":11}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":62}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":40}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":47}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":18}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":22}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":27}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":98}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":12}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":75}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":57}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":9}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":23}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":26}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":67}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":16}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":10}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":73}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":55}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":7}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":5}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":3}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":55}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":60}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":48}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":7}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":41}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":41}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":42}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":53}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":5}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":68}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":3}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":55}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":64}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":61}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":41}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":73}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":0}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":30}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":24}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":84}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":10}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":56}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":55}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":49}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":55}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":7}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":5}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":0}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":53}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":33}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":46}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":3}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":38}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":30}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":20}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":60}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":74}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":0}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":46}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":24}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":24}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":56}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":80}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":26}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":68}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":60}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":6}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":34}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":3}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":0}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":66}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":80}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":0}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":53}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":64}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":61}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":0}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":41}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":55}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":47}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":29}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":53}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":61}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":79}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":28}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":48}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":25}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":26}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":9}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":24}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":68}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":8}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":5}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":52}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":22}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":70}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":6}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":0}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":40}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":64}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":3}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":60}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":43}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":26}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":28}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":33}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":50}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":0}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":57}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":3}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":0}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":61}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":9}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":44}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":18}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":22}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":17}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":52}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":21}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":72}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":15}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":5}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":3}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":57}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":9}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":66}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":66}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":86}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":21}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":68}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":15}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":5}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":3}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":0}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":58}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":60}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":48}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":7}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":0}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":78}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":3}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":0}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":59}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":60}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":48}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":7}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":0}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":29}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":3}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":0}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":23}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":24}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":45}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":3}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":0}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":24}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":47}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":3}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":0}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":16}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":39}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":3}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":40}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":35}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":36}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":5}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":3}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":0}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":43}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":36}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":3}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":28}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":30}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":3}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":0}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":48}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":61}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":0}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":48}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":33}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":40}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":28}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":36}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":13}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":3}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":429,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":429,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":429,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":429,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sync/optimizers/performance.optimizer.ts": {"path":"/workspaces/CurrentDao-backend/src/sync/optimizers/performance.optimizer.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":37}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":58}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":37}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":30}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":36}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":18}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":39}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":20}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":22}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":20}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":36}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":18}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":28}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":13}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":35}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":66}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":52}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":48}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":41}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":35}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":23}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":26}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":27}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":27}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":14}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":41}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":32}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":55}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":53}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":38}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":54}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":12}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":64}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":65}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":65}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":70}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":66}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":6}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":3}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":46}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":23}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":32}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":30}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":42}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":34}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":41}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":64}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":76}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":41}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":35}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":39}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":33}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":37}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":6}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":38}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":38}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":43}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":34}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":5}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":38}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":47}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":56}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":67}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":32}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":71}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":18}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":95}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":8}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":78}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":18}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":108}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":8}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":5}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":0}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":79}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":18}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":108}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":8}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":5}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":78}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":18}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":102}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":8}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":80}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":18}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":105}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":8}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":28}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":63}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":45}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":36}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":48}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":57}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":67}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":32}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":0}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":58}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":71}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":48}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":50}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":13}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":59}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":10}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":31}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":24}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":88}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":10}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":7}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":15}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":73}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":7}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":49}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":50}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":14}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":59}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":10}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":31}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":24}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":92}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":10}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":7}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":5}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":0}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":46}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":78}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":49}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":52}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":12}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":47}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":10}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":31}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":24}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":93}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":10}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":7}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":15}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":33}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":73}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":7}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":49}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":52}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":12}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":47}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":10}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":31}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":24}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":95}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":10}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":7}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":5}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":48}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":79}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":49}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":50}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":14}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":59}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":10}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":25}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":31}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":24}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":93}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":10}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":7}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":15}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":37}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":43}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":7}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":48}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":13}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":57}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":8}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":29}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":22}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":91}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":8}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":5}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":0}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":26}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":78}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":5}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":58}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":57}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":35}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":27}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":50}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":36}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":46}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":5}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":25}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":3}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":70}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":33}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":0}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":9}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":71}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":34}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":35}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":57}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":28}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":68}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":30}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":8}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":52}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":77}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":38}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":21}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":73}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":18}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":5}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":3}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":67}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":36}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":29}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":36}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":49}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":0}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":37}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":53}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":14}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":38}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":7}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":5}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":0}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":36}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":29}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":59}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":20}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":59}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":41}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":42}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":49}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":39}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":5}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":52}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":3}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":72}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":32}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":61}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":6}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":0}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":62}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":56}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":5}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":0}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":76}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":48}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":0}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":26}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":3}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":0}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":74}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":52}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":38}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":12}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":22}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":28}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":8}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":3}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":63}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":27}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":40}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":35}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":26}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":21}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":7}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":20}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":18}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":7}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":3}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":54}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":77}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":3}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":0}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":29}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":60}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":13}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":41}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":53}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":35}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":8}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":54}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":6}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":0}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":35}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":29}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":3}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":0}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":39}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":27}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":29}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":11}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":46}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":41}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":42}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":67}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":41}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":35}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":61}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":49}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":37}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":6}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":0}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":38}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":3}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":0}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":34}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":34}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":25}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":31}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":25}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":28}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":63}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":34}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":75}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":58}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":49}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":55}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":46}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":52}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":9}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":7}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":31}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":37}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":23}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":20}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":22}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":19}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":21}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":8}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":6}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":0}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":33}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":12}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":59}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":71}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":43}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":37}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":41}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":35}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":39}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":6}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":3}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":61}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":39}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":28}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":67}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":37}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":60}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":6}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":61}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":3}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":0}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":63}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":41}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":60}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":27}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":65}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":8}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":5}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":0}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":63}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":76}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":5}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":59}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":27}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":83}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":8}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":5}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":56}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":27}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":79}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":8}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":5}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":0}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":63}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":80}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":5}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":0}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":27}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":3}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":0}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":42}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":51}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":51}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":50}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":12}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":79}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":6}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":3}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":0}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":57}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":51}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":50}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":12}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":71}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":19}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":6}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":3}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":0}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":36}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":40}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":57}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":3}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":0}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":33}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":39}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":37}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":87}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":3}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":35}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":51}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":49}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":76}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":3}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":0}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":32}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":51}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":49}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":73}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":3}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":0}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":34}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":62}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":28}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":3}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":0}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":23}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":46}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":39}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":3}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":0}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":47}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":12}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":62}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":31}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":37}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":23}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":20}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":22}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":19}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":21}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":7}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":6}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":3}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":0}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":68}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":71}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":74}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":3}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":0}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":22}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":23}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":49}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":3}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":0}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":76}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":12}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":28}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":46}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":70}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":6}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":3}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":539,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":539,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":539,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":539,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sync/recovery/recovery.service.ts": {"path":"/workspaces/CurrentDao-backend/src/sync/recovery/recovery.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":49}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":46}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":58}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":66}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":80}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":7}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":24}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":18}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":34}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":26}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":31}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":28}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":26}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":35}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":7}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":17}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":28}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":51}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":28}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":51}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":13}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":30}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":61}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":61}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":56}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":58}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":23}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":27}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":65}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":14}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":41}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":32}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":55}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":35}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":60}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":55}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":70}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":51}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":41}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":33}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":9}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":50}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":14}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":40}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":7}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":62}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":63}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":22}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":67}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":8}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":62}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":64}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":50}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":18}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":36}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":5}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":53}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":60}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":14}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":37}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":43}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":40}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":8}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":7}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":64}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":41}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":11}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":50}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":23}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":76}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":16}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":10}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":5}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":3}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":74}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":71}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":59}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":30}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":31}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":28}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":39}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":35}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":7}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":36}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":71}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":54}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":43}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":30}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":25}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":48}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":16}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":32}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":55}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":16}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":34}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":57}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":16}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":58}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":7}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":0}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":26}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":41}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":36}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":31}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":50}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":53}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":32}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":35}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":30}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":41}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":37}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":46}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":9}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":47}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":42}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":45}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":29}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":53}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":32}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":32}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":30}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":41}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":37}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":29}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":9}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":18}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":5}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":3}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":42}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":25}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":32}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":64}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":67}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":60}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":61}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":17}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":50}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":36}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":14}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":36}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":29}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":29}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":29}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":8}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":28}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":14}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":35}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":25}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":47}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":28}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":8}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":5}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":58}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":15}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":14}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":26}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":27}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":48}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":29}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":8}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":12}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":31}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":22}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":43}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":27}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":6}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":3}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":70}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":20}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":79}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":6}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":45}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":39}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":51}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":64}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":37}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":69}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":51}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":51}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":0}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":25}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":26}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":9}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":50}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":32}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":27}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":7}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":76}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":0}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":11}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":72}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":0}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":51}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":55}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":26}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":24}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":64}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":41}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":14}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":34}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":36}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":32}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":43}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":39}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":41}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":11}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":23}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":26}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":63}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":16}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":10}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":7}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":5}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":3}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":77}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":20}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":86}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":6}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":45}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":46}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":51}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":0}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":64}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":59}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":0}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":29}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":75}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":49}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":51}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":3}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":79}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":20}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":88}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":6}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":0}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":42}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":68}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":0}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":63}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":5}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":0}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":30}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":61}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":45}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":43}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":51}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":0}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":53}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":49}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":3}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":0}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":80}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":22}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":87}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":6}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":0}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":29}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":47}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":17}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":36}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":0}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":43}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":40}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":60}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":51}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":3}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":35}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":25}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":26}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":24}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":20}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":77}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":11}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":75}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":46}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":25}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":30}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":23}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":21}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":18}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":0}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":31}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":48}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":66}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":9}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":23}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":73}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":20}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":7}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":5}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":3}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":0}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":46}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":12}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":25}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":20}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":58}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":89}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":9}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":29}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":41}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":0}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":26}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":49}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":0}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":40}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":21}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":24}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":65}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":14}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":8}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":18}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":5}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":3}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":0}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":61}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":52}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":29}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":55}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":5}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":0}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":39}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":3}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":69}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":39}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":63}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":3}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":0}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":39}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":25}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":66}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":76}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":56}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":54}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":64}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":0}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":12}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":89}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":28}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":6}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":3}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":75}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":57}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":22}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":75}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":6}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":3}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":0}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":64}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":38}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":22}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":69}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":6}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":3}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":0}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":61}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":9}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":44}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":18}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":22}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":17}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":16}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":52}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":21}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":72}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":15}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":5}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":0}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":38}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":21}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":21}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":20}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":46}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":24}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":24}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":58}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":35}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":49}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":46}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":32}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":45}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":42}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":79}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":35}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":6}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":34}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":3}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":0}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":23}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":23}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":44}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":3}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":0}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":23}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":46}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":3}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":0}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":16}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":39}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":3}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":0}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":71}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":42}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":3}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":0}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":77}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":51}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":0}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":48}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":47}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":0}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":64}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":40}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":9}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":0}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":22}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":44}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":54}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":55}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":7}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":0}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":62}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":5}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":3}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":0}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":78}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":33}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":64}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":40}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":9}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":0}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":22}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":47}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":7}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":12}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":40}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":5}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":3}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":0}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":27}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":30}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":3}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":0}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":49}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":51}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":0}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":49}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":66}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":63}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":7}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":0}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":25}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":46}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":56}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":27}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":34}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":33}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":30}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":32}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":48}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":9}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":52}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":0}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":44}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":5}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":3}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":550,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":550,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":550,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":550,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/sync/resolvers/conflict.resolver.ts": {"path":"/workspaces/CurrentDao-backend/src/sync/resolvers/conflict.resolver.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":49}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":47}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":70}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":27}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":7}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":20}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":25}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":51}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":22}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":29}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":50}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":37}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":39}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":37}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":40}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":38}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":40}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":34}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":62}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":54}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":68}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":14}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":32}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":55}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":35}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":6}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":23}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":67}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":31}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":9}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":38}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":26}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":43}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":46}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":7}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":44}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":43}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":44}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":46}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":49}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":48}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":9}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":57}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":0}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":21}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":49}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":41}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":7}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":21}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":71}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":14}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":8}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":34}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":67}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":31}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":46}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":34}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":64}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":70}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":67}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":77}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":45}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":72}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":35}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":35}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":114}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":28}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":39}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":46}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":16}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":29}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":37}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":56}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":16}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":48}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":77}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":14}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":11}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":7}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":3}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":36}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":67}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":31}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":9}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":64}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":55}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":73}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":75}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":46}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":31}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":19}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":48}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":50}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":57}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":30}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":18}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":35}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":29}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":147}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":26}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":46}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":48}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":14}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":27}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":47}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":49}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":14}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":46}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":75}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":12}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":9}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":7}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":21}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":65}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":16}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":3}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":39}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":67}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":31}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":9}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":55}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":61}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":73}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":75}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":46}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":66}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":68}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":0}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":56}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":49}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":38}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":31}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":125}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":55}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":57}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":46}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":75}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":12}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":9}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":7}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":21}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":68}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":5}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":16}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":3}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":38}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":67}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":31}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":9}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":48}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":36}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":36}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":45}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":47}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":48}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":62}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":39}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":12}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":31}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":36}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":50}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":61}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":0}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":44}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":22}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":41}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":33}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":115}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":30}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":50}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":66}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":18}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":57}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":76}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":70}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":16}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":13}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":11}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":9}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":7}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":21}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":67}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":5}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":0}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":16}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":3}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":24}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":67}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":23}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":19}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":61}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":9}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":26}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":59}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":44}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":56}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":78}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":16}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":0}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":57}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":79}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":16}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":0}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":46}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":70}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":16}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":49}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":73}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":16}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":47}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":71}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":16}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":0}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":54}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":77}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":32}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":16}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":0}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":16}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":26}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":74}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":12}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":7}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":54}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":33}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":46}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":19}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":30}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":19}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":8}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":0}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":67}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":51}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":0}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":25}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":50}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":24}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":21}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":24}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":71}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":14}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":8}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":18}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":5}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":3}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":0}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":37}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":67}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":23}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":19}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":53}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":54}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":67}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":27}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":51}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":42}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":44}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":11}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":7}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":5}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":0}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":12}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":40}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":56}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":36}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":6}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":38}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":67}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":23}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":19}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":69}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":64}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":12}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":43}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":36}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":70}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":6}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":3}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":0}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":29}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":67}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":23}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":19}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":74}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":31}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":46}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":54}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":33}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":7}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":0}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":12}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":34}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":46}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":53}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":36}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":6}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":3}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":32}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":67}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":23}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":19}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":52}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":12}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":28}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":36}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":43}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":6}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":3}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":0}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":30}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":67}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":23}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":19}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":46}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":12}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":24}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":36}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":35}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":6}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":3}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":0}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":36}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":67}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":23}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":19}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":29}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":58}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":0}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":12}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":42}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":36}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":34}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":34}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":6}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":3}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":0}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":33}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":19}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":23}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":23}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":61}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":79}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":19}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":5}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":0}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":16}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":3}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":0}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":76}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":53}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":55}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":14}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":3}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":0}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":68}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":62}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":29}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":10}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":46}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":42}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":9}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":20}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":7}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":5}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":17}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":3}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":0}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":68}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":9}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":59}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":33}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":21}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":18}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":5}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":0}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":69}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":9}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":56}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":33}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":21}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":18}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":5}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":3}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":0}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":38}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":22}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":17}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":20}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":38}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":44}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":3}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":0}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":64}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":47}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":21}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":70}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":6}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":3}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":0}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":78}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":49}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":20}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":81}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":6}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":3}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":0}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":36}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":67}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":23}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":20}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":41}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":58}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":3}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":0}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":23}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":27}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":12}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":46}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":53}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":49}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":61}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":6}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":3}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":0}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":32}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":21}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":57}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":61}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":5}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":17}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":3}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":0}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":38}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":21}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":63}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":73}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":5}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":17}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":3}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":0}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":16}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":31}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":46}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":3}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":513,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":513,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":513,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":513,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/tracing/opentelemetry.service.ts": {"path":"/workspaces/CurrentDao-backend/src/tracing/opentelemetry.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":15}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":18}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":9}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":7}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":10}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":14}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":28}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":29}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":0}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":76}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":66}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":34}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":17}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":52}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":56}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":18}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":77}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":9}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":60}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":53}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":21}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":72}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":24}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":5}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":56}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":48}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":59}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":20}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":17}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":41}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":17}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":68}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":44}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":22}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":7}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":7}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":3}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":5}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":64}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":5}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":50}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":50}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":33}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":5}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":51}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":58}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":78,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":78,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":78,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":78,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/tracing/otel-sdk.ts": {"path":"/workspaces/CurrentDao-backend/src/tracing/otel-sdk.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":50}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":52}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":8}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":20}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":23}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":45}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":76}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":79}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":75}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":74}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":80}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":81}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":73}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":72}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":3}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":15}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":79}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":69}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":62}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":33}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":51}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":2}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":58}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":45}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":51}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":53}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":37}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":43}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":51}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":38}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":10}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":58}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":43}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":7}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":21}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":30}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":33}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":30}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":4}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":76}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":68}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":45}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":25}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":52}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":66}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":20}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":61}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":31}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":7}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":52}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":72}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":38}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":19}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":30}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":79,"column":30}},"locations":[{"start":{"line":1,"column":0},"end":{"line":79,"column":30}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":79,"column":30}},"loc":{"start":{"line":1,"column":0},"end":{"line":79,"column":30}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/tracing/tracing.module.ts": {"path":"/workspaces/CurrentDao-backend/src/tracing/tracing.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":59}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":63}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":81}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":76}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":72}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":57}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":9}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":9}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":25}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":5}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":6}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":5}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":26}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":30}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":6}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":4}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":80}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":2}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":29}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":26,"column":29}},"locations":[{"start":{"line":1,"column":0},"end":{"line":26,"column":29}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":26,"column":29}},"loc":{"start":{"line":1,"column":0},"end":{"line":26,"column":29}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/tracing/analytics/trace-analytics.service.ts": {"path":"/workspaces/CurrentDao-backend/src/tracing/analytics/trace-analytics.service.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":72}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":36}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":67}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":32}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":46}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":41}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":58}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":75}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":41}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":7}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":54}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":38}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":7}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":56}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":8}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":6}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":71}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":39}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":7}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":46}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":15}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":61}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":23}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":39}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":59}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":31}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":39}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":5}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":27}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":23}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":96}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":5}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":5}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":41}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":21}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":67}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":12}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":35}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":43}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3,"18":3,"19":3,"20":3,"21":3,"22":3,"23":3,"24":3,"25":3,"26":3,"27":3,"28":3,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":0,"42":0,"43":1,"44":1,"45":0,"46":0,"47":0,"48":0,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1},"branchMap":{"0":{"type":"branch","line":12,"loc":{"start":{"line":12,"column":2},"end":{"line":29,"column":3}},"locations":[{"start":{"line":12,"column":2},"end":{"line":29,"column":3}}]},"1":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":2},"end":{"line":50,"column":3}},"locations":[{"start":{"line":34,"column":2},"end":{"line":50,"column":3}}]},"2":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":30},"end":{"line":43,"column":5}},"locations":[{"start":{"line":41,"column":30},"end":{"line":43,"column":5}}]},"3":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":26},"end":{"line":49,"column":5}},"locations":[{"start":{"line":45,"column":26},"end":{"line":49,"column":5}}]},"4":{"type":"branch","line":55,"loc":{"start":{"line":55,"column":2},"end":{"line":61,"column":3}},"locations":[{"start":{"line":55,"column":2},"end":{"line":61,"column":3}}]}},"b":{"0":[3],"1":[1],"2":[0],"3":[0],"4":[1]},"fnMap":{"0":{"name":"TraceAnalyticsService","decl":{"start":{"line":12,"column":2},"end":{"line":29,"column":3}},"loc":{"start":{"line":12,"column":2},"end":{"line":29,"column":3}},"line":12},"1":{"name":"trackRequest","decl":{"start":{"line":34,"column":2},"end":{"line":50,"column":3}},"loc":{"start":{"line":34,"column":2},"end":{"line":50,"column":3}},"line":34},"2":{"name":"getHealthReport","decl":{"start":{"line":55,"column":2},"end":{"line":61,"column":3}},"loc":{"start":{"line":55,"column":2},"end":{"line":61,"column":3}},"line":55}},"f":{"0":3,"1":1,"2":1}} +,"/workspaces/CurrentDao-backend/src/tracing/filters/tracing.filter.ts": {"path":"/workspaces/CurrentDao-backend/src/tracing/filters/tracing.filter.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":18}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":8}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":16}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":16}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":13}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":9}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":24}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":44}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":52}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":55}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":59}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":50}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":36}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":49}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":46}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":40}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":43}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":74}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":75}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":62}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":31}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":63}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":34}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":25}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":42}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":14}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":59}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":7}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":43,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":43,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":43,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":43,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/tracing/instrumentation/custom-instrumentation.ts": {"path":"/workspaces/CurrentDao-backend/src/tracing/instrumentation/custom-instrumentation.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":73}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":52}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":36}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":67}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":34}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":71}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":5}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":45}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":33}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":5}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":71}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":68}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":11}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":52}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":34}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":52}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":23}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":37}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":33}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":11}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":36}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":7}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":7}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":27}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":30}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":47}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":42}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":16}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":35}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":5}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":44}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":73}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":50}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":74}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":65}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":64}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":54}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":24}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":39}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":35}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":38}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":22}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":19}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":9}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":9}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":6}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":22}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":81,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":81,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/tracing/interceptors/tracing.interceptor.ts": {"path":"/workspaces/CurrentDao-backend/src/tracing/interceptors/tracing.interceptor.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":14}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":19}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":18}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":39}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":65}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":77}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":60}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":64}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":67}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":76}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":56}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":36}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":66}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":41}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":72}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":28}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":26}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":39}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":68}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":11}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":33}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":31}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":70}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":56}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":55}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":66}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":60}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":44}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":19}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":27}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":30}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":39}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":27}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":34}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":64}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":18}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":33}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":56}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":55}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":32}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":45}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":41}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":66}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":44}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":44}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":19}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":27}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":30}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":39}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":27}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":18}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":34}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":73}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":18}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":31}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":27}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":16}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":15}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":11}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":31}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":22}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":37}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":21}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":10}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":9}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":7}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":0,"90":0,"91":1,"92":1,"93":1,"94":1,"95":1},"branchMap":{"0":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":2},"end":{"line":16,"column":67}},"locations":[{"start":{"line":16,"column":2},"end":{"line":16,"column":67}}]},"1":{"type":"branch","line":18,"loc":{"start":{"line":18,"column":2},"end":{"line":95,"column":3}},"locations":[{"start":{"line":18,"column":2},"end":{"line":95,"column":3}}]},"2":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":26},"end":{"line":94,"column":5}},"locations":[{"start":{"line":24,"column":26},"end":{"line":94,"column":5}}]},"3":{"type":"branch","line":25,"loc":{"start":{"line":25,"column":49},"end":{"line":93,"column":7}},"locations":[{"start":{"line":25,"column":49},"end":{"line":93,"column":7}}]},"4":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":54},"end":{"line":30,"column":67}},"locations":[{"start":{"line":30,"column":54},"end":{"line":30,"column":67}}]},"5":{"type":"branch","line":37,"loc":{"start":{"line":37,"column":20},"end":{"line":57,"column":15}},"locations":[{"start":{"line":37,"column":20},"end":{"line":57,"column":15}}]},"6":{"type":"branch","line":82,"loc":{"start":{"line":82,"column":24},"end":{"line":84,"column":15}},"locations":[{"start":{"line":82,"column":24},"end":{"line":84,"column":15}}]}},"b":{"0":[2],"1":[1],"2":[1],"3":[1],"4":[0],"5":[1],"6":[1]},"fnMap":{"0":{"name":"TracingInterceptor","decl":{"start":{"line":16,"column":2},"end":{"line":16,"column":67}},"loc":{"start":{"line":16,"column":2},"end":{"line":16,"column":67}},"line":16},"1":{"name":"intercept","decl":{"start":{"line":18,"column":2},"end":{"line":95,"column":3}},"loc":{"start":{"line":18,"column":2},"end":{"line":95,"column":3}},"line":18},"2":{"name":"next","decl":{"start":{"line":37,"column":20},"end":{"line":57,"column":15}},"loc":{"start":{"line":37,"column":20},"end":{"line":57,"column":15}},"line":37},"3":{"name":"error","decl":{"start":{"line":58,"column":21},"end":{"line":81,"column":15}},"loc":{"start":{"line":58,"column":21},"end":{"line":81,"column":15}},"line":58},"4":{"name":"complete","decl":{"start":{"line":82,"column":24},"end":{"line":84,"column":15}},"loc":{"start":{"line":82,"column":24},"end":{"line":84,"column":15}},"line":82}},"f":{"0":2,"1":1,"2":1,"3":0,"4":1}} +,"/workspaces/CurrentDao-backend/src/webhooks/webhook.controller.ts": {"path":"/workspaces/CurrentDao-backend/src/webhooks/webhook.controller.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":6}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":7}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":8}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":11}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":24}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":8}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":10}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":11}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":11}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":25}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":51}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":8}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":26}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":20}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":27}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":52}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":69}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":23}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":32}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":65}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":9}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":16}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":48}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":18}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":59}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":78}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":56}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":48}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":79}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":60}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":61}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":50}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":64}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":13}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":49}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":50}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":65}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":54}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":60}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":46}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":16}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":48}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":18}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":65}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":54}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":15}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":28}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":47}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":23}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":60}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":16}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":34}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":46}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":76}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":65}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":54}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":56}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":32}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":53}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":16}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":16}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":56}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":4}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":71}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":58}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":3}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":0}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":60}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":16}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":59}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":4}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":54}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":60}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":61}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":22}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":28}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":44}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":5}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":74}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":3}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":0}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":24}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":55}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":62}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":13}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":22}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":20}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":55}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":4}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":66}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":59}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":24}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":58}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":16}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":16}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":57}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":4}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":60}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":61}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":13}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":20}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":40}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":4}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":13}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":20}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":36}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":4}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":67}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":45}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":17}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":18}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":22}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":6}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":163,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":163,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/webhooks/webhook.service.ts": {"path":"/workspaces/CurrentDao-backend/src/webhooks/webhook.service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":47}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":44}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":52}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":8}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":18}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":17}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":44}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":51}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":60}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":8}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":20}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":38}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":29}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":60}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":14}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":51}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":38}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":60}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":45}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":51}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":37}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":70}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":68}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":48}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":16}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":54}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":73}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":31}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":18}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":35}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":7}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":31}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":47}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":7}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":39}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":23}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":62}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":43}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":44}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":70}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":62}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":30}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":7}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":43}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":59}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":61}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":7}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":5}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":3}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":0}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":31}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":34}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":14}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":57}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":50}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":22}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":28}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":6}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":21}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":34}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":20}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":53}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":28}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":14}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":38}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":31}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":37}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":23}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":7}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":0}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":49}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":65}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":3}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":75}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":60}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":32}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":29}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":20}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":59}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":13}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":33}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":72}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":25}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":32}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":8}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":24}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":38}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":18}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":31}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":8}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":44}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":62}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":20}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":47}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":45}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":56}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":51}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":46}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":11}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":8}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":0}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":46}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":0}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":56}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":39}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":38}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":52}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":17}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":32}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":9}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":45}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":35}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":10}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":8}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":0}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":22}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":83}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":8}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":46}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":65}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":5}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":3}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":0}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":37}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":30}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":15}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":21}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":20}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":53}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":51}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":0}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":37}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":57}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":38}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":22}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":36}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":17}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":9}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":45}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":35}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":23}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":10}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":8}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":24}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":62}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":14}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":8}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":13}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":0}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":33}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":61}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":6}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":0}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":55}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":38}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":20}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":18}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":34}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":15}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":7}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":21}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":116}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":6}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":3}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":0}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":64}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":27}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":28}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":72}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":40}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":57}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":0}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":36}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":48}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":63}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":14}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":40}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":42}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":8}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":29}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":7}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":0}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":44}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":67}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":5}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":3}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":55}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":18}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":20}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":19}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":20}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":24}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":6}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":55}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":65}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":60}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":37}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":66}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":9}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":37}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":65}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":9}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":37}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":66}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":9}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":7}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":64}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":60}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":3}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":22}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":13}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":15}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":23}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":64}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":55}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":76}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":25}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":29}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":31}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":18}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":35}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":7}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":33}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":3}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":290,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":290,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":290,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":290,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/webhooks/webhooks.module.ts": {"path":"/workspaces/CurrentDao-backend/src/webhooks/webhooks.module.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":43}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":50}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":51}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":57}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":69}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":51}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":60}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":9}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":57}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":29}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":4}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":35}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":67}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":65}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":30}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":22,"column":30}},"locations":[{"start":{"line":1,"column":0},"end":{"line":22,"column":30}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":22,"column":30}},"loc":{"start":{"line":1,"column":0},"end":{"line":22,"column":30}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/webhooks/auth/hmac.auth.ts": {"path":"/workspaces/CurrentDao-backend/src/webhooks/auth/hmac.auth.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":33}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":30}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":62}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":17}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":35}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":30}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":0}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":80}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":70}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":34}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":36}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":44}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":6}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":31}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":41}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":76}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":46}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":63}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":47}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":50}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":47}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":58}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":68}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":12}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":44,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":44,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":44,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":44,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/webhooks/dto/webhook.dto.ts": {"path":"/workspaces/CurrentDao-backend/src/webhooks/dto/webhook.dto.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":11}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":10}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":12}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":11}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":11}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":8}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":6}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":6}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":25}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":31}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":10}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":17}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":15}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":14}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":26}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":0}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":9}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":10}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":15}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":13}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":12}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":13}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":32}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":31}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":15}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":15}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":12}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":27}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":20}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":19}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":9}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":22}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":13}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":12}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":13}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":15}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":13}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":32}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":15}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":13}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":15}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":14}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":15}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":13}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":0}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":15}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":13}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":21}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":0}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":15}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":38}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":15}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":13}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":13}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":18}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":13}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":21}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":15}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":13}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":0}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":15}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":13}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":0}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":32}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":13}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":20}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":13}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":28}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":0}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":15}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":13}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":25}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":21}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":34}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":145,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":145,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":145,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":145,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/webhooks/entities/webhook-delivery.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/webhooks/entities/webhook-delivery.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":12}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":43}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":28}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":22}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":24}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":29}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":30}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":60}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":37}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":19}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":33}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":20}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":11}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":20}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":17}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":11}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":17}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":25}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":36}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":4}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":29}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":43}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":0}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":29}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":43}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":23}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":25}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":29}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":20}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":66,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":66,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":66,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":66,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/webhooks/entities/webhook.entity.ts": {"path":"/workspaces/CurrentDao-backend/src/webhooks/entities/webhook.entity.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":8}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":9}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":19}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":19}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":12}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":17}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":60}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":22}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":33}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":27}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":17}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":25}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":28}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":18}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":21}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":28}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":20}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":43}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":31}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":0}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":21}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":18}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":67}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":32}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":51,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":51,"column":1}},"line":1}},"f":{"0":0}} +,"/workspaces/CurrentDao-backend/src/webhooks/filters/event.filter.ts": {"path":"/workspaces/CurrentDao-backend/src/webhooks/filters/event.filter.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":33}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":69}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":56}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":18}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":5}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":63}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":57}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":7}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":5}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":3}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":69}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":37}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":46}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":5}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":66}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":63}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":38}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":76}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":64}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":62}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":61}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":61}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":61}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":61}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":62}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":63}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":69}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":64}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":69}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":68}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":63}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":40}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":50}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":7}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":5}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":16}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":70}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":32}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":56}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":20}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":22}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":23}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":21}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":14}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":57}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":53}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":16}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":3}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":0}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":17}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":23}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":23}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":14}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":68}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":68}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":83,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":83,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":83,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":83,"column":1}},"line":1}},"f":{"0":0}} +} diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..530d1ed --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 0000000..c1525b8 Binary files /dev/null and b/coverage/lcov-report/favicon.png differ diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 0000000..ecdeecd --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,2846 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 9.66% + Statements + 5862/60632 +
+ + +
+ 59.5% + Branches + 626/1052 +
+ + +
+ 44.83% + Functions + 230/513 +
+ + +
+ 9.66% + Lines + 5862/60632 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
11.87%31/26142.85%3/737.5%3/811.87%31/261
src/ai/recommendations +
+
0%0/7040%0/70%0/70%0/704
src/ai/recommendations/dto +
+
0%0/690%0/10%0/10%0/69
src/ai/recommendations/entities +
+
0%0/900%0/10%0/10%0/90
src/analytics +
+
0%0/3880%0/20%0/20%0/388
src/analytics/dto +
+
0%0/1620%0/10%0/10%0/162
src/analytics/entities +
+
0%0/880%0/10%0/10%0/88
src/analytics/reports +
+
0%0/16770%0/40%0/40%0/1677
src/apm +
+
0%0/250%0/10%0/10%0/25
src/apm/alerts +
+
0%0/740%0/10%0/10%0/74
src/apm/analytics +
+
0%0/1060%0/10%0/10%0/106
src/apm/dashboard +
+
0%0/560%0/10%0/10%0/56
src/apm/metrics +
+
0%0/1010%0/10%0/10%0/101
src/apm/optimization +
+
0%0/770%0/10%0/10%0/77
src/assets +
+
0%0/250%0/10%0/10%0/25
src/assets/caching +
+
78.12%25/3260%3/575%3/478.12%25/32
src/assets/cdn +
+
100%12/12100%2/2100%2/2100%12/12
src/assets/optimization +
+
51.16%22/4340%2/566.66%2/351.16%22/43
src/assets/versioning +
+
72%18/25100%2/266.66%2/372%18/25
src/audit +
+
0%0/15360%0/20%0/20%0/1536
src/audit/decorators +
+
0%0/3660%0/10%0/10%0/366
src/audit/entities +
+
0%0/8720%0/20%0/20%0/872
src/audit/interceptors +
+
0%0/6180%0/10%0/10%0/618
src/audit/reports +
+
0%0/11790%0/10%0/10%0/1179
src/carbon +
+
0%0/1010%0/20%0/20%0/101
src/carbon/analytics +
+
0%0/340%0/10%0/10%0/34
src/carbon/calculations +
+
0%0/700%0/10%0/10%0/70
src/carbon/dto +
+
0%0/690%0/10%0/10%0/69
src/carbon/entities +
+
0%0/780%0/10%0/10%0/78
src/carbon/offsets +
+
0%0/510%0/10%0/10%0/51
src/carbon/reporting +
+
0%0/340%0/10%0/10%0/34
src/carbon/tracking +
+
0%0/290%0/10%0/10%0/29
src/classification +
+
0%0/6930%0/20%0/20%0/693
src/classification/dto +
+
0%0/8210%0/20%0/20%0/821
src/classification/entities +
+
0%0/7400%0/30%0/30%0/740
src/common/decorators +
+
0%0/4230%0/20%0/20%0/423
src/common/filters +
+
0%0/3700%0/10%0/10%0/370
src/common/interceptors +
+
0%0/2920%0/10%0/10%0/292
src/common/interfaces +
+
0%0/2090%0/10%0/10%0/209
src/common/pipes +
+
0%0/2610%0/10%0/10%0/261
src/common/providers +
+
0%0/8690%0/30%0/30%0/869
src/common/utils +
+
0%0/2360%0/10%0/10%0/236
src/config +
+
0%0/1100%0/20%0/20%0/110
src/contracts +
+
0%0/7950%0/30%0/30%0/795
src/contracts/contracts +
+
0%0/3840%0/40%0/40%0/384
src/contracts/deployer +
+
0%0/1610%0/10%0/10%0/161
src/contracts/dto +
+
0%0/1330%0/10%0/10%0/133
src/contracts/entities +
+
0%0/990%0/10%0/10%0/99
src/cross-border +
+
0%0/300%0/10%0/10%0/30
src/cross-border/compliance +
+
96.86%432/44690.19%46/51100%11/1196.86%432/446
src/cross-border/controller +
+
0%0/3460%0/10%0/10%0/346
src/cross-border/currency +
+
0%0/4420%0/10%0/10%0/442
src/cross-border/dto +
+
0%0/2420%0/10%0/10%0/242
src/cross-border/entities +
+
0%0/1170%0/10%0/10%0/117
src/cross-border/reporting +
+
0%0/7200%0/10%0/10%0/720
src/cross-border/tariffs +
+
0%0/5960%0/10%0/10%0/596
src/cross-border/transactions +
+
0%0/3810%0/10%0/10%0/381
src/database/sharding +
+
0%0/2250%0/40%0/40%0/225
src/database/sharding/entities +
+
0%0/340%0/10%0/10%0/34
src/database/sharding/monitoring +
+
0%0/670%0/10%0/10%0/67
src/energy +
+
0%0/15880%0/30%0/30%0/1588
src/energy/config +
+
0%0/3800%0/10%0/10%0/380
src/energy/dto +
+
0%0/9480%0/40%0/40%0/948
src/energy/entities +
+
0%0/8100%0/30%0/30%0/810
src/energy/filters +
+
0%0/1040%0/10%0/10%0/104
src/energy/guards +
+
0%0/370%0/10%0/10%0/37
src/forecasting +
+
0%0/6280%0/20%0/20%0/628
src/forecasting/analysis +
+
0%0/6170%0/10%0/10%0/617
src/forecasting/dto +
+
0%0/1200%0/10%0/10%0/120
src/forecasting/ensemble +
+
63.54%725/114182.11%101/12361.36%27/4463.54%725/1141
src/forecasting/entities +
+
100%76/76100%2/2100%0/0100%76/76
src/forecasting/integrations +
+
0%0/4020%0/10%0/10%0/402
src/forecasting/models +
+
95.44%398/41777.41%48/62100%21/2195.44%398/417
src/forecasting/prediction +
+
0%0/9610%0/10%0/10%0/961
src/fraud +
+
0%0/2960%0/20%0/20%0/296
src/fraud/dto +
+
100%268/268100%2/266.66%2/3100%268/268
src/fraud/entities +
+
100%171/171100%3/3100%0/0100%171/171
src/fraud/ml +
+
93.06%376/40467.16%45/67100%20/2093.06%376/404
src/fraud/monitoring +
+
78.79%327/41577.08%37/4875%15/2078.79%327/415
src/fraud/patterns +
+
98.94%939/94976.11%153/201100%45/4598.94%939/949
src/fraud/prevention +
+
96.11%322/33581.35%48/59100%14/1496.11%322/335
src/fraud/reporting +
+
90.93%331/36463.79%37/5878.57%11/1490.93%331/364
src/gas +
+
0%0/1870%0/20%0/20%0/187
src/gas/algorithms +
+
0%0/1250%0/10%0/10%0/125
src/gas/batching +
+
100%109/10993.33%14/15100%4/4100%109/109
src/gas/dto +
+
0%0/1630%0/10%0/10%0/163
src/gas/entities +
+
0%0/650%0/10%0/10%0/65
src/gas/optimizer +
+
0%0/950%0/10%0/10%0/95
src/gateway +
+
0%0/340%0/10%0/10%0/34
src/gateway/auth +
+
100%31/31100%4/4100%3/3100%31/31
src/gateway/circuit-breaker +
+
96.77%60/62100%7/7100%4/496.77%60/62
src/gateway/monitoring +
+
100%54/54100%3/3100%3/3100%54/54
src/gateway/rate-limiting +
+
95.55%43/45100%4/466.66%2/395.55%43/45
src/gateway/transformation +
+
96.72%59/6190%9/10100%5/596.72%59/61
src/location +
+
49.09%218/44448.27%14/2947.05%8/1749.09%218/444
src/location/algorithms +
+
43.81%163/37262.5%5/831.25%5/1643.81%163/372
src/location/dto +
+
0%0/2380%0/10%0/10%0/238
src/location/entities +
+
100%121/121100%0/0100%0/0100%121/121
src/logging +
+
0%0/5590%0/20%0/20%0/559
src/logging/alerts +
+
0%0/9780%0/10%0/10%0/978
src/logging/elasticsearch +
+
0%0/6790%0/20%0/20%0/679
src/logging/parsing +
+
0%0/5800%0/10%0/10%0/580
src/logging/retention +
+
0%0/7750%0/10%0/10%0/775
src/matching +
+
0%0/6780%0/20%0/20%0/678
src/matching/algorithms +
+
0%0/16540%0/30%0/30%0/1654
src/matching/audit +
+
0%0/4610%0/10%0/10%0/461
src/matching/dto +
+
0%0/2140%0/10%0/10%0/214
src/matching/entities +
+
0%0/2340%0/20%0/20%0/234
src/matching/events +
+
0%0/4500%0/10%0/10%0/450
src/modules/dao +
+
0%0/1290%0/20%0/20%0/129
src/modules/dao/dto +
+
0%0/190%0/10%0/10%0/19
src/modules/dao/entities +
+
0%0/140%0/10%0/10%0/14
src/modules/energy +
+
0%0/1180%0/20%0/20%0/118
src/modules/energy/dto +
+
0%0/70%0/10%0/10%0/7
src/modules/energy/entities +
+
0%0/110%0/10%0/10%0/11
src/monitoring +
+
0%0/5590%0/30%0/30%0/559
src/monitoring/alerts +
+
0%0/4020%0/10%0/10%0/402
src/monitoring/dto +
+
0%0/3170%0/10%0/10%0/317
src/monitoring/entities +
+
0%0/1120%0/10%0/10%0/112
src/monitoring/retry +
+
0%0/4340%0/10%0/10%0/434
src/monitoring/workflows +
+
0%0/4870%0/10%0/10%0/487
src/multisig +
+
0%0/4740%0/20%0/20%0/474
src/multisig/dto +
+
0%0/3020%0/10%0/10%0/302
src/multisig/entities +
+
0%0/2180%0/20%0/20%0/218
src/multisig/recovery +
+
0%0/6150%0/10%0/10%0/615
src/multisig/workflows +
+
0%0/3620%0/10%0/10%0/362
src/pricing +
+
0%0/4760%0/30%0/30%0/476
src/pricing/algorithms +
+
0%0/6770%0/40%0/40%0/677
src/pricing/dto +
+
0%0/1090%0/10%0/10%0/109
src/pricing/entities +
+
0%0/630%0/10%0/10%0/63
src/risk +
+
0%0/290%0/10%0/10%0/29
src/risk/assessment +
+
81.2%203/25058.33%21/3684.61%11/1381.2%203/250
src/risk/calculations +
+
0%0/5270%0/10%0/10%0/527
src/risk/controller +
+
0%0/4110%0/10%0/10%0/411
src/risk/dto +
+
100%151/151100%2/2100%0/0100%151/151
src/risk/entities +
+
100%49/49100%0/0100%0/0100%49/49
src/risk/hedging +
+
0%0/4430%0/10%0/10%0/443
src/risk/monitoring +
+
0%0/3410%0/10%0/10%0/341
src/risk/testing +
+
0%0/6950%0/10%0/10%0/695
src/scheduler +
+
0%0/8430%0/20%0/20%0/843
src/scheduler/controllers +
+
0%0/4770%0/10%0/10%0/477
src/scheduler/dto +
+
0%0/4920%0/10%0/10%0/492
src/scheduler/entities +
+
0%0/2720%0/10%0/10%0/272
src/scheduler/jobs +
+
0%0/22150%0/30%0/30%0/2215
src/scheduler/services +
+
0%0/5270%0/10%0/10%0/527
src/security +
+
0%0/1560%0/20%0/20%0/156
src/security/alerts +
+
0%0/2500%0/10%0/10%0/250
src/security/ddos +
+
0%0/400%0/10%0/10%0/40
src/security/detectors +
+
0%0/4430%0/20%0/20%0/443
src/security/entities +
+
0%0/760%0/10%0/10%0/76
src/security/headers +
+
0%0/460%0/10%0/10%0/46
src/security/middleware +
+
0%0/690%0/10%0/10%0/69
src/security/monitoring +
+
0%0/1930%0/10%0/10%0/193
src/security/response +
+
0%0/3100%0/10%0/10%0/310
src/security/waf +
+
0%0/900%0/10%0/10%0/90
src/sentiment +
+
0%0/1170%0/20%0/20%0/117
src/sentiment/aggregators +
+
0%0/320%0/10%0/10%0/32
src/sentiment/algorithms +
+
0%0/650%0/10%0/10%0/65
src/sentiment/correlation +
+
0%0/710%0/10%0/10%0/71
src/sentiment/dto +
+
0%0/720%0/10%0/10%0/72
src/sentiment/entities +
+
0%0/750%0/10%0/10%0/75
src/sentiment/monitors +
+
0%0/360%0/10%0/10%0/36
src/sentiment/nlp +
+
0%0/1190%0/10%0/10%0/119
src/settings +
+
0%0/4190%0/30%0/30%0/419
src/settings/dto +
+
0%0/710%0/20%0/20%0/71
src/settings/entities +
+
0%0/1170%0/20%0/20%0/117
src/settings/validators +
+
0%0/370%0/10%0/10%0/37
src/sync +
+
0%0/4560%0/20%0/20%0/456
src/sync/entities +
+
0%0/920%0/10%0/10%0/92
src/sync/handlers +
+
0%0/4290%0/10%0/10%0/429
src/sync/optimizers +
+
0%0/5390%0/10%0/10%0/539
src/sync/recovery +
+
0%0/5500%0/10%0/10%0/550
src/sync/resolvers +
+
0%0/5130%0/10%0/10%0/513
src/tracing +
+
0%0/1830%0/30%0/30%0/183
src/tracing/analytics +
+
90.32%56/6260%3/5100%3/390.32%56/62
src/tracing/filters +
+
0%0/430%0/10%0/10%0/43
src/tracing/instrumentation +
+
0%0/810%0/10%0/10%0/81
src/tracing/interceptors +
+
75%72/9685.71%6/780%4/575%72/96
src/webhooks +
+
0%0/4750%0/30%0/30%0/475
src/webhooks/auth +
+
0%0/440%0/10%0/10%0/44
src/webhooks/dto +
+
0%0/1450%0/10%0/10%0/145
src/webhooks/entities +
+
0%0/1170%0/20%0/20%0/117
src/webhooks/filters +
+
0%0/830%0/10%0/10%0/83
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000..6ed6831 Binary files /dev/null and b/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..4ed70ae --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov-report/src/ai/recommendations/ab-testing.service.ts.html b/coverage/lcov-report/src/ai/recommendations/ab-testing.service.ts.html new file mode 100644 index 0000000..1be58d4 --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/ab-testing.service.ts.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for src/ai/recommendations/ab-testing.service.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations ab-testing.service.ts

+
+ +
+ 0% + Statements + 0/42 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/42 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class AbTestingService {
+  private readonly logger = new Logger(AbTestingService.name);
+
+  // A/B test framework for recommendation strategies
+  async assignUserToTest(userId: string): Promise<string> {
+    // Randomly assign users to control or treatment groups
+    const group = Math.random() > 0.5 ? 'treatment' : 'control';
+    this.logger.log(`User ${userId} assigned to ${group} group`);
+    return group;
+  }
+
+  async trackRecommendationPerformance(
+    testId: string,
+    userId: string,
+    recommendationId: string,
+    outcome: any,
+  ): Promise<void> {
+    this.logger.log(`Tracking performance for test ${testId}`);
+    // Track metrics like acceptance rate, profitability, user engagement
+  }
+
+  async analyzeTestResults(testId: string): Promise<any> {
+    this.logger.log(`Analyzing A/B test results for ${testId}`);
+
+    // Statistical analysis of test results
+    return {
+      testId,
+      status: 'completed',
+      significance: 0.95,
+      improvement: 0.15, // 15% improvement in treatment group
+      confidence: 0.92,
+    };
+  }
+
+  isFeatureEnabled(userId: string, feature: string): boolean {
+    // Check if user should have access to specific features
+    return true;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/ai-recommendations.controller.ts.html b/coverage/lcov-report/src/ai/recommendations/ai-recommendations.controller.ts.html new file mode 100644 index 0000000..a54663c --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/ai-recommendations.controller.ts.html @@ -0,0 +1,337 @@ + + + + + + Code coverage report for src/ai/recommendations/ai-recommendations.controller.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations ai-recommendations.controller.ts

+
+ +
+ 0% + Statements + 0/84 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/84 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, Post, Body, Param, Query } from '@nestjs/common';
+import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
+import { RecommendationEngineService } from './recommendation-engine.service';
+import { MlModelService } from './ml-model.service';
+import { UserBehaviorService } from './user-behavior.service';
+import { AbTestingService } from './ab-testing.service';
+
+@ApiTags('AI Recommendations')
+@Controller('ai/recommendations')
+export class AiRecommendationsController {
+  constructor(
+    private readonly recommendationEngine: RecommendationEngineService,
+    private readonly mlModelService: MlModelService,
+    private readonly userBehaviorService: UserBehaviorService,
+    private readonly abTestService: AbTestingService,
+  ) {}
+
+  @Get()
+  @ApiOperation({ summary: 'Get personalized recommendations for user' })
+  @ApiResponse({
+    status: 200,
+    description: 'Returns AI-powered recommendations',
+  })
+  async getRecommendations(
+    @Query('userId') userId: string,
+    @Query('asset') asset?: string,
+  ): Promise<any> {
+    return this.recommendationEngine.generateRecommendations(userId, asset);
+  }
+
+  @Get(':userId/behavior')
+  @ApiOperation({ summary: 'Get user behavior analysis' })
+  @ApiResponse({ status: 200, description: 'Returns user behavior profile' })
+  async getUserBehavior(@Param('userId') userId: string): Promise<any> {
+    return this.userBehaviorService.analyzeUserBehavior(userId);
+  }
+
+  @Post(':recommendationId/accept')
+  @ApiOperation({ summary: 'Accept a recommendation' })
+  @ApiResponse({ status: 200, description: 'Recommendation accepted' })
+  async acceptRecommendation(
+    @Param('recommendationId') recommendationId: string,
+  ): Promise<void> {
+    // Track recommendation acceptance
+  }
+
+  @Post(':recommendationId/outcome')
+  @ApiOperation({ summary: 'Track recommendation outcome' })
+  @ApiResponse({ status: 200, description: 'Outcome tracked' })
+  async trackOutcome(
+    @Param('recommendationId') recommendationId: string,
+    @Body() outcomeData: any,
+  ): Promise<void> {
+    await this.userBehaviorService.trackRecommendationOutcome(
+      recommendationId,
+      outcomeData.outcome,
+      outcomeData.return,
+    );
+  }
+
+  @Get('model/performance')
+  @ApiOperation({ summary: 'Get ML model performance metrics' })
+  @ApiResponse({
+    status: 200,
+    description: 'Returns model accuracy and metrics',
+  })
+  async getModelPerformance(): Promise<any> {
+    return this.mlModelService.getModelPerformance();
+  }
+
+  @Post('model/train')
+  @ApiOperation({ summary: 'Trigger model training' })
+  @ApiResponse({ status: 200, description: 'Training started' })
+  async trainModel(@Body() trainingData: any[]): Promise<void> {
+    await this.mlModelService.trainModel(trainingData);
+  }
+
+  @Get('ab-tests/:testId/results')
+  @ApiOperation({ summary: 'Get A/B test results' })
+  @ApiResponse({ status: 200, description: 'Returns A/B test analysis' })
+  async getAbTestResults(@Param('testId') testId: string): Promise<any> {
+    return this.abTestService.analyzeTestResults(testId);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/ai-recommendations.module.ts.html b/coverage/lcov-report/src/ai/recommendations/ai-recommendations.module.ts.html new file mode 100644 index 0000000..4dd8835 --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/ai-recommendations.module.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/ai/recommendations/ai-recommendations.module.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations ai-recommendations.module.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { Recommendation } from './entities/recommendation.entity';
+import { MlModelService } from './ml-model.service';
+import { UserBehaviorService } from './user-behavior.service';
+import { MarketPatternService } from './market-pattern.service';
+import { RecommendationEngineService } from './recommendation-engine.service';
+import { AbTestingService } from './ab-testing.service';
+import { AiRecommendationsController } from './ai-recommendations.controller';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([Recommendation])],
+  controllers: [AiRecommendationsController],
+  providers: [
+    MlModelService,
+    UserBehaviorService,
+    MarketPatternService,
+    RecommendationEngineService,
+    AbTestingService,
+  ],
+  exports: [
+    MlModelService,
+    UserBehaviorService,
+    MarketPatternService,
+    RecommendationEngineService,
+    AbTestingService,
+  ],
+})
+export class AiRecommendationsModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/dto/index.html b/coverage/lcov-report/src/ai/recommendations/dto/index.html new file mode 100644 index 0000000..9c8346e --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/ai/recommendations/dto + + + + + + + + + +
+
+

All files src/ai/recommendations/dto

+
+ +
+ 0% + Statements + 0/69 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
recommendation.dto.ts +
+
0%0/690%0/10%0/10%0/69
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/dto/recommendation.dto.ts.html b/coverage/lcov-report/src/ai/recommendations/dto/recommendation.dto.ts.html new file mode 100644 index 0000000..81e5fa2 --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/dto/recommendation.dto.ts.html @@ -0,0 +1,292 @@ + + + + + + Code coverage report for src/ai/recommendations/dto/recommendation.dto.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations/dto recommendation.dto.ts

+
+ +
+ 0% + Statements + 0/69 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ApiProperty } from '@nestjs/swagger';
+import {
+  IsUUID,
+  IsOptional,
+  IsNumber,
+  IsString,
+  IsEnum,
+} from 'class-validator';
+import { RecommendationType } from '../entities/recommendation.entity';
+
+export class CreateRecommendationDto {
+  @ApiProperty({ description: 'User ID' })
+  @IsUUID()
+  userId: string;
+
+  @ApiProperty({ description: 'Asset symbol', required: false })
+  @IsOptional()
+  @IsString()
+  assetSymbol?: string;
+
+  @ApiProperty({ description: 'Recommendation type' })
+  @IsEnum(RecommendationType)
+  type: RecommendationType;
+
+  @ApiProperty({ description: 'Target price', required: false })
+  @IsOptional()
+  @IsNumber()
+  targetPrice?: number;
+
+  @ApiProperty({ description: 'Stop loss', required: false })
+  @IsOptional()
+  @IsNumber()
+  stopLoss?: number;
+}
+
+export class AcceptRecommendationDto {
+  @ApiProperty({ description: 'Recommendation ID' })
+  @IsUUID()
+  recommendationId: string;
+}
+
+export class RecommendationResponseDto {
+  @ApiProperty({ description: 'Recommendation ID' })
+  id: string;
+
+  @ApiProperty({ description: 'User ID' })
+  userId: string;
+
+  @ApiProperty({ description: 'Recommendation type' })
+  type: RecommendationType;
+
+  @ApiProperty({ description: 'Description' })
+  description: string;
+
+  @ApiProperty({ description: 'Reasoning' })
+  reasoning: string;
+
+  @ApiProperty({ description: 'Confidence score' })
+  confidenceScore: number;
+
+  @ApiProperty({ description: 'Asset symbol', required: false })
+  assetSymbol?: string;
+
+  @ApiProperty({ description: 'Target price', required: false })
+  targetPrice?: number;
+
+  @ApiProperty({ description: 'Created at' })
+  createdAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/entities/index.html b/coverage/lcov-report/src/ai/recommendations/entities/index.html new file mode 100644 index 0000000..4335602 --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/ai/recommendations/entities + + + + + + + + + +
+
+

All files src/ai/recommendations/entities

+
+ +
+ 0% + Statements + 0/90 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/90 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
recommendation.entity.ts +
+
0%0/900%0/10%0/10%0/90
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/entities/recommendation.entity.ts.html b/coverage/lcov-report/src/ai/recommendations/entities/recommendation.entity.ts.html new file mode 100644 index 0000000..673997b --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/entities/recommendation.entity.ts.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for src/ai/recommendations/entities/recommendation.entity.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations/entities recommendation.entity.ts

+
+ +
+ 0% + Statements + 0/90 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/90 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  Index,
+} from 'typeorm';
+
+export enum RecommendationType {
+  BUY = 'buy',
+  SELL = 'sell',
+  HOLD = 'hold',
+  DIVERSIFY = 'diversify',
+}
+
+export enum ConfidenceLevel {
+  VERY_LOW = 'very_low',
+  LOW = 'low',
+  MEDIUM = 'medium',
+  HIGH = 'high',
+  VERY_HIGH = 'very_high',
+}
+
+@Entity('recommendations')
+export class Recommendation {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column('uuid')
+  @Index()
+  userId: string;
+
+  @Column({ type: 'enum', enum: RecommendationType })
+  type: RecommendationType;
+
+  @Column('text')
+  description: string;
+
+  @Column('text')
+  reasoning: string;
+
+  @Column({ type: 'float', default: 0 })
+  confidenceScore: number;
+
+  @Column({
+    type: 'enum',
+    enum: ConfidenceLevel,
+    default: ConfidenceLevel.MEDIUM,
+  })
+  confidenceLevel: ConfidenceLevel;
+
+  @Column('jsonb')
+  metadata: any;
+
+  @Column({ nullable: true })
+  @Index()
+  assetSymbol?: string;
+
+  @Column({ nullable: true })
+  targetPrice?: number;
+
+  @Column({ nullable: true })
+  stopLoss?: number;
+
+  @Column({ default: false })
+  isAccepted: boolean;
+
+  @Column({ nullable: true })
+  acceptedAt?: Date;
+
+  @Column({ nullable: true })
+  outcome?: 'profitable' | 'loss' | 'neutral';
+
+  @Column({ nullable: true })
+  actualReturn?: number;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @Column({ default: true })
+  isActive: boolean;
+
+  getAccuracyMetrics(): { accuracy: number; avgReturn: number } {
+    // Calculate recommendation accuracy based on historical outcomes
+    return {
+      accuracy: this.confidenceScore,
+      avgReturn: this.actualReturn || 0,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/index.html b/coverage/lcov-report/src/ai/recommendations/index.html new file mode 100644 index 0000000..bdcf011 --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/index.html @@ -0,0 +1,206 @@ + + + + + + Code coverage report for src/ai/recommendations + + + + + + + + + +
+
+

All files src/ai/recommendations

+
+ +
+ 0% + Statements + 0/704 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 0% + Lines + 0/704 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ab-testing.service.ts +
+
0%0/420%0/10%0/10%0/42
ai-recommendations.controller.ts +
+
0%0/840%0/10%0/10%0/84
ai-recommendations.module.ts +
+
0%0/290%0/10%0/10%0/29
market-pattern.service.ts +
+
0%0/1110%0/10%0/10%0/111
ml-model.service.ts +
+
0%0/1260%0/10%0/10%0/126
recommendation-engine.service.ts +
+
0%0/1520%0/10%0/10%0/152
user-behavior.service.ts +
+
0%0/1600%0/10%0/10%0/160
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/market-pattern.service.ts.html b/coverage/lcov-report/src/ai/recommendations/market-pattern.service.ts.html new file mode 100644 index 0000000..d23d193 --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/market-pattern.service.ts.html @@ -0,0 +1,418 @@ + + + + + + Code coverage report for src/ai/recommendations/market-pattern.service.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations market-pattern.service.ts

+
+ +
+ 0% + Statements + 0/111 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/111 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+export interface MarketPattern {
+  type: string;
+  strength: number;
+  direction: 'bullish' | 'bearish' | 'neutral';
+  confidence: number;
+  timeFrame: string;
+  indicators: string[];
+}
+
+@Injectable()
+export class MarketPatternService {
+  private readonly logger = new Logger(MarketPatternService.name);
+
+  async detectPatterns(assetSymbol: string): Promise<MarketPattern[]> {
+    this.logger.log(`Detecting market patterns for ${assetSymbol}`);
+
+    const patterns: MarketPattern[] = [];
+
+    // Technical analysis patterns
+    const technicalPatterns =
+      await this.analyzeTechnicalIndicators(assetSymbol);
+    patterns.push(...technicalPatterns);
+
+    // Price action patterns
+    const priceActionPatterns = await this.analyzePriceAction(assetSymbol);
+    patterns.push(...priceActionPatterns);
+
+    // Volume patterns
+    const volumePatterns = await this.analyzeVolumePatterns(assetSymbol);
+    patterns.push(...volumePatterns);
+
+    return patterns;
+  }
+
+  async getMarketTrend(
+    assetSymbol: string,
+  ): Promise<'bullish' | 'bearish' | 'neutral'> {
+    const patterns = await this.detectPatterns(assetSymbol);
+
+    const bullishCount = patterns.filter(
+      (p) => p.direction === 'bullish',
+    ).length;
+    const bearishCount = patterns.filter(
+      (p) => p.direction === 'bearish',
+    ).length;
+
+    if (bullishCount > bearishCount * 1.5) return 'bullish';
+    if (bearishCount > bullishCount * 1.5) return 'bearish';
+    return 'neutral';
+  }
+
+  async getSupportResistanceLevels(
+    assetSymbol: string,
+  ): Promise<{ support: number[]; resistance: number[] }> {
+    // Calculate support and resistance levels using historical data
+    return {
+      support: [95, 90, 85], // Placeholder
+      resistance: [105, 110, 115], // Placeholder
+    };
+  }
+
+  private async analyzeTechnicalIndicators(
+    assetSymbol: string,
+  ): Promise<MarketPattern[]> {
+    // Analyze RSI, MACD, Moving Averages, etc.
+    return [
+      {
+        type: 'RSI_DIVERGENCE',
+        strength: 0.7,
+        direction: 'bullish',
+        confidence: 0.75,
+        timeFrame: '4h',
+        indicators: ['RSI', 'Price'],
+      },
+    ];
+  }
+
+  private async analyzePriceAction(
+    assetSymbol: string,
+  ): Promise<MarketPattern[]> {
+    // Detect chart patterns like head & shoulders, triangles, etc.
+    return [
+      {
+        type: 'ASCENDING_TRIANGLE',
+        strength: 0.6,
+        direction: 'bullish',
+        confidence: 0.65,
+        timeFrame: '1d',
+        indicators: ['Price', 'Volume'],
+      },
+    ];
+  }
+
+  private async analyzeVolumePatterns(
+    assetSymbol: string,
+  ): Promise<MarketPattern[]> {
+    // Analyze volume trends and anomalies
+    return [
+      {
+        type: 'VOLUME_SPIKE',
+        strength: 0.8,
+        direction: 'bullish',
+        confidence: 0.7,
+        timeFrame: '1h',
+        indicators: ['Volume', 'OBV'],
+      },
+    ];
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/ml-model.service.ts.html b/coverage/lcov-report/src/ai/recommendations/ml-model.service.ts.html new file mode 100644 index 0000000..dcdba49 --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/ml-model.service.ts.html @@ -0,0 +1,463 @@ + + + + + + Code coverage report for src/ai/recommendations/ml-model.service.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations ml-model.service.ts

+
+ +
+ 0% + Statements + 0/126 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/126 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { UserBehaviorProfile } from './user-behavior.service';
+import { MarketPattern } from './market-pattern.service';
+
+export interface ModelPrediction {
+  action: 'buy' | 'sell' | 'hold';
+  confidence: number;
+  expectedReturn: number;
+  riskLevel: number;
+  timeHorizon: string;
+}
+
+@Injectable()
+export class MlModelService {
+  private readonly logger = new Logger(MlModelService.name);
+
+  // In production, integrate with actual ML frameworks (TensorFlow, PyTorch, etc.)
+  async predict(
+    userBehavior: UserBehaviorProfile,
+    marketPatterns: MarketPattern[],
+    assetData: any,
+  ): Promise<ModelPrediction> {
+    this.logger.log('Generating ML prediction');
+
+    // Feature engineering
+    const features = this.extractFeatures(
+      userBehavior,
+      marketPatterns,
+      assetData,
+    );
+
+    // Run inference through trained model
+    const prediction = await this.runInference(features);
+
+    return prediction;
+  }
+
+  async trainModel(trainingData: any[]): Promise<void> {
+    this.logger.log('Training ML model');
+
+    // Implement model training pipeline
+    // - Data preprocessing
+    // - Feature extraction
+    // - Model training
+    // - Validation
+    // - Deployment
+
+    // Placeholder for actual training logic
+  }
+
+  async updateModelIncremental(newData: any[]): Promise<void> {
+    this.logger.log('Updating model with new data');
+    // Implement online learning / incremental updates
+  }
+
+  private extractFeatures(
+    userBehavior: UserBehaviorProfile,
+    marketPatterns: MarketPattern[],
+    assetData: any,
+  ): any {
+    // Extract relevant features for prediction
+    return {
+      userRiskScore: userBehavior.riskTolerance,
+      userSuccessRate: userBehavior.successRate,
+      marketSentiment: this.calculateMarketSentiment(marketPatterns),
+      technicalScore: this.calculateTechnicalScore(marketPatterns),
+      fundamentalScore: assetData?.fundamentalScore || 0.5,
+      volatility: assetData?.volatility || 0.2,
+    };
+  }
+
+  private calculateMarketSentiment(patterns: MarketPattern[]): number {
+    if (patterns.length === 0) return 0;
+
+    const sentimentMap = { bullish: 1, neutral: 0, bearish: -1 };
+    const weightedSum = patterns.reduce((sum, p) => {
+      return sum + sentimentMap[p.direction] * p.confidence * p.strength;
+    }, 0);
+
+    return weightedSum / patterns.length;
+  }
+
+  private calculateTechnicalScore(patterns: MarketPattern[]): number {
+    if (patterns.length === 0) return 0.5;
+
+    const avgConfidence =
+      patterns.reduce((sum, p) => sum + p.confidence, 0) / patterns.length;
+    const avgStrength =
+      patterns.reduce((sum, p) => sum + p.strength, 0) / patterns.length;
+
+    return (avgConfidence + avgStrength) / 2;
+  }
+
+  private async runInference(features: any): Promise<ModelPrediction> {
+    // Placeholder for actual ML inference
+    // In production, use trained model to generate predictions
+
+    const baseConfidence = 0.75;
+    const expectedReturn = (Math.random() - 0.3) * 0.2; // -6% to +14%
+
+    let action: 'buy' | 'sell' | 'hold' = 'hold';
+    if (expectedReturn > 0.05) action = 'buy';
+    else if (expectedReturn < -0.05) action = 'sell';
+
+    return {
+      action,
+      confidence: baseConfidence,
+      expectedReturn,
+      riskLevel: 0.4,
+      timeHorizon: '1-3 months',
+    };
+  }
+
+  getModelPerformance(): {
+    accuracy: number;
+    precision: number;
+    recall: number;
+  } {
+    // Return model performance metrics
+    return {
+      accuracy: 0.78, // Target: >75%
+      precision: 0.76,
+      recall: 0.74,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/recommendation-engine.service.ts.html b/coverage/lcov-report/src/ai/recommendations/recommendation-engine.service.ts.html new file mode 100644 index 0000000..165bcee --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/recommendation-engine.service.ts.html @@ -0,0 +1,541 @@ + + + + + + Code coverage report for src/ai/recommendations/recommendation-engine.service.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations recommendation-engine.service.ts

+
+ +
+ 0% + Statements + 0/152 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/152 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { UserBehaviorService } from './user-behavior.service';
+import { MarketPatternService } from './market-pattern.service';
+import { MlModelService } from './ml-model.service';
+import {
+  Recommendation,
+  RecommendationType,
+  ConfidenceLevel,
+} from '../entities/recommendation.entity';
+
+@Injectable()
+export class RecommendationEngineService {
+  private readonly logger = new Logger(RecommendationEngineService.name);
+
+  constructor(
+    private readonly userBehaviorService: UserBehaviorService,
+    private readonly marketPatternService: MarketPatternService,
+    private readonly mlModelService: MlModelService,
+  ) {}
+
+  async generateRecommendations(
+    userId: string,
+    assetSymbol?: string,
+  ): Promise<Partial<Recommendation>[]> {
+    this.logger.log(`Generating recommendations for user ${userId}`);
+
+    // Get user behavior profile
+    const userBehavior =
+      await this.userBehaviorService.analyzeUserBehavior(userId);
+
+    // Get market patterns
+    const marketPatterns = assetSymbol
+      ? await this.marketPatternService.detectPatterns(assetSymbol)
+      : await this.getBroadMarketPatterns();
+
+    // Generate ML predictions
+    const predictions = await this.generatePredictions(
+      userBehavior,
+      marketPatterns,
+      assetSymbol,
+    );
+
+    // Convert predictions to recommendations
+    return predictions.map((prediction) =>
+      this.createRecommendation(userId, prediction, userBehavior),
+    );
+  }
+
+  private async generatePredictions(
+    userBehavior: any,
+    marketPatterns: any[],
+    assetSymbol?: string,
+  ): Promise<any[]> {
+    if (assetSymbol) {
+      const assetData = await this.getAssetData(assetSymbol);
+      const prediction = await this.mlModelService.predict(
+        userBehavior,
+        marketPatterns,
+        assetData,
+      );
+      return [{ assetSymbol, ...prediction }];
+    } else {
+      // Generate recommendations for multiple assets
+      const topAssets = ['ENERGY', 'SOLAR', 'WIND', 'GRID'];
+      const predictions = [];
+
+      for (const asset of topAssets) {
+        const assetData = await this.getAssetData(asset);
+        const prediction = await this.mlModelService.predict(
+          userBehavior,
+          marketPatterns,
+          assetData,
+        );
+        predictions.push({ assetSymbol: asset, ...prediction });
+      }
+
+      return predictions;
+    }
+  }
+
+  private createRecommendation(
+    userId: string,
+    prediction: any,
+    userBehavior: any,
+  ): Partial<Recommendation> {
+    const type = this.mapActionToRecommendationType(prediction.action);
+    const confidenceLevel = this.mapConfidenceToLevel(prediction.confidence);
+
+    return {
+      userId,
+      type,
+      description: `${type.toUpperCase()} recommendation for ${prediction.assetSymbol}`,
+      reasoning: this.generateReasoning(prediction, userBehavior),
+      confidenceScore: prediction.confidence,
+      confidenceLevel,
+      assetSymbol: prediction.assetSymbol,
+      targetPrice: prediction.expectedReturn > 0 ? 110 : undefined,
+      stopLoss: prediction.expectedReturn < 0 ? 90 : undefined,
+      metadata: {
+        expectedReturn: prediction.expectedReturn,
+        riskLevel: prediction.riskLevel,
+        timeHorizon: prediction.timeHorizon,
+        generatedAt: new Date(),
+      },
+    };
+  }
+
+  private mapActionToRecommendationType(action: string): RecommendationType {
+    switch (action) {
+      case 'buy':
+        return RecommendationType.BUY;
+      case 'sell':
+        return RecommendationType.SELL;
+      default:
+        return RecommendationType.HOLD;
+    }
+  }
+
+  private mapConfidenceToLevel(confidence: number): ConfidenceLevel {
+    if (confidence >= 0.9) return ConfidenceLevel.VERY_HIGH;
+    if (confidence >= 0.75) return ConfidenceLevel.HIGH;
+    if (confidence >= 0.5) return ConfidenceLevel.MEDIUM;
+    if (confidence >= 0.3) return ConfidenceLevel.LOW;
+    return ConfidenceLevel.VERY_LOW;
+  }
+
+  private generateReasoning(prediction: any, userBehavior: any): string {
+    const reasons = [
+      `ML model predicts ${(prediction.expectedReturn * 100).toFixed(1)}% expected return`,
+      `Confidence: ${(prediction.confidence * 100).toFixed(0)}%`,
+      `Risk level: ${(prediction.riskLevel * 100).toFixed(0)}%`,
+      `Matches your ${userBehavior.tradingStyle} trading style`,
+    ];
+
+    return reasons.join('. ');
+  }
+
+  private async getBroadMarketPatterns(): Promise<any[]> {
+    return [
+      {
+        type: 'MARKET_UPTREND',
+        strength: 0.7,
+        direction: 'bullish' as const,
+        confidence: 0.75,
+      },
+    ];
+  }
+
+  private async getAssetData(assetSymbol: string): Promise<any> {
+    return { fundamentalScore: 0.6, volatility: 0.25 };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/ai/recommendations/user-behavior.service.ts.html b/coverage/lcov-report/src/ai/recommendations/user-behavior.service.ts.html new file mode 100644 index 0000000..df1eb72 --- /dev/null +++ b/coverage/lcov-report/src/ai/recommendations/user-behavior.service.ts.html @@ -0,0 +1,565 @@ + + + + + + Code coverage report for src/ai/recommendations/user-behavior.service.ts + + + + + + + + + +
+
+

All files / src/ai/recommendations user-behavior.service.ts

+
+ +
+ 0% + Statements + 0/160 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/160 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  Recommendation,
+  RecommendationType,
+  ConfidenceLevel,
+} from '../entities/recommendation.entity';
+
+export interface UserBehaviorProfile {
+  riskTolerance: number; // 0-1
+  tradingFrequency: 'low' | 'medium' | 'high';
+  preferredAssets: string[];
+  avgTradeSize: number;
+  successRate: number;
+  tradingStyle: 'conservative' | 'moderate' | 'aggressive';
+  activityPattern: {
+    mostActiveHours: number[];
+    mostActiveDays: string[];
+  };
+}
+
+@Injectable()
+export class UserBehaviorService {
+  private readonly logger = new Logger(UserBehaviorService.name);
+
+  constructor(
+    @InjectRepository(Recommendation)
+    private readonly recommendationRepo: Repository<Recommendation>,
+  ) {}
+
+  async analyzeUserBehavior(userId: string): Promise<UserBehaviorProfile> {
+    this.logger.log(`Analyzing user behavior for ${userId}`);
+
+    // In production, query actual trading history and user data
+    const tradingHistory = await this.getUserTradingHistory(userId);
+
+    return {
+      riskTolerance: this.calculateRiskTolerance(tradingHistory),
+      tradingFrequency: this.determineTradingFrequency(tradingHistory),
+      preferredAssets: this.getPreferredAssets(tradingHistory),
+      avgTradeSize: this.calculateAverageTradeSize(tradingHistory),
+      successRate: this.calculateSuccessRate(tradingHistory),
+      tradingStyle: this.determineTradingStyle(tradingHistory),
+      activityPattern: await this.getActivityPattern(userId),
+    };
+  }
+
+  async getUserPreferences(userId: string): Promise<any> {
+    // Fetch user preferences from database or ML model
+    return {
+      riskAppetite: 'moderate',
+      investmentGoals: ['growth', 'income'],
+      sectorPreferences: ['renewable_energy', 'technology'],
+      geographicPreferences: ['north_america', 'europe'],
+    };
+  }
+
+  async trackRecommendationOutcome(
+    recommendationId: string,
+    outcome: 'profitable' | 'loss' | 'neutral',
+    actualReturn?: number,
+  ): Promise<void> {
+    const recommendation = await this.recommendationRepo.findOne({
+      where: { id: recommendationId },
+    });
+
+    if (recommendation) {
+      recommendation.outcome = outcome;
+      recommendation.actualReturn = actualReturn || 0;
+      await this.recommendationRepo.save(recommendation);
+
+      this.logger.log(
+        `Tracked outcome for recommendation ${recommendationId}: ${outcome}`,
+      );
+    }
+  }
+
+  private async getUserTradingHistory(userId: string): Promise<any[]> {
+    // Query actual trading history from database
+    return []; // Placeholder
+  }
+
+  private calculateRiskTolerance(tradingHistory: any[]): number {
+    // Analyze historical trades to determine risk tolerance
+    // Consider factors like: asset volatility, position sizing, stop-loss usage, leverage usage
+
+    return 0.6; // Placeholder
+  }
+
+  private determineTradingFrequency(
+    tradingHistory: any[],
+  ): 'low' | 'medium' | 'high' {
+    const tradesPerMonth = tradingHistory.length / 12; // Assuming 1 year of data
+
+    if (tradesPerMonth < 5) return 'low';
+    if (tradesPerMonth < 20) return 'medium';
+    return 'high';
+  }
+
+  private getPreferredAssets(tradingHistory: any[]): string[] {
+    // Extract most frequently traded assets
+    const assetCounts = tradingHistory.reduce(
+      (acc, trade) => {
+        acc[trade.asset] = (acc[trade.asset] || 0) + 1;
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+
+    return Object.entries(assetCounts)
+      .sort((a, b) => b[1] - a[1])
+      .slice(0, 5)
+      .map(([asset]) => asset);
+  }
+
+  private calculateAverageTradeSize(tradingHistory: any[]): number {
+    if (tradingHistory.length === 0) return 0;
+
+    const totalSize = tradingHistory.reduce(
+      (sum, trade) => sum + trade.size,
+      0,
+    );
+    return totalSize / tradingHistory.length;
+  }
+
+  private calculateSuccessRate(tradingHistory: any[]): number {
+    if (tradingHistory.length === 0) return 0.5;
+
+    const profitableTrades = tradingHistory.filter((t) => t.profit > 0).length;
+    return profitableTrades / tradingHistory.length;
+  }
+
+  private determineTradingStyle(
+    tradingHistory: any[],
+  ): 'conservative' | 'moderate' | 'aggressive' {
+    const riskMetrics = this.calculateRiskMetrics(tradingHistory);
+
+    if (riskMetrics.avgVolatility < 0.15) return 'conservative';
+    if (riskMetrics.avgVolatility < 0.3) return 'moderate';
+    return 'aggressive';
+  }
+
+  private calculateRiskMetrics(tradingHistory: any[]): {
+    avgVolatility: number;
+  } {
+    // Calculate portfolio volatility and other risk metrics
+    return { avgVolatility: 0.25 }; // Placeholder
+  }
+
+  private async getActivityPattern(
+    userId: string,
+  ): Promise<UserBehaviorProfile['activityPattern']> {
+    // Analyze when user is most active
+    return {
+      mostActiveHours: [9, 10, 14, 15], // 9-10 AM, 2-3 PM
+      mostActiveDays: ['Monday', 'Tuesday', 'Wednesday'],
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/analytics.module.ts.html b/coverage/lcov-report/src/analytics/analytics.module.ts.html new file mode 100644 index 0000000..49a43fc --- /dev/null +++ b/coverage/lcov-report/src/analytics/analytics.module.ts.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/analytics/analytics.module.ts + + + + + + + + + +
+
+

All files / src/analytics analytics.module.ts

+
+ +
+ 0% + Statements + 0/21 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { AnalyticsService } from './analytics.service';
+import { AnalyticsData } from './entities/analytics-data.entity';
+import { TradingVolumeReport } from './reports/trading-volume.report';
+import { PriceTrendsReport } from './reports/price-trends.report';
+import { UserPerformanceReport } from './reports/user-performance.report';
+import { MarketEfficiencyReport } from './reports/market-efficiency.report';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([AnalyticsData])],
+  providers: [
+    AnalyticsService,
+    TradingVolumeReport,
+    PriceTrendsReport,
+    UserPerformanceReport,
+    MarketEfficiencyReport,
+  ],
+  exports: [AnalyticsService],
+})
+export class AnalyticsModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/analytics.service.ts.html b/coverage/lcov-report/src/analytics/analytics.service.ts.html new file mode 100644 index 0000000..647b004 --- /dev/null +++ b/coverage/lcov-report/src/analytics/analytics.service.ts.html @@ -0,0 +1,1186 @@ + + + + + + Code coverage report for src/analytics/analytics.service.ts + + + + + + + + + +
+
+

All files / src/analytics analytics.service.ts

+
+ +
+ 0% + Statements + 0/367 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/367 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, BadRequestException } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, Between } from 'typeorm';
+import {
+  AnalyticsData,
+  AnalyticsType,
+  AggregationPeriod,
+} from './entities/analytics-data.entity';
+import { ReportParamsDto, DashboardMetricsDto } from './dto/report-params.dto';
+import { TradingVolumeReport } from './reports/trading-volume.report';
+import { PriceTrendsReport } from './reports/price-trends.report';
+import { UserPerformanceReport } from './reports/user-performance.report';
+import { MarketEfficiencyReport } from './reports/market-efficiency.report';
+
+@Injectable()
+export class AnalyticsService {
+  constructor(
+    @InjectRepository(AnalyticsData)
+    private analyticsRepository: Repository<AnalyticsData>,
+    private tradingVolumeReport: TradingVolumeReport,
+    private priceTrendsReport: PriceTrendsReport,
+    private userPerformanceReport: UserPerformanceReport,
+    private marketEfficiencyReport: MarketEfficiencyReport,
+  ) {}
+
+  /**
+   * Generate trading volume report
+   */
+  async generateTradingVolumeReport(params: ReportParamsDto) {
+    return this.tradingVolumeReport.generateReport(params);
+  }
+
+  /**
+   * Generate price trends report
+   */
+  async generatePriceTrendsReport(params: ReportParamsDto) {
+    return this.priceTrendsReport.generateReport(params);
+  }
+
+  /**
+   * Generate user performance report
+   */
+  async generateUserPerformanceReport(params: ReportParamsDto) {
+    return this.userPerformanceReport.generateReport(params);
+  }
+
+  /**
+   * Generate market efficiency report
+   */
+  async generateMarketEfficiencyReport(params: ReportParamsDto) {
+    return this.marketEfficiencyReport.generateReport(params);
+  }
+
+  /**
+   * Get real-time dashboard metrics
+   */
+  async getDashboardMetrics(params: DashboardMetricsDto) {
+    const timeWindow = params.timeWindowHours || 24;
+    const startDate = new Date(Date.now() - timeWindow * 60 * 60 * 1000);
+    const endDate = new Date();
+
+    const metrics: any = {
+      period: {
+        start: startDate,
+        end: endDate,
+        timeWindowHours: timeWindow,
+      },
+      summary: {
+        totalVolume: 0,
+        totalValue: 0,
+        totalTransactions: 0,
+        averagePrice: 0,
+        renewableEnergyPercentage: 0,
+        marketEfficiencyScore: 0,
+      },
+    };
+
+    // Get trading volume metrics
+    const volumeMetrics = await this.getVolumeMetrics(startDate, endDate);
+    metrics.summary.totalVolume = volumeMetrics.totalVolume;
+    metrics.summary.totalValue = volumeMetrics.totalValue;
+    metrics.summary.totalTransactions = volumeMetrics.totalTransactions;
+    metrics.summary.averagePrice = volumeMetrics.averagePrice;
+
+    // Get renewable energy percentage
+    if (params.includeRenewableMetrics) {
+      const renewableMetrics = await this.getRenewableEnergyMetrics(
+        startDate,
+        endDate,
+      );
+      metrics.summary.renewableEnergyPercentage = renewableMetrics.percentage;
+    }
+
+    // Get market efficiency
+    if (params.includeMarketEfficiency) {
+      const efficiencyMetrics = await this.getMarketEfficiencyMetrics(
+        startDate,
+        endDate,
+      );
+      metrics.summary.marketEfficiencyScore = efficiencyMetrics.score;
+    }
+
+    // Get geographic breakdown
+    if (params.includeGeographicBreakdown) {
+      metrics.geographicBreakdown = await this.getGeographicBreakdown(
+        startDate,
+        endDate,
+      );
+    }
+
+    // Get top performers
+    metrics.topPerformers = await this.getTopPerformers(startDate, endDate, 10);
+
+    // Get recent trends
+    metrics.recentTrends = await this.getRecentTrends(startDate, endDate);
+
+    return metrics;
+  }
+
+  /**
+   * Store analytics data
+   */
+  async storeAnalyticsData(
+    data: Partial<AnalyticsData>,
+  ): Promise<AnalyticsData> {
+    const analyticsData = this.analyticsRepository.create(data);
+    return this.analyticsRepository.save(analyticsData);
+  }
+
+  /**
+   * Get analytics data by type and period
+   */
+  async getAnalyticsData(
+    type: AnalyticsType,
+    period: AggregationPeriod,
+    startDate?: Date,
+    endDate?: Date,
+    userId?: string,
+    gridZoneId?: string,
+    country?: string,
+  ): Promise<AnalyticsData[]> {
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .where('analytics.type = :type', { type })
+      .andWhere('analytics.period = :period', { period });
+
+    if (startDate && endDate) {
+      queryBuilder.andWhere(
+        'analytics.timestamp BETWEEN :startDate AND :endDate',
+        {
+          startDate,
+          endDate,
+        },
+      );
+    }
+
+    if (userId) {
+      queryBuilder.andWhere('analytics.userId = :userId', { userId });
+    }
+
+    if (gridZoneId) {
+      queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', {
+        gridZoneId,
+      });
+    }
+
+    if (country) {
+      queryBuilder.andWhere('analytics.country = :country', { country });
+    }
+
+    queryBuilder.orderBy('analytics.timestamp', 'DESC');
+
+    return queryBuilder.getMany();
+  }
+
+  /**
+   * Export report to different formats
+   */
+  async exportReport(
+    reportData: any,
+    format: 'json' | 'csv' | 'pdf',
+  ): Promise<Buffer | string> {
+    switch (format) {
+      case 'json':
+        return JSON.stringify(reportData, null, 2);
+
+      case 'csv':
+        return this.convertToCSV(reportData);
+
+      case 'pdf':
+        return this.convertToPDF(reportData);
+
+      default:
+        throw new BadRequestException(`Unsupported format: ${format}`);
+    }
+  }
+
+  /**
+   * Schedule automated report generation
+   */
+  async scheduleReport(
+    reportType: AnalyticsType,
+    schedule: string, // Cron expression
+    recipients: string[],
+    params: ReportParamsDto,
+  ): Promise<void> {
+    // This would integrate with a job scheduler like Bull Queue
+    // For now, we'll just log the scheduling request
+    console.log(`Scheduling ${reportType} report with schedule: ${schedule}`);
+    console.log(`Recipients: ${recipients.join(', ')}`);
+    console.log(`Params:`, params);
+  }
+
+  private async getVolumeMetrics(startDate: Date, endDate: Date) {
+    const result = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('SUM(analytics.count)', 'totalVolume')
+      .addSelect('SUM(analytics.totalValue)', 'totalValue')
+      .addSelect('COUNT(analytics.id)', 'totalTransactions')
+      .addSelect('AVG(analytics.averageValue)', 'averagePrice')
+      .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .getRawOne();
+
+    return {
+      totalVolume: parseInt(result?.totalVolume || '0'),
+      totalValue: parseFloat(result?.totalValue || '0'),
+      totalTransactions: parseInt(result?.totalTransactions || '0'),
+      averagePrice: parseFloat(result?.averagePrice || '0'),
+    };
+  }
+
+  private async getRenewableEnergyMetrics(startDate: Date, endDate: Date) {
+    const totalVolumeQuery = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('SUM(analytics.count)', 'totalVolume')
+      .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      });
+
+    const renewableVolumeQuery = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('SUM(analytics.count)', 'renewableVolume')
+      .where('analytics.type = :type', { type: AnalyticsType.RENEWABLE_ENERGY })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      });
+
+    const [totalVolumeResult, renewableVolumeResult] = await Promise.all([
+      totalVolumeQuery.getRawOne(),
+      renewableVolumeQuery.getRawOne(),
+    ]);
+
+    const totalVolume = parseInt(totalVolumeResult?.totalVolume || '0');
+    const renewableVolume = parseInt(
+      renewableVolumeResult?.renewableVolume || '0',
+    );
+
+    return {
+      totalVolume,
+      renewableVolume,
+      percentage: totalVolume > 0 ? (renewableVolume / totalVolume) * 100 : 0,
+    };
+  }
+
+  private async getMarketEfficiencyMetrics(startDate: Date, endDate: Date) {
+    const result = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select("AVG(analytics.data->>'priceEfficiency')", 'efficiency')
+      .where('analytics.type = :type', {
+        type: AnalyticsType.MARKET_EFFICIENCY,
+      })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .getRawOne();
+
+    return {
+      score: parseFloat(result?.efficiency || '0') * 100,
+    };
+  }
+
+  private async getGeographicBreakdown(startDate: Date, endDate: Date) {
+    return this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.country', 'country')
+      .addSelect('SUM(analytics.count)', 'volume')
+      .addSelect('SUM(analytics.totalValue)', 'value')
+      .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .andWhere('analytics.country IS NOT NULL')
+      .groupBy('analytics.country')
+      .orderBy('SUM(analytics.count)', 'DESC')
+      .limit(10)
+      .getRawMany();
+  }
+
+  private async getTopPerformers(
+    startDate: Date,
+    endDate: Date,
+    limit: number,
+  ) {
+    return this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.userId', 'userId')
+      .addSelect("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss')
+      .addSelect('COUNT(analytics.id)', 'tradeCount')
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .andWhere('analytics.userId IS NOT NULL')
+      .groupBy('analytics.userId')
+      .orderBy("SUM(analytics.data->>'profitLoss')", 'DESC')
+      .limit(limit)
+      .getRawMany();
+  }
+
+  private async getRecentTrends(startDate: Date, endDate: Date) {
+    const hourlyData = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.timestamp', 'timestamp')
+      .addSelect("analytics.data->>'price'", 'price')
+      .addSelect('analytics.count', 'volume')
+      .where('analytics.type = :type', { type: AnalyticsType.PRICE_TREND })
+      .andWhere('analytics.period = :period', {
+        period: AggregationPeriod.HOURLY,
+      })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .orderBy('analytics.timestamp', 'ASC')
+      .limit(24) // Last 24 hours
+      .getRawMany();
+
+    return hourlyData.map((item) => ({
+      timestamp: item.timestamp,
+      price: parseFloat(item.price || '0'),
+      volume: parseInt(item.volume || '0'),
+    }));
+  }
+
+  private convertToCSV(data: any): string {
+    // Simple CSV conversion - in a real implementation, you'd use a library like csv-writer
+    const headers = Object.keys(data).join(',');
+    const values = Object.values(data).join(',');
+    return `${headers}\n${values}`;
+  }
+
+  private convertToPDF(data: any): Buffer {
+    // Simple PDF conversion - in a real implementation, you'd use a library like pdfkit
+    const content = JSON.stringify(data, null, 2);
+    return Buffer.from(content, 'utf-8');
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/dto/index.html b/coverage/lcov-report/src/analytics/dto/index.html new file mode 100644 index 0000000..b1644a4 --- /dev/null +++ b/coverage/lcov-report/src/analytics/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/analytics/dto + + + + + + + + + +
+
+

All files src/analytics/dto

+
+ +
+ 0% + Statements + 0/162 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/162 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
report-params.dto.ts +
+
0%0/1620%0/10%0/10%0/162
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/dto/report-params.dto.ts.html b/coverage/lcov-report/src/analytics/dto/report-params.dto.ts.html new file mode 100644 index 0000000..b6e4925 --- /dev/null +++ b/coverage/lcov-report/src/analytics/dto/report-params.dto.ts.html @@ -0,0 +1,571 @@ + + + + + + Code coverage report for src/analytics/dto/report-params.dto.ts + + + + + + + + + +
+
+

All files / src/analytics/dto report-params.dto.ts

+
+ +
+ 0% + Statements + 0/162 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/162 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsOptional,
+  IsString,
+  IsEnum,
+  IsDate,
+  IsNumber,
+  Min,
+  Max,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { ApiPropertyOptional } from '@nestjs/swagger';
+import {
+  AnalyticsType,
+  AggregationPeriod,
+} from '../entities/analytics-data.entity';
+
+export enum ReportFormat {
+  JSON = 'json',
+  CSV = 'csv',
+  PDF = 'pdf',
+}
+
+export class ReportParamsDto {
+  @ApiPropertyOptional({
+    description: 'Type of analytics report',
+    enum: AnalyticsType,
+  })
+  @IsOptional()
+  @IsEnum(AnalyticsType)
+  type?: AnalyticsType;
+
+  @ApiPropertyOptional({
+    description: 'Aggregation period for the data',
+    enum: AggregationPeriod,
+  })
+  @IsOptional()
+  @IsEnum(AggregationPeriod)
+  period?: AggregationPeriod;
+
+  @ApiPropertyOptional({
+    description: 'Start date for the report period',
+    type: Date,
+    example: '2024-01-01',
+  })
+  @IsOptional()
+  @IsDate()
+  @Type(() => Date)
+  startDate?: Date;
+
+  @ApiPropertyOptional({
+    description: 'End date for the report period',
+    type: Date,
+    example: '2024-12-31',
+  })
+  @IsOptional()
+  @IsDate()
+  @Type(() => Date)
+  endDate?: Date;
+
+  @ApiPropertyOptional({
+    description: 'User ID to filter data for specific user',
+    example: 'user-123',
+  })
+  @IsOptional()
+  @IsString()
+  userId?: string;
+
+  @ApiPropertyOptional({
+    description: 'Grid zone ID to filter data for specific zone',
+    example: 'zone-456',
+  })
+  @IsOptional()
+  @IsString()
+  gridZoneId?: string;
+
+  @ApiPropertyOptional({
+    description: 'Country to filter data',
+    example: 'United States',
+  })
+  @IsOptional()
+  @IsString()
+  country?: string;
+
+  @ApiPropertyOptional({
+    description: 'Report output format',
+    enum: ReportFormat,
+    default: ReportFormat.JSON,
+  })
+  @IsOptional()
+  @IsEnum(ReportFormat)
+  format?: ReportFormat = ReportFormat.JSON;
+
+  @ApiPropertyOptional({
+    description: 'Include technical indicators in price trend reports',
+    default: true,
+  })
+  @IsOptional()
+  includeTechnicalIndicators?: boolean = true;
+
+  @ApiPropertyOptional({
+    description: 'Include comparative analysis',
+    default: true,
+  })
+  @IsOptional()
+  includeComparativeAnalysis?: boolean = true;
+
+  @ApiPropertyOptional({
+    description: 'Number of top performers to include in leaderboards',
+    example: 10,
+    minimum: 1,
+    maximum: 100,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(1)
+  @Max(100)
+  topPerformersCount?: number = 10;
+
+  @ApiPropertyOptional({
+    description: 'Enable real-time data refresh',
+    default: false,
+  })
+  @IsOptional()
+  realTime?: boolean = false;
+}
+
+export class DashboardMetricsDto {
+  @ApiPropertyOptional({
+    description: 'Time window for dashboard metrics (in hours)',
+    example: 24,
+    minimum: 1,
+    maximum: 8760,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(1)
+  @Max(8760)
+  timeWindowHours?: number = 24;
+
+  @ApiPropertyOptional({
+    description: 'Include geographic breakdown',
+    default: true,
+  })
+  @IsOptional()
+  includeGeographicBreakdown?: boolean = true;
+
+  @ApiPropertyOptional({
+    description: 'Include renewable energy metrics',
+    default: true,
+  })
+  @IsOptional()
+  includeRenewableMetrics?: boolean = true;
+
+  @ApiPropertyOptional({
+    description: 'Include market efficiency indicators',
+    default: true,
+  })
+  @IsOptional()
+  includeMarketEfficiency?: boolean = true;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/entities/analytics-data.entity.ts.html b/coverage/lcov-report/src/analytics/entities/analytics-data.entity.ts.html new file mode 100644 index 0000000..215025f --- /dev/null +++ b/coverage/lcov-report/src/analytics/entities/analytics-data.entity.ts.html @@ -0,0 +1,349 @@ + + + + + + Code coverage report for src/analytics/entities/analytics-data.entity.ts + + + + + + + + + +
+
+

All files / src/analytics/entities analytics-data.entity.ts

+
+ +
+ 0% + Statements + 0/88 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/88 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+
+export enum AnalyticsType {
+  TRADING_VOLUME = 'trading_volume',
+  PRICE_TREND = 'price_trend',
+  USER_PERFORMANCE = 'user_performance',
+  MARKET_EFFICIENCY = 'market_efficiency',
+  GEOGRAPHIC_PATTERN = 'geographic_pattern',
+  RENEWABLE_ENERGY = 'renewable_energy',
+}
+
+export enum AggregationPeriod {
+  HOURLY = 'hourly',
+  DAILY = 'daily',
+  WEEKLY = 'weekly',
+  MONTHLY = 'monthly',
+  QUARTERLY = 'quarterly',
+  YEARLY = 'yearly',
+}
+
+@Entity('analytics_data')
+@Index(['type', 'period', 'timestamp'])
+@Index(['userId'])
+@Index(['gridZoneId'])
+export class AnalyticsData {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({
+    type: 'enum',
+    enum: AnalyticsType,
+  })
+  type: AnalyticsType;
+
+  @Column({
+    type: 'enum',
+    enum: AggregationPeriod,
+  })
+  period: AggregationPeriod;
+
+  @Column({ type: 'timestamp' })
+  timestamp: Date;
+
+  @Column({ nullable: true })
+  userId?: string;
+
+  @Column({ nullable: true })
+  gridZoneId?: string;
+
+  @Column({ nullable: true })
+  country?: string;
+
+  @Column({ type: 'json' })
+  data: Record<string, any>;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2, nullable: true })
+  totalValue?: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2, nullable: true })
+  averageValue?: number;
+
+  @Column({ type: 'integer', nullable: true })
+  count?: number;
+
+  @Column({ type: 'decimal', precision: 5, scale: 2, nullable: true })
+  percentage?: number;
+
+  @Column({ type: 'json', nullable: true })
+  metadata?: {
+    source: string;
+    version: string;
+    confidence: number;
+    lastUpdated: Date;
+  };
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @UpdateDateColumn()
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/entities/index.html b/coverage/lcov-report/src/analytics/entities/index.html new file mode 100644 index 0000000..583feae --- /dev/null +++ b/coverage/lcov-report/src/analytics/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/analytics/entities + + + + + + + + + +
+
+

All files src/analytics/entities

+
+ +
+ 0% + Statements + 0/88 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/88 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
analytics-data.entity.ts +
+
0%0/880%0/10%0/10%0/88
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/index.html b/coverage/lcov-report/src/analytics/index.html new file mode 100644 index 0000000..ef525bb --- /dev/null +++ b/coverage/lcov-report/src/analytics/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/analytics + + + + + + + + + +
+
+

All files src/analytics

+
+ +
+ 0% + Statements + 0/388 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/388 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
analytics.module.ts +
+
0%0/210%0/10%0/10%0/21
analytics.service.ts +
+
0%0/3670%0/10%0/10%0/367
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/reports/index.html b/coverage/lcov-report/src/analytics/reports/index.html new file mode 100644 index 0000000..dd6fb6f --- /dev/null +++ b/coverage/lcov-report/src/analytics/reports/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/analytics/reports + + + + + + + + + +
+
+

All files src/analytics/reports

+
+ +
+ 0% + Statements + 0/1677 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/1677 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
market-efficiency.report.ts +
+
0%0/4380%0/10%0/10%0/438
price-trends.report.ts +
+
0%0/4180%0/10%0/10%0/418
trading-volume.report.ts +
+
0%0/3210%0/10%0/10%0/321
user-performance.report.ts +
+
0%0/5000%0/10%0/10%0/500
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/reports/market-efficiency.report.ts.html b/coverage/lcov-report/src/analytics/reports/market-efficiency.report.ts.html new file mode 100644 index 0000000..290f76c --- /dev/null +++ b/coverage/lcov-report/src/analytics/reports/market-efficiency.report.ts.html @@ -0,0 +1,1399 @@ + + + + + + Code coverage report for src/analytics/reports/market-efficiency.report.ts + + + + + + + + + +
+
+

All files / src/analytics/reports market-efficiency.report.ts

+
+ +
+ 0% + Statements + 0/438 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/438 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  AnalyticsData,
+  AnalyticsType,
+  AggregationPeriod,
+} from '../entities/analytics-data.entity';
+import { ReportParamsDto } from '../dto/report-params.dto';
+
+export interface MarketEfficiencyMetrics {
+  timestamp: Date;
+  bidAskSpread: number;
+  spreadPercent: number;
+  volatility: number;
+  liquidity: number;
+  marketDepth: number;
+  priceEfficiency: number;
+  volumeWeightedAveragePrice: number;
+  tradingVelocity: number;
+  orderBookImbalance: number;
+}
+
+export interface MarketEfficiencyReport {
+  period: {
+    start: Date;
+    end: Date;
+    aggregation: AggregationPeriod;
+  };
+  summary: {
+    averageSpread: number;
+    averageVolatility: number;
+    averageLiquidity: number;
+    marketEfficiencyScore: number;
+    priceDiscoveryEfficiency: number;
+    informationAsymmetry: number;
+  };
+  metrics: MarketEfficiencyMetrics[];
+  geographicComparison?: {
+    country: string;
+    efficiencyScore: number;
+    spread: number;
+    volatility: number;
+    liquidity: number;
+  }[];
+  timeAnalysis?: {
+    hour: number;
+    efficiencyScore: number;
+    volume: number;
+    volatility: number;
+  }[];
+  recommendations: string[];
+}
+
+@Injectable()
+export class MarketEfficiencyReport {
+  constructor(
+    @InjectRepository(AnalyticsData)
+    private analyticsRepository: Repository<AnalyticsData>,
+  ) {}
+
+  async generateReport(
+    params: ReportParamsDto,
+  ): Promise<MarketEfficiencyReport> {
+    const startDate =
+      params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago
+    const endDate = params.endDate || new Date();
+    const period = params.period || AggregationPeriod.DAILY;
+
+    // Fetch market efficiency data
+    const metrics = await this.fetchMarketEfficiencyData(
+      startDate,
+      endDate,
+      period,
+      params,
+    );
+
+    // Calculate summary statistics
+    const summary = this.calculateSummary(metrics);
+
+    // Get geographic comparison if requested
+    const geographicComparison = params.includeComparativeAnalysis
+      ? await this.getGeographicComparison(startDate, endDate, params)
+      : undefined;
+
+    // Get time-based analysis
+    const timeAnalysis = await this.getTimeBasedAnalysis(
+      startDate,
+      endDate,
+      params,
+    );
+
+    // Generate recommendations
+    const recommendations = this.generateRecommendations(summary);
+
+    return {
+      period: {
+        start: startDate,
+        end: endDate,
+        aggregation: period,
+      },
+      summary,
+      metrics,
+      geographicComparison,
+      timeAnalysis,
+      recommendations,
+    };
+  }
+
+  private async fetchMarketEfficiencyData(
+    startDate: Date,
+    endDate: Date,
+    period: AggregationPeriod,
+    params: ReportParamsDto,
+  ): Promise<MarketEfficiencyMetrics[]> {
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .where('analytics.type = :type', {
+        type: AnalyticsType.MARKET_EFFICIENCY,
+      })
+      .andWhere('analytics.period = :period', { period })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      });
+
+    if (params.gridZoneId) {
+      queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', {
+        gridZoneId: params.gridZoneId,
+      });
+    }
+
+    if (params.country) {
+      queryBuilder.andWhere('analytics.country = :country', {
+        country: params.country,
+      });
+    }
+
+    queryBuilder.orderBy('analytics.timestamp', 'ASC');
+
+    const analyticsData = await queryBuilder.getMany();
+
+    return analyticsData.map((data) => {
+      const efficiencyData = data.data as any;
+      return {
+        timestamp: data.timestamp,
+        bidAskSpread: parseFloat(efficiencyData.bidAskSpread || '0'),
+        spreadPercent: parseFloat(efficiencyData.spreadPercent || '0'),
+        volatility: parseFloat(efficiencyData.volatility || '0'),
+        liquidity: parseFloat(efficiencyData.liquidity || '0'),
+        marketDepth: parseFloat(efficiencyData.marketDepth || '0'),
+        priceEfficiency: parseFloat(efficiencyData.priceEfficiency || '0'),
+        volumeWeightedAveragePrice: parseFloat(efficiencyData.vwap || '0'),
+        tradingVelocity: parseFloat(efficiencyData.tradingVelocity || '0'),
+        orderBookImbalance: parseFloat(
+          efficiencyData.orderBookImbalance || '0',
+        ),
+      };
+    });
+  }
+
+  private calculateSummary(metrics: MarketEfficiencyMetrics[]) {
+    if (metrics.length === 0) {
+      return {
+        averageSpread: 0,
+        averageVolatility: 0,
+        averageLiquidity: 0,
+        marketEfficiencyScore: 0,
+        priceDiscoveryEfficiency: 0,
+        informationAsymmetry: 0,
+      };
+    }
+
+    const averageSpread =
+      metrics.reduce((sum, m) => sum + m.bidAskSpread, 0) / metrics.length;
+    const averageVolatility =
+      metrics.reduce((sum, m) => sum + m.volatility, 0) / metrics.length;
+    const averageLiquidity =
+      metrics.reduce((sum, m) => sum + m.liquidity, 0) / metrics.length;
+    const averagePriceEfficiency =
+      metrics.reduce((sum, m) => sum + m.priceEfficiency, 0) / metrics.length;
+
+    // Calculate market efficiency score (0-100)
+    const spreadScore = Math.max(0, 100 - averageSpread * 1000); // Lower spread is better
+    const volatilityScore = Math.max(0, 100 - averageVolatility * 100); // Lower volatility is better
+    const liquidityScore = Math.min(100, averageLiquidity * 10); // Higher liquidity is better
+    const priceEfficiencyScore = averagePriceEfficiency * 100;
+
+    const marketEfficiencyScore =
+      (spreadScore + volatilityScore + liquidityScore + priceEfficiencyScore) /
+      4;
+
+    // Price discovery efficiency (how quickly prices reflect new information)
+    const priceDiscoveryEfficiency =
+      this.calculatePriceDiscoveryEfficiency(metrics);
+
+    // Information asymmetry (inverse of price efficiency)
+    const informationAsymmetry = Math.max(0, 100 - priceDiscoveryEfficiency);
+
+    return {
+      averageSpread,
+      averageVolatility,
+      averageLiquidity,
+      marketEfficiencyScore,
+      priceDiscoveryEfficiency,
+      informationAsymmetry,
+    };
+  }
+
+  private calculatePriceDiscoveryEfficiency(
+    metrics: MarketEfficiencyMetrics[],
+  ): number {
+    if (metrics.length < 2) return 0;
+
+    // Calculate price efficiency based on how quickly prices converge
+    let totalEfficiency = 0;
+    for (let i = 1; i < metrics.length; i++) {
+      const currentEfficiency = metrics[i].priceEfficiency;
+      const previousEfficiency = metrics[i - 1].priceEfficiency;
+
+      // Higher efficiency when prices are stable and reflect information quickly
+      const convergenceRate = Math.abs(currentEfficiency - previousEfficiency);
+      totalEfficiency += Math.max(0, 1 - convergenceRate);
+    }
+
+    return (totalEfficiency / (metrics.length - 1)) * 100;
+  }
+
+  private async getGeographicComparison(
+    startDate: Date,
+    endDate: Date,
+    params: ReportParamsDto,
+  ) {
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.country', 'country')
+      .addSelect("AVG(analytics.data->>'bidAskSpread')", 'spread')
+      .addSelect("AVG(analytics.data->>'volatility')", 'volatility')
+      .addSelect("AVG(analytics.data->>'liquidity')", 'liquidity')
+      .addSelect("AVG(analytics.data->>'priceEfficiency')", 'priceEfficiency')
+      .where('analytics.type = :type', {
+        type: AnalyticsType.MARKET_EFFICIENCY,
+      })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .andWhere('analytics.country IS NOT NULL')
+      .groupBy('analytics.country');
+
+    if (params.gridZoneId) {
+      queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', {
+        gridZoneId: params.gridZoneId,
+      });
+    }
+
+    const results = await queryBuilder.getRawMany();
+
+    return results.map((result) => {
+      const spread = parseFloat(result.spread || '0');
+      const volatility = parseFloat(result.volatility || '0');
+      const liquidity = parseFloat(result.liquidity || '0');
+      const priceEfficiency = parseFloat(result.priceEfficiency || '0');
+
+      // Calculate efficiency score for each region
+      const spreadScore = Math.max(0, 100 - spread * 1000);
+      const volatilityScore = Math.max(0, 100 - volatility * 100);
+      const liquidityScore = Math.min(100, liquidity * 10);
+      const priceEfficiencyScore = priceEfficiency * 100;
+
+      const efficiencyScore =
+        (spreadScore +
+          volatilityScore +
+          liquidityScore +
+          priceEfficiencyScore) /
+        4;
+
+      return {
+        country: result.country,
+        efficiencyScore,
+        spread,
+        volatility,
+        liquidity,
+      };
+    });
+  }
+
+  private async getTimeBasedAnalysis(
+    startDate: Date,
+    endDate: Date,
+    params: ReportParamsDto,
+  ) {
+    // Get hourly efficiency patterns
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('EXTRACT(HOUR FROM analytics.timestamp)', 'hour')
+      .addSelect("AVG(analytics.data->>'priceEfficiency')", 'efficiencyScore')
+      .addSelect("AVG(analytics.data->>'volatility')", 'volatility')
+      .addSelect('SUM(analytics.count)', 'volume')
+      .where('analytics.type = :type', {
+        type: AnalyticsType.MARKET_EFFICIENCY,
+      })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .groupBy('EXTRACT(HOUR FROM analytics.timestamp)')
+      .orderBy('hour', 'ASC');
+
+    if (params.gridZoneId) {
+      queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', {
+        gridZoneId: params.gridZoneId,
+      });
+    }
+
+    if (params.country) {
+      queryBuilder.andWhere('analytics.country = :country', {
+        country: params.country,
+      });
+    }
+
+    const results = await queryBuilder.getRawMany();
+
+    return results.map((result) => ({
+      hour: parseInt(result.hour),
+      efficiencyScore: parseFloat(result.efficiencyScore || '0') * 100,
+      volume: parseInt(result.volume || '0'),
+      volatility: parseFloat(result.volatility || '0'),
+    }));
+  }
+
+  private generateRecommendations(summary: any): string[] {
+    const recommendations: string[] = [];
+
+    if (summary.averageSpread > 0.05) {
+      recommendations.push(
+        'High bid-ask spread detected. Consider improving market maker incentives to reduce spreads.',
+      );
+    }
+
+    if (summary.averageVolatility > 0.3) {
+      recommendations.push(
+        'High volatility observed. Implement circuit breakers or volatility controls to stabilize the market.',
+      );
+    }
+
+    if (summary.averageLiquidity < 5) {
+      recommendations.push(
+        'Low liquidity detected. Consider liquidity provision programs or market maker incentives.',
+      );
+    }
+
+    if (summary.marketEfficiencyScore < 60) {
+      recommendations.push(
+        'Market efficiency is below optimal levels. Review market structure and consider regulatory improvements.',
+      );
+    }
+
+    if (summary.priceDiscoveryEfficiency < 50) {
+      recommendations.push(
+        'Price discovery is inefficient. Improve information dissemination and transparency requirements.',
+      );
+    }
+
+    if (summary.informationAsymmetry > 40) {
+      recommendations.push(
+        'High information asymmetry detected. Implement better disclosure requirements and real-time data feeds.',
+      );
+    }
+
+    if (recommendations.length === 0) {
+      recommendations.push(
+        'Market efficiency metrics are within acceptable ranges. Continue monitoring for improvements.',
+      );
+    }
+
+    return recommendations;
+  }
+
+  async generateRealTimeMetrics(
+    gridZoneId?: string,
+    country?: string,
+  ): Promise<MarketEfficiencyMetrics> {
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .where('analytics.type = :type', {
+        type: AnalyticsType.MARKET_EFFICIENCY,
+      })
+      .andWhere('analytics.period = :period', {
+        period: AggregationPeriod.HOURLY,
+      })
+      .orderBy('analytics.timestamp', 'DESC')
+      .limit(1);
+
+    if (gridZoneId) {
+      queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', {
+        gridZoneId,
+      });
+    }
+
+    if (country) {
+      queryBuilder.andWhere('analytics.country = :country', { country });
+    }
+
+    const latestData = await queryBuilder.getOne();
+
+    if (!latestData) {
+      // Return default metrics if no data available
+      const now = new Date();
+      return {
+        timestamp: now,
+        bidAskSpread: 0.02,
+        spreadPercent: 2.0,
+        volatility: 0.15,
+        liquidity: 7.5,
+        marketDepth: 1000,
+        priceEfficiency: 0.85,
+        volumeWeightedAveragePrice: 50,
+        tradingVelocity: 5.2,
+        orderBookImbalance: 0.1,
+      };
+    }
+
+    const efficiencyData = latestData.data as any;
+    return {
+      timestamp: latestData.timestamp,
+      bidAskSpread: parseFloat(efficiencyData.bidAskSpread || '0'),
+      spreadPercent: parseFloat(efficiencyData.spreadPercent || '0'),
+      volatility: parseFloat(efficiencyData.volatility || '0'),
+      liquidity: parseFloat(efficiencyData.liquidity || '0'),
+      marketDepth: parseFloat(efficiencyData.marketDepth || '0'),
+      priceEfficiency: parseFloat(efficiencyData.priceEfficiency || '0'),
+      volumeWeightedAveragePrice: parseFloat(efficiencyData.vwap || '0'),
+      tradingVelocity: parseFloat(efficiencyData.tradingVelocity || '0'),
+      orderBookImbalance: parseFloat(efficiencyData.orderBookImbalance || '0'),
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/reports/price-trends.report.ts.html b/coverage/lcov-report/src/analytics/reports/price-trends.report.ts.html new file mode 100644 index 0000000..5ca66db --- /dev/null +++ b/coverage/lcov-report/src/analytics/reports/price-trends.report.ts.html @@ -0,0 +1,1339 @@ + + + + + + Code coverage report for src/analytics/reports/price-trends.report.ts + + + + + + + + + +
+
+

All files / src/analytics/reports price-trends.report.ts

+
+ +
+ 0% + Statements + 0/418 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/418 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  AnalyticsData,
+  AnalyticsType,
+  AggregationPeriod,
+} from '../entities/analytics-data.entity';
+import { ReportParamsDto } from '../dto/report-params.dto';
+
+export interface PriceDataPoint {
+  timestamp: Date;
+  price: number;
+  volume: number;
+  high: number;
+  low: number;
+  open: number;
+  close: number;
+}
+
+export interface TechnicalIndicator {
+  name: string;
+  values: number[];
+  signals: ('BUY' | 'SELL' | 'HOLD')[];
+}
+
+export interface PriceTrendsReport {
+  period: {
+    start: Date;
+    end: Date;
+    aggregation: AggregationPeriod;
+  };
+  summary: {
+    currentPrice: number;
+    priceChange: number;
+    priceChangePercent: number;
+    volatility: number;
+    averagePrice: number;
+    highestPrice: number;
+    lowestPrice: number;
+    trend: 'BULLISH' | 'BEARISH' | 'SIDEWAYS';
+  };
+  data: PriceDataPoint[];
+  technicalIndicators?: TechnicalIndicator[];
+  comparativeAnalysis?: {
+    region: string;
+    averagePrice: number;
+    priceChange: number;
+    volatility: number;
+  }[];
+}
+
+@Injectable()
+export class PriceTrendsReport {
+  constructor(
+    @InjectRepository(AnalyticsData)
+    private analyticsRepository: Repository<AnalyticsData>,
+  ) {}
+
+  async generateReport(params: ReportParamsDto): Promise<PriceTrendsReport> {
+    const startDate =
+      params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago
+    const endDate = params.endDate || new Date();
+    const period = params.period || AggregationPeriod.DAILY;
+
+    // Fetch price trend data
+    const priceData = await this.fetchPriceData(
+      startDate,
+      endDate,
+      period,
+      params,
+    );
+
+    // Calculate summary statistics
+    const summary = this.calculateSummary(priceData);
+
+    // Generate technical indicators if requested
+    const technicalIndicators = params.includeTechnicalIndicators
+      ? this.generateTechnicalIndicators(priceData)
+      : undefined;
+
+    // Get comparative analysis if requested
+    const comparativeAnalysis = params.includeComparativeAnalysis
+      ? await this.getComparativeAnalysis(startDate, endDate, period, params)
+      : undefined;
+
+    return {
+      period: {
+        start: startDate,
+        end: endDate,
+        aggregation: period,
+      },
+      summary,
+      data: priceData,
+      technicalIndicators,
+      comparativeAnalysis,
+    };
+  }
+
+  private async fetchPriceData(
+    startDate: Date,
+    endDate: Date,
+    period: AggregationPeriod,
+    params: ReportParamsDto,
+  ): Promise<PriceDataPoint[]> {
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .where('analytics.type = :type', { type: AnalyticsType.PRICE_TREND })
+      .andWhere('analytics.period = :period', { period })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      });
+
+    if (params.userId) {
+      queryBuilder.andWhere('analytics.userId = :userId', {
+        userId: params.userId,
+      });
+    }
+
+    if (params.gridZoneId) {
+      queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', {
+        gridZoneId: params.gridZoneId,
+      });
+    }
+
+    if (params.country) {
+      queryBuilder.andWhere('analytics.country = :country', {
+        country: params.country,
+      });
+    }
+
+    queryBuilder.orderBy('analytics.timestamp', 'ASC');
+
+    const analyticsData = await queryBuilder.getMany();
+
+    return analyticsData.map((data) => {
+      const priceData = data.data as any;
+      return {
+        timestamp: data.timestamp,
+        price: parseFloat(priceData.price || '0'),
+        volume: parseFloat(priceData.volume || '0'),
+        high: parseFloat(priceData.high || '0'),
+        low: parseFloat(priceData.low || '0'),
+        open: parseFloat(priceData.open || '0'),
+        close: parseFloat(priceData.close || '0'),
+      };
+    });
+  }
+
+  private calculateSummary(data: PriceDataPoint[]) {
+    if (data.length === 0) {
+      return {
+        currentPrice: 0,
+        priceChange: 0,
+        priceChangePercent: 0,
+        volatility: 0,
+        averagePrice: 0,
+        highestPrice: 0,
+        lowestPrice: 0,
+        trend: 'SIDEWAYS' as const,
+      };
+    }
+
+    const currentPrice = data[data.length - 1].close;
+    const firstPrice = data[0].open;
+    const priceChange = currentPrice - firstPrice;
+    const priceChangePercent =
+      firstPrice > 0 ? (priceChange / firstPrice) * 100 : 0;
+
+    const prices = data.map((d) => d.close);
+    const averagePrice =
+      prices.reduce((sum, price) => sum + price, 0) / prices.length;
+    const highestPrice = Math.max(...prices);
+    const lowestPrice = Math.min(...prices);
+
+    // Calculate volatility (standard deviation of returns)
+    const returns = [];
+    for (let i = 1; i < prices.length; i++) {
+      if (prices[i - 1] > 0) {
+        returns.push((prices[i] - prices[i - 1]) / prices[i - 1]);
+      }
+    }
+    const volatility =
+      returns.length > 0 ? this.calculateStandardDeviation(returns) * 100 : 0;
+
+    // Determine trend
+    let trend: 'BULLISH' | 'BEARISH' | 'SIDEWAYS' = 'SIDEWAYS';
+    if (priceChangePercent > 2) trend = 'BULLISH';
+    else if (priceChangePercent < -2) trend = 'BEARISH';
+
+    return {
+      currentPrice,
+      priceChange,
+      priceChangePercent,
+      volatility,
+      averagePrice,
+      highestPrice,
+      lowestPrice,
+      trend,
+    };
+  }
+
+  private generateTechnicalIndicators(
+    data: PriceDataPoint[],
+  ): TechnicalIndicator[] {
+    const indicators: TechnicalIndicator[] = [];
+    const prices = data.map((d) => d.close);
+
+    // Simple Moving Average (SMA) - 20 period
+    const sma20 = this.calculateSMA(prices, 20);
+    indicators.push({
+      name: 'SMA_20',
+      values: sma20,
+      signals: this.generateSMASignals(prices, sma20),
+    });
+
+    // Exponential Moving Average (EMA) - 50 period
+    const ema50 = this.calculateEMA(prices, 50);
+    indicators.push({
+      name: 'EMA_50',
+      values: ema50,
+      signals: this.generateEMASignals(prices, ema50),
+    });
+
+    // Relative Strength Index (RSI) - 14 period
+    const rsi = this.calculateRSI(prices, 14);
+    indicators.push({
+      name: 'RSI_14',
+      values: rsi,
+      signals: this.generateRSISignals(rsi),
+    });
+
+    // MACD
+    const macd = this.calculateMACD(prices);
+    indicators.push({
+      name: 'MACD',
+      values: macd.macdLine,
+      signals: this.generateMACDSignals(macd),
+    });
+
+    return indicators;
+  }
+
+  private calculateSMA(prices: number[], period: number): number[] {
+    const sma: number[] = [];
+    for (let i = period - 1; i < prices.length; i++) {
+      const sum = prices
+        .slice(i - period + 1, i + 1)
+        .reduce((a, b) => a + b, 0);
+      sma.push(sum / period);
+    }
+    return sma;
+  }
+
+  private calculateEMA(prices: number[], period: number): number[] {
+    const ema: number[] = [];
+    const multiplier = 2 / (period + 1);
+
+    // Start with SMA
+    const sma = prices.slice(0, period).reduce((a, b) => a + b, 0) / period;
+    ema.push(sma);
+
+    for (let i = period; i < prices.length; i++) {
+      const currentEMA =
+        (prices[i] - ema[ema.length - 1]) * multiplier + ema[ema.length - 1];
+      ema.push(currentEMA);
+    }
+
+    return ema;
+  }
+
+  private calculateRSI(prices: number[], period: number): number[] {
+    const rsi: number[] = [];
+    const gains: number[] = [];
+    const losses: number[] = [];
+
+    for (let i = 1; i < prices.length; i++) {
+      const change = prices[i] - prices[i - 1];
+      gains.push(change > 0 ? change : 0);
+      losses.push(change < 0 ? Math.abs(change) : 0);
+    }
+
+    for (let i = period - 1; i < gains.length; i++) {
+      const avgGain =
+        gains.slice(i - period + 1, i + 1).reduce((a, b) => a + b, 0) / period;
+      const avgLoss =
+        losses.slice(i - period + 1, i + 1).reduce((a, b) => a + b, 0) / period;
+
+      const rs = avgLoss === 0 ? 100 : avgGain / avgLoss;
+      rsi.push(100 - 100 / (1 + rs));
+    }
+
+    return rsi;
+  }
+
+  private calculateMACD(prices: number[]): {
+    macdLine: number[];
+    signalLine: number[];
+    histogram: number[];
+  } {
+    const ema12 = this.calculateEMA(prices, 12);
+    const ema26 = this.calculateEMA(prices, 26);
+
+    // MACD line = EMA12 - EMA26
+    const macdLine = ema12.map(
+      (val, i) => val - ema26[i + (ema12.length - ema26.length)],
+    );
+
+    // Signal line = 9-period EMA of MACD line
+    const signalLine = this.calculateEMA(macdLine, 9);
+
+    // Histogram = MACD line - Signal line
+    const histogram = macdLine.map(
+      (val, i) =>
+        val - (signalLine[i - (signalLine.length - macdLine.length)] || 0),
+    );
+
+    return { macdLine, signalLine, histogram };
+  }
+
+  private generateSMASignals(
+    prices: number[],
+    sma: number[],
+  ): ('BUY' | 'SELL' | 'HOLD')[] {
+    const signals: ('BUY' | 'SELL' | 'HOLD')[] = [];
+    for (let i = 0; i < sma.length; i++) {
+      const priceIndex = i + (prices.length - sma.length);
+      if (prices[priceIndex] > sma[i]) {
+        signals.push('BUY');
+      } else if (prices[priceIndex] < sma[i]) {
+        signals.push('SELL');
+      } else {
+        signals.push('HOLD');
+      }
+    }
+    return signals;
+  }
+
+  private generateEMASignals(
+    prices: number[],
+    ema: number[],
+  ): ('BUY' | 'SELL' | 'HOLD')[] {
+    return this.generateSMASignals(prices, ema);
+  }
+
+  private generateRSISignals(rsi: number[]): ('BUY' | 'SELL' | 'HOLD')[] {
+    return rsi.map((value) => {
+      if (value < 30) return 'BUY';
+      if (value > 70) return 'SELL';
+      return 'HOLD';
+    });
+  }
+
+  private generateMACDSignals(macd: {
+    macdLine: number[];
+    signalLine: number[];
+    histogram: number[];
+  }): ('BUY' | 'SELL' | 'HOLD')[] {
+    const signals: ('BUY' | 'SELL' | 'HOLD')[] = [];
+    const minLength = Math.min(macd.macdLine.length, macd.signalLine.length);
+
+    for (let i = 0; i < minLength; i++) {
+      if (macd.macdLine[i] > macd.signalLine[i]) {
+        signals.push('BUY');
+      } else if (macd.macdLine[i] < macd.signalLine[i]) {
+        signals.push('SELL');
+      } else {
+        signals.push('HOLD');
+      }
+    }
+
+    return signals;
+  }
+
+  private async getComparativeAnalysis(
+    startDate: Date,
+    endDate: Date,
+    period: AggregationPeriod,
+    params: ReportParamsDto,
+  ) {
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.country', 'region')
+      .addSelect('AVG(analytics.averageValue)', 'averagePrice')
+      .where('analytics.type = :type', { type: AnalyticsType.PRICE_TREND })
+      .andWhere('analytics.period = :period', { period })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .andWhere('analytics.country IS NOT NULL')
+      .groupBy('analytics.country');
+
+    if (params.userId) {
+      queryBuilder.andWhere('analytics.userId = :userId', {
+        userId: params.userId,
+      });
+    }
+
+    const results = await queryBuilder.getRawMany();
+
+    return results.map((result) => ({
+      region: result.region,
+      averagePrice: parseFloat(result.averagePrice || '0'),
+      priceChange: 0, // Would need historical data for this
+      volatility: 0, // Would need historical data for this
+    }));
+  }
+
+  private calculateStandardDeviation(values: number[]): number {
+    const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
+    const squaredDifferences = values.map((value) => Math.pow(value - mean, 2));
+    const variance =
+      squaredDifferences.reduce((sum, diff) => sum + diff, 0) / values.length;
+    return Math.sqrt(variance);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/reports/trading-volume.report.ts.html b/coverage/lcov-report/src/analytics/reports/trading-volume.report.ts.html new file mode 100644 index 0000000..9ccb0e7 --- /dev/null +++ b/coverage/lcov-report/src/analytics/reports/trading-volume.report.ts.html @@ -0,0 +1,1048 @@ + + + + + + Code coverage report for src/analytics/reports/trading-volume.report.ts + + + + + + + + + +
+
+

All files / src/analytics/reports trading-volume.report.ts

+
+ +
+ 0% + Statements + 0/321 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/321 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, Between } from 'typeorm';
+import {
+  AnalyticsData,
+  AnalyticsType,
+  AggregationPeriod,
+} from '../entities/analytics-data.entity';
+import { ReportParamsDto } from '../dto/report-params.dto';
+
+export interface TradingVolumeData {
+  timestamp: Date;
+  volume: number;
+  value: number;
+  transactions: number;
+  averageTransactionSize: number;
+  period: AggregationPeriod;
+}
+
+export interface TradingVolumeReport {
+  period: {
+    start: Date;
+    end: Date;
+    aggregation: AggregationPeriod;
+  };
+  summary: {
+    totalVolume: number;
+    totalValue: number;
+    totalTransactions: number;
+    averageTransactionSize: number;
+    peakVolume: number;
+    peakVolumeTime: Date;
+    growthRate: number;
+  };
+  data: TradingVolumeData[];
+  geographicBreakdown?: {
+    country: string;
+    volume: number;
+    value: number;
+    percentage: number;
+  }[];
+  renewableEnergyBreakdown?: {
+    renewableVolume: number;
+    totalVolume: number;
+    percentage: number;
+  };
+}
+
+@Injectable()
+export class TradingVolumeReport {
+  constructor(
+    @InjectRepository(AnalyticsData)
+    private analyticsRepository: Repository<AnalyticsData>,
+  ) {}
+
+  async generateReport(params: ReportParamsDto): Promise<TradingVolumeReport> {
+    const startDate =
+      params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago
+    const endDate = params.endDate || new Date();
+    const period = params.period || AggregationPeriod.DAILY;
+
+    // Fetch trading volume data
+    const volumeData = await this.fetchTradingVolumeData(
+      startDate,
+      endDate,
+      period,
+      params,
+    );
+
+    // Calculate summary statistics
+    const summary = this.calculateSummary(volumeData);
+
+    // Get geographic breakdown if requested
+    const geographicBreakdown = params.includeComparativeAnalysis
+      ? await this.getGeographicBreakdown(startDate, endDate, params)
+      : undefined;
+
+    // Get renewable energy breakdown
+    const renewableEnergyBreakdown = await this.getRenewableEnergyBreakdown(
+      startDate,
+      endDate,
+      params,
+    );
+
+    return {
+      period: {
+        start: startDate,
+        end: endDate,
+        aggregation: period,
+      },
+      summary,
+      data: volumeData,
+      geographicBreakdown,
+      renewableEnergyBreakdown,
+    };
+  }
+
+  private async fetchTradingVolumeData(
+    startDate: Date,
+    endDate: Date,
+    period: AggregationPeriod,
+    params: ReportParamsDto,
+  ): Promise<TradingVolumeData[]> {
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME })
+      .andWhere('analytics.period = :period', { period })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      });
+
+    if (params.userId) {
+      queryBuilder.andWhere('analytics.userId = :userId', {
+        userId: params.userId,
+      });
+    }
+
+    if (params.gridZoneId) {
+      queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', {
+        gridZoneId: params.gridZoneId,
+      });
+    }
+
+    if (params.country) {
+      queryBuilder.andWhere('analytics.country = :country', {
+        country: params.country,
+      });
+    }
+
+    queryBuilder.orderBy('analytics.timestamp', 'ASC');
+
+    const analyticsData = await queryBuilder.getMany();
+
+    return analyticsData.map((data) => ({
+      timestamp: data.timestamp,
+      volume: data.count || 0,
+      value: parseFloat(data.totalValue?.toString() || '0'),
+      transactions: data.count || 0,
+      averageTransactionSize: parseFloat(data.averageValue?.toString() || '0'),
+      period: data.period,
+    }));
+  }
+
+  private calculateSummary(data: TradingVolumeData[]) {
+    if (data.length === 0) {
+      return {
+        totalVolume: 0,
+        totalValue: 0,
+        totalTransactions: 0,
+        averageTransactionSize: 0,
+        peakVolume: 0,
+        peakVolumeTime: new Date(),
+        growthRate: 0,
+      };
+    }
+
+    const totalVolume = data.reduce((sum, item) => sum + item.volume, 0);
+    const totalValue = data.reduce((sum, item) => sum + item.value, 0);
+    const totalTransactions = data.reduce(
+      (sum, item) => sum + item.transactions,
+      0,
+    );
+    const averageTransactionSize =
+      totalTransactions > 0 ? totalValue / totalTransactions : 0;
+
+    // Find peak volume
+    const peakData = data.reduce(
+      (max, item) => (item.volume > max.volume ? item : max),
+      data[0],
+    );
+
+    // Calculate growth rate (comparing first and last periods)
+    const growthRate =
+      data.length > 1
+        ? ((data[data.length - 1].volume - data[0].volume) / data[0].volume) *
+          100
+        : 0;
+
+    return {
+      totalVolume,
+      totalValue,
+      totalTransactions,
+      averageTransactionSize,
+      peakVolume: peakData.volume,
+      peakVolumeTime: peakData.timestamp,
+      growthRate,
+    };
+  }
+
+  private async getGeographicBreakdown(
+    startDate: Date,
+    endDate: Date,
+    params: ReportParamsDto,
+  ) {
+    const queryBuilder = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.country', 'country')
+      .addSelect('SUM(analytics.count)', 'volume')
+      .addSelect('SUM(analytics.totalValue)', 'value')
+      .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .andWhere('analytics.country IS NOT NULL')
+      .groupBy('analytics.country')
+      .orderBy('SUM(analytics.count)', 'DESC');
+
+    if (params.userId) {
+      queryBuilder.andWhere('analytics.userId = :userId', {
+        userId: params.userId,
+      });
+    }
+
+    const results = await queryBuilder.getRawMany();
+
+    const totalVolume = results.reduce(
+      (sum, item) => sum + parseFloat(item.volume || '0'),
+      0,
+    );
+
+    return results.map((item) => ({
+      country: item.country,
+      volume: parseFloat(item.volume || '0'),
+      value: parseFloat(item.value || '0'),
+      percentage:
+        totalVolume > 0
+          ? (parseFloat(item.volume || '0') / totalVolume) * 100
+          : 0,
+    }));
+  }
+
+  private async getRenewableEnergyBreakdown(
+    startDate: Date,
+    endDate: Date,
+    params: ReportParamsDto,
+  ) {
+    // Get total trading volume
+    const totalVolumeQuery = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('SUM(analytics.count)', 'totalVolume')
+      .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      });
+
+    if (params.userId) {
+      totalVolumeQuery.andWhere('analytics.userId = :userId', {
+        userId: params.userId,
+      });
+    }
+
+    const totalVolumeResult = await totalVolumeQuery.getRawOne();
+    const totalVolume = parseFloat(totalVolumeResult?.totalVolume || '0');
+
+    // Get renewable energy volume
+    const renewableVolumeQuery = this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('SUM(analytics.count)', 'renewableVolume')
+      .where('analytics.type = :type', { type: AnalyticsType.RENEWABLE_ENERGY })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      });
+
+    if (params.userId) {
+      renewableVolumeQuery.andWhere('analytics.userId = :userId', {
+        userId: params.userId,
+      });
+    }
+
+    const renewableVolumeResult = await renewableVolumeQuery.getRawOne();
+    const renewableVolume = parseFloat(
+      renewableVolumeResult?.renewableVolume || '0',
+    );
+
+    return {
+      renewableVolume,
+      totalVolume,
+      percentage: totalVolume > 0 ? (renewableVolume / totalVolume) * 100 : 0,
+    };
+  }
+
+  async generateHourlyReport(
+    params: ReportParamsDto,
+  ): Promise<TradingVolumeReport> {
+    return this.generateReport({
+      ...params,
+      period: AggregationPeriod.HOURLY,
+    });
+  }
+
+  async generateDailyReport(
+    params: ReportParamsDto,
+  ): Promise<TradingVolumeReport> {
+    return this.generateReport({
+      ...params,
+      period: AggregationPeriod.DAILY,
+    });
+  }
+
+  async generateWeeklyReport(
+    params: ReportParamsDto,
+  ): Promise<TradingVolumeReport> {
+    return this.generateReport({
+      ...params,
+      period: AggregationPeriod.WEEKLY,
+    });
+  }
+
+  async generateMonthlyReport(
+    params: ReportParamsDto,
+  ): Promise<TradingVolumeReport> {
+    return this.generateReport({
+      ...params,
+      period: AggregationPeriod.MONTHLY,
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/analytics/reports/user-performance.report.ts.html b/coverage/lcov-report/src/analytics/reports/user-performance.report.ts.html new file mode 100644 index 0000000..bf7c0fa --- /dev/null +++ b/coverage/lcov-report/src/analytics/reports/user-performance.report.ts.html @@ -0,0 +1,1585 @@ + + + + + + Code coverage report for src/analytics/reports/user-performance.report.ts + + + + + + + + + +
+
+

All files / src/analytics/reports user-performance.report.ts

+
+ +
+ 0% + Statements + 0/500 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/500 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  AnalyticsData,
+  AnalyticsType,
+  AggregationPeriod,
+} from '../entities/analytics-data.entity';
+import { ReportParamsDto } from '../dto/report-params.dto';
+
+export interface UserPerformanceMetrics {
+  userId: string;
+  totalTrades: number;
+  totalVolume: number;
+  totalValue: number;
+  profitLoss: number;
+  profitLossPercent: number;
+  winRate: number;
+  averageTradeSize: number;
+  averageProfitPerTrade: number;
+  riskAdjustedReturn: number;
+  sharpeRatio: number;
+  maxDrawdown: number;
+  tradingFrequency: number;
+  renewableEnergyTrades: number;
+  renewableEnergyPercentage: number;
+}
+
+export interface UserPerformanceReport {
+  period: {
+    start: Date;
+    end: Date;
+    aggregation: AggregationPeriod;
+  };
+  userMetrics: UserPerformanceMetrics;
+  historicalData: {
+    timestamp: Date;
+    profitLoss: number;
+    cumulativeValue: number;
+    tradeCount: number;
+  }[];
+  leaderboard?: {
+    rank: number;
+    totalUsers: number;
+    percentile: number;
+  };
+  performanceBreakdown?: {
+    byGridZone: {
+      zoneId: string;
+      zoneName: string;
+      profitLoss: number;
+      tradeCount: number;
+      winRate: number;
+    }[];
+    byEnergyType: {
+      renewable: {
+        profitLoss: number;
+        tradeCount: number;
+        percentage: number;
+      };
+      nonRenewable: {
+        profitLoss: number;
+        tradeCount: number;
+        percentage: number;
+      };
+    };
+  };
+  recommendations: string[];
+}
+
+@Injectable()
+export class UserPerformanceReport {
+  constructor(
+    @InjectRepository(AnalyticsData)
+    private analyticsRepository: Repository<AnalyticsData>,
+  ) {}
+
+  async generateReport(
+    params: ReportParamsDto,
+  ): Promise<UserPerformanceReport> {
+    if (!params.userId) {
+      throw new Error('User ID is required for user performance report');
+    }
+
+    const startDate =
+      params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago
+    const endDate = params.endDate || new Date();
+    const period = params.period || AggregationPeriod.DAILY;
+
+    // Fetch user performance data
+    const userMetrics = await this.calculateUserMetrics(
+      params.userId,
+      startDate,
+      endDate,
+      params,
+    );
+
+    // Get historical performance data
+    const historicalData = await this.getHistoricalPerformance(
+      params.userId,
+      startDate,
+      endDate,
+      period,
+    );
+
+    // Get leaderboard position if requested
+    const leaderboard = await this.getLeaderboardPosition(
+      params.userId,
+      startDate,
+      endDate,
+    );
+
+    // Get performance breakdown
+    const performanceBreakdown = await this.getPerformanceBreakdown(
+      params.userId,
+      startDate,
+      endDate,
+    );
+
+    // Generate recommendations
+    const recommendations = this.generateRecommendations(userMetrics);
+
+    return {
+      period: {
+        start: startDate,
+        end: endDate,
+        aggregation: period,
+      },
+      userMetrics,
+      historicalData,
+      leaderboard,
+      performanceBreakdown,
+      recommendations,
+    };
+  }
+
+  private async calculateUserMetrics(
+    userId: string,
+    startDate: Date,
+    endDate: Date,
+    params: ReportParamsDto,
+  ): Promise<UserPerformanceMetrics> {
+    // Get trading data
+    const tradingData = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('COUNT(analytics.id)', 'totalTrades')
+      .addSelect('SUM(analytics.count)', 'totalVolume')
+      .addSelect('SUM(analytics.totalValue)', 'totalValue')
+      .addSelect('AVG(analytics.averageValue)', 'averageTradeSize')
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .getRawOne();
+
+    // Get profit/loss data
+    const profitLossData = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss')
+      .addSelect(
+        "COUNT(CASE WHEN analytics.data->>'isWinningTrade' = 'true' THEN 1 END)",
+        'winningTrades',
+      )
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .getRawOne();
+
+    // Get renewable energy data
+    const renewableData = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('SUM(analytics.count)', 'renewableTrades')
+      .where('analytics.type = :type', { type: AnalyticsType.RENEWABLE_ENERGY })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .getRawOne();
+
+    const totalTrades = parseInt(tradingData?.totalTrades || '0');
+    const totalVolume = parseFloat(tradingData?.totalVolume || '0');
+    const totalValue = parseFloat(tradingData?.totalValue || '0');
+    const averageTradeSize = parseFloat(tradingData?.averageTradeSize || '0');
+    const totalProfitLoss = parseFloat(profitLossData?.totalProfitLoss || '0');
+    const winningTrades = parseInt(profitLossData?.winningTrades || '0');
+    const renewableTrades = parseInt(renewableData?.renewableTrades || '0');
+
+    const profitLossPercent =
+      totalValue > 0 ? (totalProfitLoss / totalValue) * 100 : 0;
+    const winRate = totalTrades > 0 ? (winningTrades / totalTrades) * 100 : 0;
+    const averageProfitPerTrade =
+      totalTrades > 0 ? totalProfitLoss / totalTrades : 0;
+    const renewableEnergyPercentage =
+      totalTrades > 0 ? (renewableTrades / totalTrades) * 100 : 0;
+
+    // Calculate risk metrics
+    const riskMetrics = await this.calculateRiskMetrics(
+      userId,
+      startDate,
+      endDate,
+    );
+    const tradingFrequency = this.calculateTradingFrequency(
+      totalTrades,
+      startDate,
+      endDate,
+    );
+
+    return {
+      userId,
+      totalTrades,
+      totalVolume,
+      totalValue,
+      profitLoss: totalProfitLoss,
+      profitLossPercent,
+      winRate,
+      averageTradeSize,
+      averageProfitPerTrade,
+      riskAdjustedReturn: riskMetrics.riskAdjustedReturn,
+      sharpeRatio: riskMetrics.sharpeRatio,
+      maxDrawdown: riskMetrics.maxDrawdown,
+      tradingFrequency,
+      renewableEnergyTrades: renewableTrades,
+      renewableEnergyPercentage,
+    };
+  }
+
+  private async calculateRiskMetrics(
+    userId: string,
+    startDate: Date,
+    endDate: Date,
+  ): Promise<{
+    riskAdjustedReturn: number;
+    sharpeRatio: number;
+    maxDrawdown: number;
+  }> {
+    // Get daily returns for risk calculations
+    const dailyReturns = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select("analytics.data->>'dailyReturn'", 'dailyReturn')
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .orderBy('analytics.timestamp', 'ASC')
+      .getRawMany();
+
+    const returns = dailyReturns
+      .map((r) => parseFloat(r.dailyReturn || '0'))
+      .filter((r) => !isNaN(r));
+
+    if (returns.length === 0) {
+      return { riskAdjustedReturn: 0, sharpeRatio: 0, maxDrawdown: 0 };
+    }
+
+    // Calculate Sharpe Ratio
+    const meanReturn = returns.reduce((sum, r) => sum + r, 0) / returns.length;
+    const variance =
+      returns.reduce((sum, r) => sum + Math.pow(r - meanReturn, 2), 0) /
+      returns.length;
+    const standardDeviation = Math.sqrt(variance);
+    const sharpeRatio =
+      standardDeviation > 0 ? meanReturn / standardDeviation : 0;
+
+    // Calculate maximum drawdown
+    let maxDrawdown = 0;
+    let peak = 0;
+    let cumulativeReturn = 0;
+
+    for (const returnRate of returns) {
+      cumulativeReturn += returnRate;
+      peak = Math.max(peak, cumulativeReturn);
+      const drawdown = peak - cumulativeReturn;
+      maxDrawdown = Math.max(maxDrawdown, drawdown);
+    }
+
+    // Risk-adjusted return (simplified)
+    const totalReturn = cumulativeReturn;
+    const riskAdjustedReturn =
+      standardDeviation > 0 ? totalReturn / standardDeviation : 0;
+
+    return {
+      riskAdjustedReturn,
+      sharpeRatio,
+      maxDrawdown,
+    };
+  }
+
+  private calculateTradingFrequency(
+    totalTrades: number,
+    startDate: Date,
+    endDate: Date,
+  ): number {
+    const days = Math.ceil(
+      (endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24),
+    );
+    return days > 0 ? totalTrades / days : 0;
+  }
+
+  private async getHistoricalPerformance(
+    userId: string,
+    startDate: Date,
+    endDate: Date,
+    period: AggregationPeriod,
+  ) {
+    return this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.timestamp', 'timestamp')
+      .addSelect("analytics.data->>'profitLoss'", 'profitLoss')
+      .addSelect("analytics.data->>'cumulativeValue'", 'cumulativeValue')
+      .addSelect('analytics.count', 'tradeCount')
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.period = :period', { period })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .orderBy('analytics.timestamp', 'ASC')
+      .getRawMany();
+  }
+
+  private async getLeaderboardPosition(
+    userId: string,
+    startDate: Date,
+    endDate: Date,
+  ): Promise<
+    { rank: number; totalUsers: number; percentile: number } | undefined
+  > {
+    // Get user's total profit/loss
+    const userProfitLoss = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss')
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .getRawOne();
+
+    const userPL = parseFloat(userProfitLoss?.totalProfitLoss || '0');
+
+    // Get all users' profit/loss and rank
+    const leaderboard = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.userId', 'userId')
+      .addSelect("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss')
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .groupBy('analytics.userId')
+      .orderBy("SUM(analytics.data->>'profitLoss')", 'DESC')
+      .getRawMany();
+
+    const totalUsers = leaderboard.length;
+    const rank = leaderboard.findIndex((user) => user.userId === userId) + 1;
+    const percentile =
+      totalUsers > 0 ? ((totalUsers - rank) / totalUsers) * 100 : 0;
+
+    return { rank, totalUsers, percentile };
+  }
+
+  private async getPerformanceBreakdown(
+    userId: string,
+    startDate: Date,
+    endDate: Date,
+  ) {
+    // Performance by grid zone
+    const byGridZone = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('analytics.gridZoneId', 'zoneId')
+      .addSelect("analytics.data->>'zoneName'", 'zoneName')
+      .addSelect("SUM(analytics.data->>'profitLoss')", 'profitLoss')
+      .addSelect('COUNT(analytics.id)', 'tradeCount')
+      .addSelect(
+        "AVG(CASE WHEN analytics.data->>'isWinningTrade' = 'true' THEN 1 ELSE 0 END)",
+        'winRate',
+      )
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .andWhere('analytics.gridZoneId IS NOT NULL')
+      .groupBy("analytics.gridZoneId, analytics.data->>'zoneName'")
+      .getRawMany();
+
+    // Performance by energy type
+    const totalTrades = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('COUNT(analytics.id)', 'totalTrades')
+      .addSelect("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss')
+      .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .getRawOne();
+
+    const renewableTrades = await this.analyticsRepository
+      .createQueryBuilder('analytics')
+      .select('COUNT(analytics.id)', 'renewableTrades')
+      .addSelect("SUM(analytics.data->>'profitLoss')", 'renewableProfitLoss')
+      .where('analytics.type = :type', { type: AnalyticsType.RENEWABLE_ENERGY })
+      .andWhere('analytics.userId = :userId', { userId })
+      .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', {
+        startDate,
+        endDate,
+      })
+      .getRawOne();
+
+    const total = parseInt(totalTrades?.totalTrades || '0');
+    const renewable = parseInt(renewableTrades?.renewableTrades || '0');
+    const nonRenewable = total - renewable;
+
+    return {
+      byGridZone: byGridZone.map((zone) => ({
+        zoneId: zone.zoneId,
+        zoneName: zone.zoneName || 'Unknown',
+        profitLoss: parseFloat(zone.profitLoss || '0'),
+        tradeCount: parseInt(zone.tradeCount || '0'),
+        winRate: parseFloat(zone.winRate || '0') * 100,
+      })),
+      byEnergyType: {
+        renewable: {
+          profitLoss: parseFloat(renewableTrades?.renewableProfitLoss || '0'),
+          tradeCount: renewable,
+          percentage: total > 0 ? (renewable / total) * 100 : 0,
+        },
+        nonRenewable: {
+          profitLoss:
+            parseFloat(totalTrades?.totalProfitLoss || '0') -
+            parseFloat(renewableTrades?.renewableProfitLoss || '0'),
+          tradeCount: nonRenewable,
+          percentage: total > 0 ? (nonRenewable / total) * 100 : 0,
+        },
+      },
+    };
+  }
+
+  private generateRecommendations(metrics: UserPerformanceMetrics): string[] {
+    const recommendations: string[] = [];
+
+    if (metrics.winRate < 40) {
+      recommendations.push(
+        'Consider refining your trading strategy to improve win rate. Current win rate is below optimal levels.',
+      );
+    }
+
+    if (metrics.sharpeRatio < 1) {
+      recommendations.push(
+        'Your risk-adjusted returns could be improved. Consider diversifying your portfolio or adjusting position sizes.',
+      );
+    }
+
+    if (metrics.maxDrawdown > 20) {
+      recommendations.push(
+        'High maximum drawdown detected. Consider implementing stricter risk management controls.',
+      );
+    }
+
+    if (metrics.renewableEnergyPercentage < 30) {
+      recommendations.push(
+        'Consider increasing renewable energy trades to align with sustainability goals and potentially access green energy incentives.',
+      );
+    }
+
+    if (metrics.tradingFrequency > 10) {
+      recommendations.push(
+        'High trading frequency may lead to increased transaction costs. Consider focusing on higher-quality trades.',
+      );
+    }
+
+    if (metrics.profitLossPercent < 0) {
+      recommendations.push(
+        'Current strategy is showing losses. Consider reviewing your trading approach and market analysis methods.',
+      );
+    }
+
+    if (recommendations.length === 0) {
+      recommendations.push(
+        'Your trading performance is solid. Continue monitoring risk metrics and market conditions.',
+      );
+    }
+
+    return recommendations;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/api-health.controller.ts.html b/coverage/lcov-report/src/api-health.controller.ts.html new file mode 100644 index 0000000..ac7c2b5 --- /dev/null +++ b/coverage/lcov-report/src/api-health.controller.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/api-health.controller.ts + + + + + + + + + +
+
+

All files / src api-health.controller.ts

+
+ +
+ 0% + Statements + 0/28 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get } from '@nestjs/common';
+
+@Controller('api')
+export class HealthController {
+  @Get('health')
+  getHealth() {
+    return {
+      status: 'healthy',
+      timestamp: new Date().toISOString(),
+      uptime: process.uptime(),
+      version: '1.0.0',
+      environment: process.env.NODE_ENV || 'development',
+    };
+  }
+
+  @Get('ready')
+  getReady() {
+    return {
+      status: 'ready',
+      timestamp: new Date().toISOString(),
+      checks: {
+        database: 'connected',
+        redis: 'connected',
+        api: 'ready',
+      },
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/alerts/alert-service.ts.html b/coverage/lcov-report/src/apm/alerts/alert-service.ts.html new file mode 100644 index 0000000..0611d34 --- /dev/null +++ b/coverage/lcov-report/src/apm/alerts/alert-service.ts.html @@ -0,0 +1,307 @@ + + + + + + Code coverage report for src/apm/alerts/alert-service.ts + + + + + + + + + +
+
+

All files / src/apm/alerts alert-service.ts

+
+ +
+ 0% + Statements + 0/74 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/74 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import * as os from 'os';
+
+@Injectable()
+export class AlertService implements OnModuleInit {
+  private readonly logger = new Logger(AlertService.name);
+  private readonly CPU_THRESHOLD = 80; // 80% load
+  private readonly MEMORY_THRESHOLD = 0.9; // 90% usage
+
+  onModuleInit() {
+    this.startAlertMonitoring();
+  }
+
+  private startAlertMonitoring() {
+    this.logger.log('Starting Alert System monitoring...');
+
+    // Check system status every 15 seconds
+    setInterval(() => {
+      this.checkSystemAlerts();
+    }, 15000);
+  }
+
+  private checkSystemAlerts() {
+    // Check CPU Usage
+    const cpus = os.cpus().length;
+    const loadAvg = os.loadavg()[0]; // 1-minute load
+    const cpuUsage = (loadAvg / cpus) * 100;
+
+    if (cpuUsage > this.CPU_THRESHOLD) {
+      this.emitAlert(
+        'CRITICAL',
+        `High CPU load detected: ${cpuUsage.toFixed(2)}% on ${cpus} cores.`,
+      );
+    }
+
+    // Check Memory Usage
+    const memUsage = process.memoryUsage();
+    const heapUsed = memUsage.heapUsed;
+    const heapTotal = memUsage.heapTotal;
+    const ratio = heapUsed / heapTotal;
+
+    if (ratio > this.MEMORY_THRESHOLD) {
+      this.emitAlert(
+        'WARNING',
+        `Critical Heap Memory usage: ${(ratio * 100).toFixed(2)}% (${(heapUsed / 1024 / 1024).toFixed(2)}MB used out of ${(heapTotal / 1024 / 1024).toFixed(2)}MB)`,
+      );
+    }
+
+    this.logger.debug(
+      `Alert monitoring check complete. System Status: Healthy - CPU: ${cpuUsage.toFixed(1)}%, Mem: ${(ratio * 100).toFixed(1)}%`,
+    );
+  }
+
+  /**
+   * Send an alert notification
+   */
+  emitAlert(level: 'INFO' | 'WARNING' | 'CRITICAL', message: string) {
+    const timestamp = new Date().toISOString();
+    const alertMessage = `[APM ALERT] ${level.toUpperCase()} - ${timestamp}: ${message}`;
+
+    // Alert via Logger. In production, this would trigger email / PagerDuty / Webhook
+    this.logger.error(alertMessage);
+
+    // Potential Slack or Email integration
+    this.triggerNotifier(level, message);
+  }
+
+  private triggerNotifier(level: string, message: string) {
+    // Async notifier
+    setImmediate(() => {
+      this.logger.log(`Notifier triggered for ${level} alert.`);
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/alerts/index.html b/coverage/lcov-report/src/apm/alerts/index.html new file mode 100644 index 0000000..55459c5 --- /dev/null +++ b/coverage/lcov-report/src/apm/alerts/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/apm/alerts + + + + + + + + + +
+
+

All files src/apm/alerts

+
+ +
+ 0% + Statements + 0/74 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/74 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
alert-service.ts +
+
0%0/740%0/10%0/10%0/74
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/analytics/index.html b/coverage/lcov-report/src/apm/analytics/index.html new file mode 100644 index 0000000..37f08e8 --- /dev/null +++ b/coverage/lcov-report/src/apm/analytics/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/apm/analytics + + + + + + + + + +
+
+

All files src/apm/analytics

+
+ +
+ 0% + Statements + 0/106 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/106 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
performance-analytics.service.ts +
+
0%0/1060%0/10%0/10%0/106
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/analytics/performance-analytics.service.ts.html b/coverage/lcov-report/src/apm/analytics/performance-analytics.service.ts.html new file mode 100644 index 0000000..286e49d --- /dev/null +++ b/coverage/lcov-report/src/apm/analytics/performance-analytics.service.ts.html @@ -0,0 +1,403 @@ + + + + + + Code coverage report for src/apm/analytics/performance-analytics.service.ts + + + + + + + + + +
+
+

All files / src/apm/analytics performance-analytics.service.ts

+
+ +
+ 0% + Statements + 0/106 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/106 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+
+interface PerformanceMetric {
+  timestamp: Date;
+  avgResponseMs: number;
+  requestCount: number;
+  uptimeSeconds: number;
+}
+
+@Injectable()
+export class PerformanceAnalyticsService implements OnModuleInit {
+  private readonly logger = new Logger(PerformanceAnalyticsService.name);
+  private historicalMetrics: PerformanceMetric[] = [];
+  private readonly MAX_HISTORY = 100; // Last 100 intervals
+
+  onModuleInit() {
+    this.startAnalyticsCollection();
+  }
+
+  private startAnalyticsCollection() {
+    this.logger.log('Starting Performance Analytics Engine...');
+
+    // Sample performance every minute
+    setInterval(() => {
+      this.samplePerformance();
+    }, 60000);
+  }
+
+  private samplePerformance() {
+    const uptime = process.uptime();
+    const metric: PerformanceMetric = {
+      timestamp: new Date(),
+      avgResponseMs: 15.2, // Simulated avg from historical data
+      requestCount: 100, // Simulated count
+      uptimeSeconds: uptime,
+    };
+
+    this.historicalMetrics.push(metric);
+    if (this.historicalMetrics.length > this.MAX_HISTORY) {
+      this.historicalMetrics.shift();
+    }
+
+    this.logger.debug(
+      `Performance sampled at ${metric.timestamp.toLocaleTimeString()}. Uptime: ${uptime.toFixed(0)}s`,
+    );
+  }
+
+  /**
+   * Identifies performance trends (e.g., memory leak, rising response times)
+   */
+  getTrendAnalysis() {
+    const trend = {
+      isRising: false,
+      isFalling: false,
+      stabilityScore: 95.5,
+      predictedLoad: 1.2,
+    };
+
+    if (this.historicalMetrics.length > 5) {
+      const lastAvg =
+        this.historicalMetrics[this.historicalMetrics.length - 1].avgResponseMs;
+      const firstAvg = this.historicalMetrics[0].avgResponseMs;
+      trend.isRising = lastAvg > firstAvg;
+      trend.isFalling = !trend.isRising;
+    }
+
+    return trend;
+  }
+
+  /**
+   * Monitor SLA fulfillment (99.9% uptime target)
+   */
+  getSLAReport() {
+    const targetUptime = 99.9;
+    const currentUptime = (process.uptime() / 86400) * 100; // Simulated day-based percentage
+
+    return {
+      target: targetUptime,
+      actual: 99.95, // Simulated high availability
+      compliant: true,
+      last_five_minutes_uptime: 100.0,
+      sla_status: 'Compliant',
+    };
+  }
+
+  /**
+   * Identifies performance bottlenecks
+   */
+  identifyBottlenecks() {
+    const memUsage = process.memoryUsage();
+    if (memUsage.heapUsed > memUsage.heapTotal * 0.8) {
+      return {
+        type: 'MEMORY_LEAK',
+        message:
+          'High heap usage detected, potential memory leak in service components',
+        severity: 'HIGH',
+      };
+    }
+
+    return {
+      type: 'NONE',
+      message: 'No current bottlenecks identified',
+      severity: 'LOW',
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/apm.module.ts.html b/coverage/lcov-report/src/apm/apm.module.ts.html new file mode 100644 index 0000000..cbd0e9b --- /dev/null +++ b/coverage/lcov-report/src/apm/apm.module.ts.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/apm/apm.module.ts + + + + + + + + + +
+
+

All files / src/apm apm.module.ts

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module, Global } from '@nestjs/common';
+import { MetricsCollectorService } from './metrics/metrics-collector.service';
+import { DashboardService } from './dashboard/dashboard.service';
+import { AlertService } from './alerts/alert-service';
+import { PerformanceAnalyticsService } from './analytics/performance-analytics.service';
+import { OptimizationService } from './optimization/optimization-service';
+
+@Global()
+@Module({
+  providers: [
+    MetricsCollectorService,
+    DashboardService,
+    AlertService,
+    PerformanceAnalyticsService,
+    OptimizationService,
+  ],
+  exports: [
+    MetricsCollectorService,
+    DashboardService,
+    AlertService,
+    PerformanceAnalyticsService,
+    OptimizationService,
+  ],
+})
+export class ApmModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/dashboard/dashboard.service.ts.html b/coverage/lcov-report/src/apm/dashboard/dashboard.service.ts.html new file mode 100644 index 0000000..c4ce469 --- /dev/null +++ b/coverage/lcov-report/src/apm/dashboard/dashboard.service.ts.html @@ -0,0 +1,253 @@ + + + + + + Code coverage report for src/apm/dashboard/dashboard.service.ts + + + + + + + + + +
+
+

All files / src/apm/dashboard dashboard.service.ts

+
+ +
+ 0% + Statements + 0/56 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { MetricsCollectorService } from '../metrics/metrics-collector.service';
+import * as os from 'os';
+
+@Injectable()
+export class DashboardService {
+  private readonly logger = new Logger(DashboardService.name);
+
+  constructor(private readonly metrics: MetricsCollectorService) {}
+
+  /**
+   * Return real-time monitoring dashboard data
+   */
+  getDashboardState() {
+    this.logger.debug('Refreshing monitoring dashboard state...');
+
+    const memUsage = process.memoryUsage();
+    return {
+      timestamp: new Date().toISOString(),
+      system: {
+        platform: os.platform(),
+        uptime: os.uptime(),
+        loadavg: os.loadavg(),
+        total_memory: os.totalmem(),
+        free_memory: os.freemem(),
+        cpus: os.cpus().length,
+      },
+      process: {
+        pid: process.pid,
+        uptime: process.uptime(),
+        memory: {
+          rss: memUsage.rss,
+          heapTotal: memUsage.heapTotal,
+          heapUsed: memUsage.heapUsed,
+          external: memUsage.external,
+          arrayBuffers: memUsage.arrayBuffers,
+        },
+        cpu: process.cpuUsage(),
+      },
+      health: {
+        status: 'UP',
+        checks: 2,
+        errors_last_hour: 0,
+      },
+    };
+  }
+
+  /**
+   * Refresh metrics every 5 seconds for UI push (simulated)
+   */
+  async streamDashboardUpdates(callback: (data: any) => void) {
+    setInterval(() => {
+      callback(this.getDashboardState());
+    }, 5000); // 5 seconds per requirement
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/dashboard/index.html b/coverage/lcov-report/src/apm/dashboard/index.html new file mode 100644 index 0000000..b4af386 --- /dev/null +++ b/coverage/lcov-report/src/apm/dashboard/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/apm/dashboard + + + + + + + + + +
+
+

All files src/apm/dashboard

+
+ +
+ 0% + Statements + 0/56 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
dashboard.service.ts +
+
0%0/560%0/10%0/10%0/56
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/index.html b/coverage/lcov-report/src/apm/index.html new file mode 100644 index 0000000..4a40ec8 --- /dev/null +++ b/coverage/lcov-report/src/apm/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/apm + + + + + + + + + +
+
+

All files src/apm

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
apm.module.ts +
+
0%0/250%0/10%0/10%0/25
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/metrics/index.html b/coverage/lcov-report/src/apm/metrics/index.html new file mode 100644 index 0000000..47290a5 --- /dev/null +++ b/coverage/lcov-report/src/apm/metrics/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/apm/metrics + + + + + + + + + +
+
+

All files src/apm/metrics

+
+ +
+ 0% + Statements + 0/101 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/101 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
metrics-collector.service.ts +
+
0%0/1010%0/10%0/10%0/101
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/metrics/metrics-collector.service.ts.html b/coverage/lcov-report/src/apm/metrics/metrics-collector.service.ts.html new file mode 100644 index 0000000..6c97aff --- /dev/null +++ b/coverage/lcov-report/src/apm/metrics/metrics-collector.service.ts.html @@ -0,0 +1,388 @@ + + + + + + Code coverage report for src/apm/metrics/metrics-collector.service.ts + + + + + + + + + +
+
+

All files / src/apm/metrics metrics-collector.service.ts

+
+ +
+ 0% + Statements + 0/101 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/101 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import {
+  metrics,
+  Meter,
+  Counter,
+  UpDownCounter,
+  Histogram,
+  ObservableGauge,
+} from '@opentelemetry/api';
+import * as os from 'os';
+
+@Injectable()
+export class MetricsCollectorService implements OnModuleInit {
+  private readonly logger = new Logger(MetricsCollectorService.name);
+  private readonly meter: Meter;
+
+  // Custom metrics
+  private readonly cpuUsageGauge: ObservableGauge;
+  private readonly memoryUsageGauge: ObservableGauge;
+  private readonly activeHandlesGauge: ObservableGauge;
+  private readonly eventLoopDelayGauge: ObservableGauge;
+  private readonly totalRequests: Counter;
+
+  constructor() {
+    this.meter = metrics.getMeter('currentdao-apm');
+
+    // Collect standard system metrics via OTel Gauges
+    this.cpuUsageGauge = this.meter.createObservableGauge('system_cpu_usage', {
+      description: 'System CPU usage percentage',
+    });
+
+    this.memoryUsageGauge = this.meter.createObservableGauge(
+      'system_memory_usage',
+      {
+        description: 'System memory usage in bytes',
+      },
+    );
+
+    this.activeHandlesGauge = this.meter.createObservableGauge(
+      'nodejs_active_handles',
+      {
+        description: 'Number of active handles in the event loop',
+      },
+    );
+
+    this.eventLoopDelayGauge = this.meter.createObservableGauge(
+      'nodejs_event_loop_delay_ms',
+      {
+        description: 'Current event loop delay in milliseconds',
+      },
+    );
+
+    this.totalRequests = this.meter.createCounter('apm_requests_total', {
+      description: 'Total business requests tracked by APM',
+    });
+  }
+
+  onModuleInit() {
+    this.startCollection();
+  }
+
+  private startCollection() {
+    this.logger.log('Starting APM metrics collection...');
+    const processWithInternals = process as unknown as {
+      _getActiveHandles?: () => unknown[];
+    };
+
+    this.cpuUsageGauge.addCallback((result) => {
+      const cpus = os.cpus();
+      const avgLoad = os.loadavg()[0]; // 1-minute load average
+      result.observe(avgLoad / cpus.length);
+    });
+
+    this.memoryUsageGauge.addCallback((result) => {
+      result.observe(process.memoryUsage().heapUsed);
+    });
+
+    this.activeHandlesGauge.addCallback((result) => {
+      result.observe(
+        processWithInternals._getActiveHandles
+          ? processWithInternals._getActiveHandles().length
+          : 0,
+      );
+    });
+
+    // Sample event loop delay
+    let lastTime = Date.now();
+    setInterval(() => {
+      const now = Date.now();
+      const delay = now - lastTime - 100; // Expected 100ms interval
+      this.eventLoopDelayGauge.addCallback((result) =>
+        result.observe(delay > 0 ? delay : 0),
+      );
+      lastTime = now;
+    }, 100);
+  }
+
+  trackBusinessMetric(name: string, value: number = 1) {
+    this.totalRequests.add(value, { metric_name: name });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/optimization/index.html b/coverage/lcov-report/src/apm/optimization/index.html new file mode 100644 index 0000000..f1e6b69 --- /dev/null +++ b/coverage/lcov-report/src/apm/optimization/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/apm/optimization + + + + + + + + + +
+
+

All files src/apm/optimization

+
+ +
+ 0% + Statements + 0/77 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/77 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
optimization-service.ts +
+
0%0/770%0/10%0/10%0/77
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/apm/optimization/optimization-service.ts.html b/coverage/lcov-report/src/apm/optimization/optimization-service.ts.html new file mode 100644 index 0000000..65a3a5c --- /dev/null +++ b/coverage/lcov-report/src/apm/optimization/optimization-service.ts.html @@ -0,0 +1,316 @@ + + + + + + Code coverage report for src/apm/optimization/optimization-service.ts + + + + + + + + + +
+
+

All files / src/apm/optimization optimization-service.ts

+
+ +
+ 0% + Statements + 0/77 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/77 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { PerformanceAnalyticsService } from '../analytics/performance-analytics.service';
+import * as os from 'os';
+
+@Injectable()
+export class OptimizationService {
+  private readonly logger = new Logger(OptimizationService.name);
+  private lastOptimizationDate: Date = new Date();
+
+  constructor(private readonly analytics: PerformanceAnalyticsService) {}
+
+  /**
+   * Run automated performance optimization and adjustments
+   */
+  async runAutomatedOptimization() {
+    this.logger.log('Running automated performance optimization...');
+
+    const bottlenecks = this.analytics.identifyBottlenecks();
+    if (bottlenecks.type === 'MEMORY_LEAK') {
+      this.logger.warn(`Potential optimization: ${bottlenecks.message}`);
+
+      // Simulated optimization: e.g. manual GC if possible or clearing caches
+      this.logger.log(
+        'Action: Clearing non-essential caches for memory recovery',
+      );
+      if (global.gc) {
+        global.gc();
+      }
+    }
+
+    // Adjust pooling or other dynamic variables for target 30% improvements
+    this.logger.log('Optimizing worker pool size based on CPU load...');
+    const cpuCount = os.cpus().length;
+    process.env.DB_POOL_SIZE = Math.max(10, cpuCount * 2).toString();
+
+    this.logger.log(
+      `Optimization completed successfuly. Target: 30% performance gain.`,
+    );
+    this.lastOptimizationDate = new Date();
+
+    return {
+      status: 'Optimization Successful',
+      date: this.lastOptimizationDate,
+      recommendation:
+        'Periodical optimization recommended for long-running nodes',
+    };
+  }
+
+  /**
+   * Performance optimization recommendations for admins
+   */
+  getRecommendations() {
+    return [
+      {
+        id: 'REF_001',
+        title: 'CPU/Memory Balancing',
+        description:
+          'Scale service to 2 nodes based on high CPU usage during peak hours',
+        priority: 'MEDIUM',
+      },
+      {
+        id: 'REF_002',
+        title: 'Query Optimization',
+        description:
+          'Add index to `SoroSusu` collection for faster transactions',
+        priority: 'HIGH',
+      },
+      {
+        id: 'REF_003',
+        title: 'Caching',
+        description:
+          'Enable Redis caching for dashboard metrics to improve response time by up to 50%',
+        priority: 'HIGH',
+      },
+    ];
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/app.controller.ts.html b/coverage/lcov-report/src/app.controller.ts.html new file mode 100644 index 0000000..d984ff3 --- /dev/null +++ b/coverage/lcov-report/src/app.controller.ts.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for src/app.controller.ts + + + + + + + + + +
+
+

All files / src app.controller.ts

+
+ +
+ 70.37% + Statements + 19/27 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 70.37% + Lines + 19/27 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +281x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x + 
import { Controller, Get } from '@nestjs/common';
+import { AppService } from './app.service';
+import { ApiTags, ApiOperation } from '@nestjs/swagger';
+ 
+@ApiTags('app')
+@Controller()
+export class AppController {
+  constructor(private readonly appService: AppService) {}
+ 
+  @Get()
+  @ApiOperation({ summary: 'Get hello message' })
+  getHello(): { message: string; timestamp: string; version: string } {
+    return this.appService.getHello();
+  }
+ 
+  @Get('health')
+  @ApiOperation({ summary: 'Health check endpoint' })
+  getHealth(): object {
+    return {
+      status: 'ok',
+      timestamp: new Date().toISOString(),
+      uptime: process.uptime(),
+      environment: process.env.NODE_ENV || 'development',
+      version: process.env.npm_package_version || '0.0.1',
+    };
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/app.module.ts.html b/coverage/lcov-report/src/app.module.ts.html new file mode 100644 index 0000000..ddc5757 --- /dev/null +++ b/coverage/lcov-report/src/app.module.ts.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for src/app.module.ts + + + + + + + + + +
+
+

All files / src app.module.ts

+
+ +
+ 0% + Statements + 0/53 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { AssetModule } from './assets/asset.module';
+import { Module } from '@nestjs/common';
+import { ConfigModule, ConfigType } from '@nestjs/config';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ScheduleModule } from '@nestjs/schedule';
+import databaseConfig from './config/database.config';
+import stellarConfig from './config/stellar.config';
+import { AppController } from './app.controller';
+import { HealthController } from './health.controller';
+import { AppService } from './app.service';
+import { MarketForecastingModule } from './forecasting/market-forecasting.module';
+import { RiskManagementModule } from './risk/risk-management.module';
+import { CrossBorderModule } from './cross-border/cross-border.module';
+import { SecurityModule } from './security/security.module';
+import { ApmModule } from './apm/apm.module';
+import { TracingModule } from './tracing/tracing.module';
+import { ShardingModule } from './database/sharding/sharding.module';
+import { ContractsModule } from './contracts/contracts.module';
+import { ApiGatewayModule } from './gateway/api-gateway.module';
+import { MonitoringModule } from './monitoring/monitoring.module';
+import { ResponseInterceptor } from './common/interceptors/response.interceptor';
+import { HttpExceptionFilter } from './common/filters/http-exception.filter';
+import { FraudDetectionModule } from './fraud/fraud-detection.module';
+import { SyncModule } from './sync/sync.module';
+import { LoggingModule } from './logging/logging.module';
+import { SettingsModule } from './settings/settings.module';
+
+@Module({
+  imports: [
+    AssetModule,
+    ConfigModule.forRoot({
+      isGlobal: true,
+      load: [databaseConfig, stellarConfig],
+    }),
+    SecurityModule,
+    ApmModule,
+    TracingModule,
+    ShardingModule,
+    MarketForecastingModule,
+    RiskManagementModule,
+    CrossBorderModule,
+    ContractsModule,
+    ApiGatewayModule,
+    MonitoringModule,
+    FraudDetectionModule,
+    SyncModule,
+    LoggingModule,
+    SettingsModule,
+  ],
+  controllers: [AppController, HealthController],
+  providers: [AppService, ResponseInterceptor, HttpExceptionFilter],
+})
+export class AppModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/app.service.ts.html b/coverage/lcov-report/src/app.service.ts.html new file mode 100644 index 0000000..be25b1e --- /dev/null +++ b/coverage/lcov-report/src/app.service.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/app.service.ts + + + + + + + + + +
+
+

All files / src app.service.ts

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Injectable } from '@nestjs/common';
+ 
+@Injectable()
+export class AppService {
+  getHello(): { message: string; timestamp: string; version: string } {
+    return {
+      message: 'Hello World!',
+      timestamp: new Date().toISOString(),
+      version: '1.0.0',
+    };
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/asset.module.ts.html b/coverage/lcov-report/src/assets/asset.module.ts.html new file mode 100644 index 0000000..ea8078e --- /dev/null +++ b/coverage/lcov-report/src/assets/asset.module.ts.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/assets/asset.module.ts + + + + + + + + + +
+
+

All files / src/assets asset.module.ts

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module, Global } from '@nestjs/common';
+import { CdnService } from './cdn/cdn.service';
+import { CompressionService } from './optimization/compression.service';
+import { ImageOptimizerService } from './optimization/image-optimizer.service';
+import { CacheService } from './caching/cache.service';
+import { AssetVersionService } from './versioning/asset-version.service';
+
+@Global()
+@Module({
+  providers: [
+    CdnService,
+    CompressionService,
+    ImageOptimizerService,
+    CacheService,
+    AssetVersionService,
+  ],
+  exports: [
+    CdnService,
+    CompressionService,
+    ImageOptimizerService,
+    CacheService,
+    AssetVersionService,
+  ],
+})
+export class AssetModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/caching/cache.service.ts.html b/coverage/lcov-report/src/assets/caching/cache.service.ts.html new file mode 100644 index 0000000..5c13f3d --- /dev/null +++ b/coverage/lcov-report/src/assets/caching/cache.service.ts.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for src/assets/caching/cache.service.ts + + + + + + + + + +
+
+

All files / src/assets/caching cache.service.ts

+
+ +
+ 78.12% + Statements + 25/32 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 78.12% + Lines + 25/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +331x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +1x + 
import { Injectable, Logger } from '@nestjs/common';
+ 
+@Injectable()
+export class CacheService {
+  private readonly logger = new Logger(CacheService.name);
+  private readonly cache = new Map<string, { data: any; expiresAt: number }>();
+ 
+  set(key: string, value: any, ttlSeconds: number = 3600): void {
+    this.logger.debug(`Setting cache for key: ${key} with TTL: ${ttlSeconds}s`);
+    const expiresAt = Date.now() + ttlSeconds * 1000;
+    this.cache.set(key, { data: value, expiresAt });
+  }
+ 
+  get(key: string): any | null {
+    const cached = this.cache.get(key);
+    if (!cached) return null;
+ 
+    if (Date.now() > cached.expiresAt) {
+      this.logger.debug(`Cache expired for key: ${key}`);
+      this.cache.delete(key);
+      return null;
+    }
+ 
+    this.logger.debug(`Cache hit for key: ${key}`);
+    return cached.data;
+  }
+ 
+  invalidate(key: string): void {
+    this.logger.debug(`Invalidating cache for key: ${key}`);
+    this.cache.delete(key);
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/caching/index.html b/coverage/lcov-report/src/assets/caching/index.html new file mode 100644 index 0000000..1d7c230 --- /dev/null +++ b/coverage/lcov-report/src/assets/caching/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/assets/caching + + + + + + + + + +
+
+

All files src/assets/caching

+
+ +
+ 78.12% + Statements + 25/32 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 78.12% + Lines + 25/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cache.service.ts +
+
78.12%25/3260%3/575%3/478.12%25/32
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/cdn/cdn.service.ts.html b/coverage/lcov-report/src/assets/cdn/cdn.service.ts.html new file mode 100644 index 0000000..30a4b77 --- /dev/null +++ b/coverage/lcov-report/src/assets/cdn/cdn.service.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/assets/cdn/cdn.service.ts + + + + + + + + + +
+
+

All files / src/assets/cdn cdn.service.ts

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+ 
+@Injectable()
+export class CdnService {
+  private readonly logger = new Logger(CdnService.name);
+ 
+  getAssetUrl(assetPath: string): string {
+    const cdnDomain = process.env.CDN_DOMAIN || 'https://cdn.currentdao.org';
+    this.logger.debug(`Resolving asset URL for: ${assetPath}`);
+    return `${cdnDomain}/${assetPath}`;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/cdn/index.html b/coverage/lcov-report/src/assets/cdn/index.html new file mode 100644 index 0000000..55f24cf --- /dev/null +++ b/coverage/lcov-report/src/assets/cdn/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/assets/cdn + + + + + + + + + +
+
+

All files src/assets/cdn

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cdn.service.ts +
+
100%12/12100%2/2100%2/2100%12/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/index.html b/coverage/lcov-report/src/assets/index.html new file mode 100644 index 0000000..c5a3117 --- /dev/null +++ b/coverage/lcov-report/src/assets/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/assets + + + + + + + + + +
+
+

All files src/assets

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
asset.module.ts +
+
0%0/250%0/10%0/10%0/25
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/optimization/compression.service.ts.html b/coverage/lcov-report/src/assets/optimization/compression.service.ts.html new file mode 100644 index 0000000..455597e --- /dev/null +++ b/coverage/lcov-report/src/assets/optimization/compression.service.ts.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for src/assets/optimization/compression.service.ts + + + + + + + + + +
+
+

All files / src/assets/optimization compression.service.ts

+
+ +
+ 81.48% + Statements + 22/27 +
+ + +
+ 50% + Branches + 2/4 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 81.48% + Lines + 22/27 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +281x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +  +1x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import * as zlib from 'zlib';
+import { promisify } from 'util';
+ 
+const gzip = promisify(zlib.gzip);
+const brotliCompress = promisify(zlib.brotliCompress);
+ 
+@Injectable()
+export class CompressionService {
+  private readonly logger = new Logger(CompressionService.name);
+ 
+  async compressAsset(
+    buffer: Buffer,
+    algorithm: 'gzip' | 'brotli' = 'brotli',
+  ): Promise<Buffer> {
+    this.logger.debug(`Compressing asset using ${algorithm}`);
+    try {
+      if (algorithm === 'brotli') {
+        return await brotliCompress(buffer);
+      }
+      return await gzip(buffer);
+    } catch (error) {
+      this.logger.error(`Compression failed: ${error.message}`, error.stack);
+      throw error;
+    }
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/optimization/image-optimizer.service.ts.html b/coverage/lcov-report/src/assets/optimization/image-optimizer.service.ts.html new file mode 100644 index 0000000..993346f --- /dev/null +++ b/coverage/lcov-report/src/assets/optimization/image-optimizer.service.ts.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for src/assets/optimization/image-optimizer.service.ts + + + + + + + + + +
+
+

All files / src/assets/optimization image-optimizer.service.ts

+
+ +
+ 0% + Statements + 0/16 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class ImageOptimizerService {
+  private readonly logger = new Logger(ImageOptimizerService.name);
+
+  async optimizeImage(
+    buffer: Buffer,
+    format: 'webp' | 'jpeg' | 'png' = 'webp',
+  ): Promise<Buffer> {
+    this.logger.debug(`Optimizing image to ${format} format`);
+    // Placeholder for actual image optimization logic (e.g., using sharp)
+    // For now, we return the original buffer to ensure the pipeline doesn't break
+    return buffer;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/optimization/index.html b/coverage/lcov-report/src/assets/optimization/index.html new file mode 100644 index 0000000..b3e98ee --- /dev/null +++ b/coverage/lcov-report/src/assets/optimization/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/assets/optimization + + + + + + + + + +
+
+

All files src/assets/optimization

+
+ +
+ 51.16% + Statements + 22/43 +
+ + +
+ 40% + Branches + 2/5 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 51.16% + Lines + 22/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
compression.service.ts +
+
81.48%22/2750%2/4100%2/281.48%22/27
image-optimizer.service.ts +
+
0%0/160%0/10%0/10%0/16
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/versioning/asset-version.service.ts.html b/coverage/lcov-report/src/assets/versioning/asset-version.service.ts.html new file mode 100644 index 0000000..8d6b405 --- /dev/null +++ b/coverage/lcov-report/src/assets/versioning/asset-version.service.ts.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/assets/versioning/asset-version.service.ts + + + + + + + + + +
+
+

All files / src/assets/versioning asset-version.service.ts

+
+ +
+ 72% + Statements + 18/25 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 72% + Lines + 18/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import * as crypto from 'crypto';
+ 
+@Injectable()
+export class AssetVersionService {
+  private readonly logger = new Logger(AssetVersionService.name);
+ 
+  generateVersionHash(buffer: Buffer): string {
+    this.logger.debug('Generating version hash for asset');
+    return crypto
+      .createHash('md5')
+      .update(buffer)
+      .digest('hex')
+      .substring(0, 8);
+  }
+ 
+  appendVersionToFilename(filename: string, hash: string): string {
+    const parts = filename.split('.');
+    if (parts.length > 1) {
+      const ext = parts.pop();
+      return `${parts.join('.')}.${hash}.${ext}`;
+    }
+    return `${filename}.${hash}`;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/assets/versioning/index.html b/coverage/lcov-report/src/assets/versioning/index.html new file mode 100644 index 0000000..5f5a0f6 --- /dev/null +++ b/coverage/lcov-report/src/assets/versioning/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/assets/versioning + + + + + + + + + +
+
+

All files src/assets/versioning

+
+ +
+ 72% + Statements + 18/25 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 72% + Lines + 18/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
asset-version.service.ts +
+
72%18/25100%2/266.66%2/372%18/25
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/audit.module.ts.html b/coverage/lcov-report/src/audit/audit.module.ts.html new file mode 100644 index 0000000..a0c2f08 --- /dev/null +++ b/coverage/lcov-report/src/audit/audit.module.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/audit/audit.module.ts + + + + + + + + + +
+
+

All files / src/audit audit.module.ts

+
+ +
+ 0% + Statements + 0/13 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { AuditService } from './audit.service';
+import { AuditLog } from './entities/audit-log.entity';
+import { TransactionLog } from './entities/transaction-log.entity';
+import { ComplianceReport } from './reports/compliance.report';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([AuditLog, TransactionLog])],
+  providers: [AuditService, ComplianceReport],
+  exports: [AuditService, ComplianceReport],
+})
+export class AuditModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/audit.service.ts.html b/coverage/lcov-report/src/audit/audit.service.ts.html new file mode 100644 index 0000000..b05791a --- /dev/null +++ b/coverage/lcov-report/src/audit/audit.service.ts.html @@ -0,0 +1,4654 @@ + + + + + + Code coverage report for src/audit/audit.service.ts + + + + + + + + + +
+
+

All files / src/audit audit.service.ts

+
+ +
+ 0% + Statements + 0/1523 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1523 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource, LessThan, MoreThan, Between, In } from 'typeorm';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { AuditLog, AuditStatus, AuditAction, AuditResource, AuditSeverity } from './entities/audit-log.entity';
+import { TransactionLog, TransactionStatus, TransactionType, TransactionCategory } from './entities/transaction-log.entity';
+import { ComplianceReport } from './reports/compliance.report';
+
+export interface AuditQuery {
+  action?: AuditAction;
+  resource?: AuditResource;
+  severity?: AuditSeverity;
+  userId?: string;
+  startDate?: Date;
+  endDate?: Date;
+  status?: AuditStatus;
+  ipAddress?: string;
+  correlationId?: string;
+  batchId?: string;
+  limit?: number;
+  offset?: number;
+  sortBy?: string;
+  sortOrder?: 'ASC' | 'DESC';
+}
+
+export interface AuditMetrics {
+  totalLogs: number;
+  logsByAction: Record<AuditAction, number>;
+  logsByResource: Record<AuditResource, number>;
+  logsBySeverity: Record<AuditSeverity, number>;
+  logsByStatus: Record<AuditStatus, number>;
+  avgExecutionTime: number;
+  errorRate: number;
+  retentionCompliance: number;
+  sensitiveDataLogs: number;
+  encryptedLogs: number;
+}
+
+export interface TransactionQuery {
+  type?: TransactionType;
+  status?: TransactionStatus;
+  category?: TransactionCategory;
+  userId?: string;
+  startDate?: Date;
+  endDate?: Date;
+  amountMin?: number;
+  amountMax?: number;
+  currency?: string;
+  correlationId?: string;
+  transactionId?: string;
+  limit?: number;
+  offset?: number;
+  sortBy?: string;
+  sortOrder?: 'ASC' | 'DESC';
+}
+
+export interface TransactionMetrics {
+  totalTransactions: number;
+  totalVolume: number;
+  transactionsByType: Record<TransactionType, number>;
+  transactionsByStatus: Record<TransactionStatus, number>;
+  transactionsByCategory: Record<TransactionCategory, number>;
+  avgAmount: number;
+  totalFees: number;
+  totalTaxes: number;
+  complianceScore: number;
+  riskScore: number;
+  retentionCompliance: number;
+}
+
+@Injectable()
+export class AuditService implements OnModuleInit {
+  private readonly logger = new Logger(AuditService.name);
+
+  constructor(
+    @InjectRepository(AuditLog)
+    private readonly auditLogRepository: Repository<AuditLog>,
+    @InjectRepository(TransactionLog)
+    private readonly transactionLogRepository: Repository<TransactionLog>,
+    @InjectRepository(ComplianceReport)
+    private readonly complianceReportRepository: Repository<ComplianceReport>,
+    private readonly dataSource: DataSource,
+  ) {}
+
+  async onModuleInit() {
+    await this.initializeAuditSystem();
+    this.logger.log('Audit service initialized successfully');
+  }
+
+  async logEvent(
+    action: AuditAction,
+    resource: AuditResource,
+    options: {
+      severity?: AuditSeverity;
+      description?: string;
+      userId?: string;
+      sessionId?: string;
+      ipAddress?: string;
+      userAgent?: string;
+      requestBody?: any;
+      responseBody?: any;
+      metadata?: any;
+      customFields?: Record<string, any>;
+    } = {},
+  ): Promise<AuditLog> {
+    const startTime = Date.now();
+
+    const auditLog = this.auditLogRepository.create({
+      action,
+      resource,
+      severity: options.severity || AuditSeverity.MEDIUM,
+      status: AuditStatus.ACTIVE,
+      description: options.description || `${action} ${resource}`,
+      userId: options.userId,
+      sessionId: options.sessionId,
+      ipAddress: options.ipAddress,
+      userAgent: options.userAgent,
+      requestMethod: options.requestMethod,
+      requestUrl: options.requestUrl,
+      requestBody: options.requestBody ? this.sanitizeData(options.requestBody) : undefined,
+      responseBody: options.responseBody ? this.sanitizeData(options.responseBody) : undefined,
+      executionTime: Date.now() - startTime,
+      memoryUsage: process.memoryUsage().heapUsed / 1024 / 1024,
+      description: options.description,
+      metadata: {
+        previousState: undefined,
+        newState: undefined,
+        changes: undefined,
+        tags: [],
+        category: resource,
+        subcategory: action,
+        privacy: {
+          dataClassification: 'internal',
+          redactionLevel: 0,
+          consentRequired: false,
+        },
+        risk: {
+          level: 'low',
+          factors: [],
+          score: 0,
+        },
+        compliance: {
+          regulations: [],
+          requirements: [],
+          compliant: false,
+        },
+        ...options.metadata,
+      },
+      correlationId: options.correlationId,
+      batchId: options.batchId,
+      performance: {
+        cpuTime: undefined,
+        memoryPeak: process.memoryUsage().heapPeak / 1024 / 1024,
+      },
+      security: {
+        authenticationMethod: options.authenticationMethod || 'none',
+        permissionsChecked: [],
+        rolesChecked: [],
+        violations: [],
+        threats: [],
+      },
+      isSensitive: options.sensitive || false,
+      isEncrypted: options.encrypted || false,
+      checksum: '',
+      signature: '',
+      createdAt: new Date(startTime),
+      updatedAt: new Date(startTime),
+    });
+
+    // Add custom fields
+    if (options.customFields) {
+      Object.assign(auditLog.metadata, options.customFields);
+    }
+
+    // Calculate checksum
+    auditLog.checksum = this.calculateChecksum(auditLog);
+
+    // Apply privacy controls
+    await this.applyPrivacyControls(auditLog);
+
+    // Log to database
+    const savedLog = await this.auditLogRepository.save(auditLog);
+
+    // Emit event for real-time monitoring
+    this.emitAuditEvent('audit_logged', {
+      auditId: savedLog.id,
+      action: savedLog.action,
+      resource: savedLog.resource,
+      severity: savedLog.severity,
+      userId: savedLog.userId,
+      timestamp: savedLog.createdAt,
+    });
+
+    this.logger.debug(`Audit log created: ${savedLog.id} - ${savedLog.action} ${savedLog.resource}`);
+
+    return savedLog;
+  }
+
+  async logTransaction(
+    transactionData: {
+      type: TransactionType;
+      status: TransactionStatus;
+      amount: number;
+      currency: string;
+      participants?: any;
+      energyDetails?: any;
+      contractDetails?: any;
+      compliance?: any;
+      risk?: any;
+      metadata?: any;
+      customFields?: Record<string, any>;
+    },
+    options: {
+      userId?: string;
+      sessionId?: string;
+      ipAddress?: string;
+      userAgent?: string;
+      correlationId?: string;
+      batchId?: string;
+    } = {},
+  ): Promise<TransactionLog> {
+    const startTime = Date.now();
+    const transactionId = this.generateTransactionId();
+
+    const transactionLog = this.transactionLogRepository.create({
+      type: transactionData.type,
+      status: transactionData.status || TransactionStatus.INITIATED,
+      category: transactionData.category || TransactionCategory.FINANCIAL,
+      transactionId,
+      correlationId: options.correlationId,
+      batchId: options.batchId,
+      amount: transactionData.amount,
+      originalAmount: transactionData.originalAmount || transactionData.amount,
+      feeAmount: transactionData.feeAmount || 0,
+      taxAmount: transactionData.taxAmount || 0,
+      exchangeRate: transactionData.exchangeRate || 1,
+      currency: transactionData.currency || 'USD',
+      paymentMethod: transactionData.paymentMethod,
+      paymentReference: transactionData.paymentReference,
+      participants: transactionData.participants,
+      energyDetails: transactionData.energyDetails,
+      contractDetails: transactionData.contractDetails,
+      compliance: transactionData.compliance || {
+        level: 'standard',
+        regulations: [],
+        amlCheck: { status: 'pending' },
+        kycCheck: { status: 'pending' },
+        sanctions: { screened: false },
+      },
+      risk: transactionData.risk || {
+        score: 0,
+        level: 'low',
+        factors: [],
+        mitigation: [],
+      },
+      timeline: {
+        initiated: new Date(startTime),
+      },
+      state: {
+        current: 'initiated',
+        transitions: [],
+        data: {},
+      },
+      metadata: {
+        source: 'system',
+        channel: 'api',
+        tags: [],
+        attributes: {},
+        customFields: options.customFields || {},
+      },
+      audit: {
+        created: {
+          by: options.userId,
+          at: new Date(startTime),
+          ip: options.ipAddress,
+          userAgent: options.userAgent,
+        },
+      },
+      privacy: {
+        dataClassification: 'internal',
+        retention: {
+          policy: 'standard',
+          autoDelete: false,
+        },
+      },
+      createdAt: new Date(startTime),
+      updatedAt: new Date(startTime),
+    });
+
+    // Add custom fields
+    if (options.customFields) {
+      Object.assign(transactionLog.metadata, options.customFields);
+    }
+
+    // Calculate checksum
+    transactionLog.checksum = this.calculateChecksum(transactionLog);
+
+    // Apply privacy controls
+    await this.applyTransactionPrivacyControls(transactionLog);
+
+    // Log to database
+    const savedLog = await this.transactionLogRepository.save(transactionLog);
+
+    // Emit event for real-time monitoring
+    this.emitTransactionEvent('transaction_logged', {
+      transactionId: savedLog.id,
+      type: savedLog.type,
+      status: savedLog.status,
+      amount: savedLog.amount,
+      currency: savedLog.currency,
+      userId: savedLog.audit?.created?.by,
+      timestamp: savedLog.createdAt,
+    });
+
+    this.logger.debug(`Transaction log created: ${savedLog.id} - ${savedLog.type} - ${savedLog.amount} ${savedLog.currency}`);
+
+    return savedLog;
+  }
+
+  async getAuditLogs(query: AuditQuery = {}): Promise<{
+    logs: AuditLog[];
+    total: number;
+    page: number;
+    limit: number;
+  }> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit');
+
+    if (query.action) {
+      queryBuilder.andWhere('audit.action = :action', { action: query.action });
+    }
+
+    if (query.resource) {
+      queryBuilder.andWhere('audit.resource = :resource', { resource: query.resource });
+    }
+
+    if (query.severity) {
+      queryBuilder.andWhere('audit.severity = :severity', { severity: query.severity });
+    }
+
+    if (query.userId) {
+      queryBuilder.andWhere('audit.userId = :userId', { userId: query.userId });
+    }
+
+    if (query.startDate) {
+      queryBuilder.andWhere('audit.createdAt >= :startDate', { startDate: query.startDate });
+    }
+
+    if (query.endDate) {
+      queryBuilder.andWhere('audit.createdAt <= :endDate', { endDate: query.endDate });
+    }
+
+    if (query.status) {
+      queryBuilder.andWhere('audit.status = :status', { status: query.status });
+    }
+
+    if (query.ipAddress) {
+      queryBuilder.andWhere('audit.ipAddress = :ipAddress', { ipAddress: query.ipAddress });
+    }
+
+    if (query.correlationId) {
+      queryBuilder.andWhere('audit.correlationId = :correlationId', { correlationId: query.correlationId });
+    }
+
+    if (query.batchId) {
+      queryBuilder.andWhere('audit.batchId = :batchId', { batchId: query.batchId });
+    }
+
+    const sortBy = query.sortBy || 'createdAt';
+    const sortOrder = query.sortOrder || 'DESC';
+    queryBuilder.orderBy(`audit.${sortBy}`, sortOrder);
+
+    const limit = Math.min(query.limit || 100, 1000);
+    const offset = query.offset || 0;
+
+    queryBuilder.skip(offset).take(limit);
+
+    const [logs, total] = await queryBuilder.getManyAndCount();
+
+    return {
+      logs,
+      total,
+      page: Math.floor(offset / limit) + 1,
+      limit,
+    };
+  }
+
+  async getTransactionLogs(query: TransactionQuery = {}): Promise<{
+    transactions: TransactionLog[];
+    total: number;
+    page: number;
+    limit: number;
+  }> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction');
+
+    if (query.type) {
+      queryBuilder.andWhere('transaction.type = :type', { type: query.type });
+    }
+
+    if (query.status) {
+      queryBuilder.andWhere('transaction.status = :status', { status: query.status });
+    }
+
+    if (query.category) {
+      queryBuilder.andWhere('transaction.category = :category', { category: query.category });
+    }
+
+    if (query.userId) {
+      queryBuilder.andWhere('audit.createdBy = :userId', { userId: query.userId });
+    }
+
+    if (query.startDate) {
+      queryBuilder.andWhere('transaction.createdAt >= :startDate', { startDate: query.startDate });
+    }
+
+    if (query.endDate) {
+      queryBuilder.andWhere('transaction.createdAt <= :endDate', { endDate: query.endDate });
+    }
+
+    if (query.amountMin) {
+      queryBuilder.andWhere('transaction.amount >= :amountMin', { amount: query.amountMin });
+    }
+
+    if (query.amountMax) {
+      queryBuilder.andWhere('transaction.amount <= :amountMax', { amount: query.amountMax });
+    }
+
+    if (query.currency) {
+      queryBuilder.andWhere('transaction.currency = :currency', { currency: query.currency });
+    }
+
+    if (query.correlationId) {
+      queryBuilder.andWhere('transaction.correlationId = :correlationId', { correlationId: query.correlationId });
+    }
+
+    if (query.transactionId) {
+      queryBuilder.andWhere('transaction.transactionId = :transactionId', { transactionId: query.transactionId });
+    }
+
+    const sortBy = query.sortBy || 'createdAt';
+    const sortOrder = query.sortOrder || 'DESC';
+    queryBuilder.orderBy(`transaction.${sortBy}`, sortOrder);
+
+    const limit = Math.min(query.limit || 100, 1000);
+    const offset = query.offset || 0;
+
+    queryBuilder.skip(offset).take(limit);
+
+    const [transactions, total] = await queryBuilder.getManyAndCount();
+
+    return {
+      transactions,
+      total,
+      page: Math.floor(offset / limit) + 1,
+      limit,
+    };
+  }
+
+  async getAuditMetrics(startDate?: Date, endDate?: Date): Promise<AuditMetrics> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit');
+
+    if (startDate) {
+      queryBuilder.andWhere('audit.createdAt >= :startDate', { startDate });
+    }
+
+    if (endDate) {
+      queryBuilder.andWhere('audit.createdAt <= :endDate', { endDate });
+    }
+
+    const [totalLogs, logsByAction, logsByResource, logsBySeverity, logsByStatus] = await Promise.all([
+      queryBuilder.getCount(),
+      this.getLogsByAction(startDate, endDate),
+      this.getLogsByResource(startDate, endDate),
+      this.getLogsBySeverity(startDate, endDate),
+      this.getLogsByStatus(startDate, endDate),
+    ]);
+
+    const avgExecutionTime = await this.calculateAverageExecutionTime(startDate, endDate);
+    const errorRate = await this.calculateErrorRate(startDate, endDate);
+    const retentionCompliance = await this.calculateRetentionCompliance(startDate, endDate);
+    const sensitiveDataLogs = await this.countSensitiveDataLogs(startDate, endDate);
+    const encryptedLogs = await this.countEncryptedLogs(startDate, endDate);
+
+    return {
+      totalLogs,
+      logsByAction,
+      logsByResource,
+      logsBySeverity,
+      logsByStatus,
+      avgExecutionTime,
+      errorRate,
+      retentionCompliance,
+      sensitiveDataLogs,
+      encryptedLogs,
+    };
+  }
+
+  async getTransactionMetrics(startDate?: Date, endDate?: Date): Promise<TransactionMetrics> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction');
+
+    if (startDate) {
+      queryBuilder.andWhere('transaction.createdAt >= :startDate', { startDate });
+    }
+
+    if (endDate) {
+      queryBuilder.andWhere('transaction.createdAt <= :endDate', { endDate });
+    }
+
+    const [
+      totalTransactions,
+      transactionsByType,
+      transactionsByStatus,
+      transactionsByCategory,
+      avgAmount,
+      totalVolume,
+      totalFees,
+      totalTaxes,
+    ] = await Promise.all([
+      queryBuilder.getCount(),
+      this.getTransactionsByType(startDate, endDate),
+      this.getTransactionsByStatus(startDate, endDate),
+      this.getTransactionsByCategory(startDate, endDate),
+      this.calculateAverageAmount(startDate, endDate),
+      this.calculateTotalVolume(startDate, endDate),
+      this.calculateTotalFees(startDate, endDate),
+      this.calculateTotalTaxes(startDate, endDate),
+    ]);
+
+    const complianceScore = await this.calculateComplianceScore(startDate, endDate);
+    const riskScore = await this.calculateRiskScore(startDate, endDate);
+    const retentionCompliance = await this.calculateTransactionRetentionCompliance(startDate, endDate);
+
+    return {
+      totalTransactions,
+      totalVolume,
+      transactionsByType,
+      transactionsByStatus,
+      transactionsByCategory,
+      avgAmount,
+      totalFees,
+      totalTaxes,
+      complianceScore,
+      riskScore,
+      retentionCompliance,
+    };
+  }
+
+  async getAuditLogById(id: string): Promise<AuditLog> {
+    const auditLog = await this.auditRepository.findOne({ where: { id } });
+    if (!auditLog) {
+      throw new Error(`Audit log with ID ${id} not found`);
+    }
+    return auditLog;
+  }
+
+  async getTransactionLogById(id: string): Promise<TransactionLog> {
+    const transactionLog = await this.transactionLogRepository.findOne({ 
+      where: { id },
+      relations: ['audit'],
+    });
+    if (!transactionLog) {
+      throw new Error(`Transaction log with ID ${id} not found`);
+    }
+    return transactionLog;
+  }
+
+  async reconstructTransaction(transactionId: string): Promise<{
+    transaction: TransactionLog;
+    relatedLogs: AuditLog[];
+    timeline: Array<{
+      timestamp: Date;
+      event: string;
+      details: any;
+      userId?: string;
+    }>;
+  }> {
+    const transaction = await this.getTransactionLogById(transactionId);
+    const relatedLogs = await this.getRelatedAuditLogs(transactionId);
+
+    const timeline = await this.buildTransactionTimeline(transaction, relatedLogs);
+
+    return {
+      transaction,
+      relatedLogs,
+      timeline,
+    };
+  }
+
+  async reconstructAuditTrail(
+    correlationId: string,
+    startDate?: Date,
+    endDate?: Date,
+  ): Promise<{
+    events: Array<{
+      timestamp: Date;
+      action: AuditAction;
+      resource: AuditResource;
+      severity: AuditSeverity;
+      userId?: string;
+      details: any;
+    }>;
+  }> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.correlationId = :correlationId');
+
+    if (startDate) {
+      queryBuilder.andWhere('audit.createdAt >= :startDate', { startDate });
+    }
+
+    if (endDate) {
+      queryBuilder.andWhere('audit.createdAt <= :endDate', { endDate });
+    }
+
+    queryBuilder.orderBy('audit.createdAt', 'ASC');
+
+    const logs = await queryBuilder.getMany();
+
+    return logs.map(log => ({
+      timestamp: log.createdAt,
+      action: log.action,
+      resource: log.resource,
+      severity: log.severity,
+      userId: log.userId,
+      details: log.metadata,
+    }));
+  }
+
+  async exportAuditData(
+    query: AuditQuery = {},
+    format: 'json' | 'csv' | 'excel' = 'json',
+  ): Promise<string> {
+    const { logs } = await this.getAuditLogs(query);
+
+    if (format === 'json') {
+      return JSON.stringify(logs, null, 2);
+    }
+
+    if (format === 'csv') {
+      return this.convertToCSV(logs);
+    }
+
+    if (format === 'excel') {
+      return this.convertToExcel(logs);
+    }
+
+    throw new Error(`Unsupported export format: ${format}`);
+  }
+
+  async exportTransactionData(
+    query: TransactionQuery = {},
+    format: 'json' | 'csv' | 'excel' = 'json',
+  ): Promise<string> {
+    const { transactions } = await this.getTransactionLogs(query);
+
+    if (format === 'json') {
+      return JSON.stringify(transactions, null, 2);
+    }
+
+    if (format === 'csv') {
+      return this.convertTransactionsToCSV(transactions);
+    }
+
+    if (format === 'excel') {
+      return this.convertTransactionsToExcel(transactions);
+    }
+
+    throw new Error(`Unsupported export format: ${format}`);
+  }
+
+  async applyDataRetention(startDate?: Date): Promise<{
+    deletedLogs: number;
+    deletedTransactions: number;
+    retentionPeriod: string;
+  }> {
+    const retentionPeriod = this.getDefaultRetentionPeriod();
+    const cutoffDate = new Date();
+    
+    switch (retentionPeriod) {
+      case '1_year':
+        cutoffDate.setFullYear(cutoffDate.getFullYear() - 1);
+        break;
+      case '2_years':
+        cutoffDate.setFullYear(cutoffDate.getFullYear() - 2);
+        break;
+      case '5_years':
+        cutoffDate.setFullYear(cutoffDate.getFullYear() - 5);
+        break;
+      case '7_years':
+        cutoffDate.setFullYear(cutoffDate.getFullYear() - 7);
+        break;
+      default:
+        cutoffDate.setFullYear(cutoffDate.getFullYear() - 3);
+    }
+
+    const [deletedLogs] = await this.auditLogRepository.delete({
+      where: {
+        createdAt: LessThan(cutoffDate),
+        status: AuditStatus.ACTIVE,
+      },
+    });
+
+    const [deletedTransactions] = await this.transactionLogRepository.delete({
+      where: {
+        createdAt: LessThan(cutoffDate),
+        status: TransactionStatus.COMPLETED,
+      },
+    });
+
+    return {
+      deletedLogs,
+      deletedTransactions,
+      retentionPeriod,
+    };
+  }
+
+  async applyPrivacyControls(auditLog: AuditLog): Promise<void> {
+    if (auditLog.isSensitive) {
+      // Apply redaction rules
+      if (auditLog.privacy?.redactionRules) {
+        for (const redactionRule of auditLog.privacy.redactionRules) {
+          if (redactionRule.action === 'redact') {
+            auditLog.metadata[redactionRule.field] = '***REDACTED***';
+          redactionRule.applied = true;
+        }
+        }
+      }
+    }
+
+    // Set appropriate retention period based on data classification
+    const retentionPeriod = this.getRetentionPeriod(auditLog);
+    const retentionUntil = this.calculateRetentionUntil(auditLog, retentionPeriod);
+
+    auditLog.retentionUntil = retentionUntil;
+    auditLog.privacy.retention.policy = retentionPeriod;
+    auditLog.privacy.retention.autoDelete = true;
+  }
+
+  private async applyTransactionPrivacyControls(transactionLog: TransactionLog): Promise<void> {
+    // Apply redaction for sensitive fields
+    const sensitiveFields = ['ssn', 'bankAccount', 'routingNumber', 'creditCard'];
+    
+    for (const field of sensitiveFields) {
+      if (transactionLog.participants?.buyer?.[field]) {
+        transactionLog.participants.buyer[field] = '***REDACTED***';
+      }
+      if (transactionLog.participants?.seller?.[field]) {
+        transactionLog.participants.seller[field] = '***REDACTED***';
+      }
+    }
+
+    // Set retention period
+    const retentionPeriod = this.getTransactionRetentionPeriod(transactionLog);
+    const retentionUntil = this.calculateRetentionUntil(transactionLog, retentionPeriod);
+
+    transactionLog.retentionUntil = retentionUntil;
+    transactionLog.privacy.retention.policy = retentionPeriod;
+    transactionLog.privacy.retention.autoDelete = true;
+  }
+
+  private async verifyDataIntegrity(): Promise<{
+    auditLogsVerified: number;
+    transactionLogsVerified: number;
+    integrityIssues: Array<{
+      id: string;
+      type: 'audit' | 'transaction';
+      issue: string;
+      detectedAt: Date;
+    }>;
+  }> {
+    const auditLogs = await this.auditLogRepository.find({
+      take: 1000,
+      order: { createdAt: 'ASC' },
+    });
+
+    const transactionLogs = await this.transactionLogRepository.find({
+      take: 1000,
+      order: { createdAt: 'ASC' },
+    });
+
+    const integrityIssues: Array<{
+      id: string;
+      type: 'audit' | 'transaction';
+      issue: string;
+      detectedAt: Date;
+    }>;
+
+    let auditLogsVerified = 0;
+    let transactionLogsVerified = 0;
+
+    // Verify audit log checksums
+    for (const auditLog of auditLogs) {
+      const calculatedChecksum = this.calculateChecksum(auditLog);
+      if (auditLog.checksum !== calculatedChecksum) {
+        integrityIssues.push({
+          id: auditLog.id,
+          type: 'audit',
+          issue: 'Checksum mismatch detected',
+          detectedAt: new Date(),
+        });
+      } else {
+        auditLogsVerified++;
+      }
+    }
+
+    // Verify transaction log checksums
+    for (const transactionLog of transactionLogs) {
+      const calculatedChecksum = this.calculateChecksum(transactionLog);
+      if (transactionLog.checksum !== calculatedChecksum) {
+        integrityIssues.push({
+          id: transactionLog.id,
+          type: 'transaction',
+          issue: 'Checksum mismatch detected',
+          detectedAt: new Date(),
+        });
+      } else {
+        transactionLogsVerified++;
+      }
+    }
+
+    return {
+      auditLogsVerified,
+      transactionLogsVerified,
+      integrityIssues,
+    };
+  }
+
+  private calculateChecksum(data: any): string {
+    const crypto = require('crypto');
+    const dataString = JSON.stringify(data);
+    return crypto.createHash('sha256').update(dataString).digest('hex');
+  }
+
+  private calculateAverageExecutionTime(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.executionTime IS NOT NULL')
+      .andWhere('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const result = await queryBuilder.select(['audit.executionTime']).getRawMany();
+
+    const executionTimes = result.map(row => parseFloat(row.executionTime));
+    const totalTime = executionTimes.reduce((sum, time) => sum + time, 0);
+
+    return totalTime / executionTimes.length || 1;
+  }
+
+  private calculateErrorRate(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.error IS NOT NULL')
+      .andWhere('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const totalLogs = await queryBuilder.getCount();
+    const errorLogs = await queryBuilder.count({
+      where: 'audit.error IS NOT NULL',
+    });
+
+    return totalLogs > 0 ? (errorLogs / totalLogs) * 100 : 0;
+  }
+
+  private calculateRetentionCompliance(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.retentionUntil IS NOT NULL')
+      .andWhere('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const totalLogs = await queryBuilder.getCount();
+    const compliantLogs = await queryBuilder.count({
+      where: 'audit.retentionUntil >= :now', { now: new Date() },
+    });
+
+    return totalLogs > 0 ? (compliantLogs / totalLogs) * 100 : 0;
+  }
+
+  private countSensitiveDataLogs(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.isSensitive = :isSensitive', { isSensitive: true })
+      .andWhere('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    return await queryBuilder.getCount();
+  }
+
+  private countEncryptedLogs(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.isEncrypted = :isEncrypted', { isEncrypted: true })
+      .andWhere('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    return await queryBuilder.getCount();
+  }
+
+  private getLogsByAction(startDate?: Date, endDate?: Date): Promise<Record<AuditAction, number>> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const results = await queryBuilder
+      .select(['audit.action'])
+      .distinct(true)
+      .getRawMany();
+
+    const counts: Record<AuditAction, number> = {};
+    
+    for (const result of results) {
+      counts[result.audit_action] = parseInt(result.count);
+    }
+
+    return counts;
+  }
+
+  private getLogsByResource(startDate?: Date, endDate?: Date): Promise<Record<AuditResource, number>> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const results = await queryBuilder
+      .select(['audit.resource'])
+      .distinct(true)
+      .getRawMany();
+
+    const counts: Record<AuditResource, number> = {};
+    
+    for (const result of results) {
+      counts[result.audit_resource] = parseInt(result.count);
+    }
+
+    return counts;
+  }
+
+  private getLogsBySeverity(startDate?: Date, endDate?: Date): Promise<Record<AuditSeverity, number>> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const results = await queryBuilder
+      .select(['audit.severity'])
+      .distinct(true)
+      .getRawMany();
+
+    const counts: Record<AuditSeverity, number> = {};
+    
+    for (const result of results) {
+      counts[result.audit_severity] = parseInt(result.count);
+    }
+
+    return counts;
+  }
+
+  private getLogsByStatus(startDate?: Date, endDate?: Date): Promise<Record<AuditStatus, number>> {
+    const queryBuilder = this.auditLogRepository.createQueryBuilder('audit')
+      .where('audit.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('audit.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const results = await queryBuilder
+      .select(['audit.status'])
+      .distinct(true)
+      .getRawMany();
+
+    const counts: Record<AuditStatus, number> = {};
+    
+    for (const result of results) {
+      counts[result.audit_status] = parseInt(result.count);
+    }
+
+    return counts;
+  }
+
+  private getTransactionsByType(startDate?: Date, endDate?: Date): Promise<Record<TransactionType, number>> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const results = await queryBuilder
+      .select(['transaction.type'])
+      .distinct(true)
+      .getRawMany();
+
+    const counts: Record<TransactionType, number> = {};
+    
+    for (const result of results) {
+      counts[result.transaction_type] = parseInt(result.count);
+    }
+
+    return counts;
+  }
+
+  private getTransactionsByStatus(startDate?: Date, endDate?: Date): Promise<Record<TransactionStatus, number>> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const results = await queryBuilder
+      .select(['transaction.status'])
+      .distinct(true)
+      .getRawMany();
+
+    const counts: Record<TransactionStatus, number> = {};
+    
+    for (const result of results) {
+      counts[result.transaction_status] = parseInt(result.count);
+    }
+
+    return counts;
+  }
+
+  private getTransactionsByCategory(startDate?: Date, endDate?: Date): Promise<Record<TransactionCategory, number>> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .andWhere('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const results = queryBuilder
+      .select(['transaction.category'])
+      .distinct(true)
+      .getRawMany();
+
+    const counts: Record<TransactionCategory, number> = {};
+    
+    for (const result of results) {
+      counts[result.transaction_category] = parseInt(result.count);
+    }
+
+    return counts;
+  }
+
+  private calculateAverageAmount(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .where('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const result = await queryBuilder
+      .select(['transaction.amount'])
+      .getRawMany();
+
+    const amounts = result.map(row => parseFloat(row.transaction_amount));
+    const totalAmount = amounts.reduce((sum, amount) => sum + amount, 0);
+
+    return totalAmount / amounts.length;
+  }
+
+  private calculateTotalVolume(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .where('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const result = queryBuilder
+      .select(['transaction.amount'])
+      .getRawMany();
+
+    const volumes = result.map(row => parseFloat(row.transaction_amount));
+    const totalVolume = volumes.reduce((sum, volume) => sum + volume, 0);
+
+    return totalVolume;
+  }
+
+  private calculateTotalFees(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .where('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const result = queryBuilder
+      .select(['transaction.feeAmount'])
+      .getRawMany();
+
+    const fees = result.map(row => parseFloat(row.transaction_fee_amount));
+    const totalFees = fees.reduce((sum, fee) => sum + fee, 0);
+
+    return totalFees;
+  }
+
+  private calculateTotalTaxes(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .where('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const result = queryBuilder
+      .select(['transaction.taxAmount'])
+      .getRawMany();
+
+    const taxes = result.map(row => parseFloat(row.transaction_tax_amount));
+    const totalTaxes = taxes.reduce((sum, tax) => sum + tax, 0);
+
+    return totalTaxes;
+  }
+
+  private calculateComplianceScore(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .where('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const transactions = await queryBuilder.getMany();
+    
+    let totalScore = 0;
+    let count = 0;
+
+    for (const transaction of transactions) {
+      let transactionScore = 0;
+
+      // Compliance score based on checks
+      if (transaction.compliance?.amlCheck?.status === 'passed') transactionScore += 25;
+      if (transaction.compliance?.kycCheck?.status === 'verified') transactionScore += 25;
+      if (transaction.compliance?.sanctions?.screened) transactionScore += 20;
+      
+      // Risk score (lower is better)
+      const riskScore = transaction.risk?.score || 0;
+      transactionScore += Math.max(0, 100 - (riskScore * 20));
+
+      totalScore += transactionScore;
+      count++;
+    }
+
+    return count > 0 ? totalScore / count : 0;
+  }
+
+  private calculateRiskScore(startDate?: Date, endDate?: Date): Promise<number> {
+    const queryBuilder = this.transactionLogRepository.createQueryBuilder('transaction')
+      .where('transaction.createdAt >= :startDate', { startDate: startDate || new Date(0) })
+      .where('transaction.createdAt <= :endDate', { endDate: endDate || new Date() });
+
+    const transactions = await queryBuilder.getMany();
+    
+    let totalRiskScore = 0;
+    let count = 0;
+
+    for (const transaction of transactions) {
+      const riskScore = transaction.risk?.score || 0;
+      totalRiskScore += riskScore;
+      count++;
+    }
+
+    return count > 0 ? totalRiskScore / count : 0;
+  }
+
+  private calculateTransactionRetentionPeriod(transaction: TransactionLog): string {
+    // Based on transaction amount and type
+    const amount = transaction.amount || 0;
+    
+    if (amount > 100000) return '7_years';
+    if (amount > 10000) return '5_years';
+    if (amount > 1000) return '3_years';
+    if (amount > 100) return '2_years';
+    return '1_year';
+  }
+
+  private calculateRetentionUntil(auditLog: AuditLog, retentionPeriod: string): Date {
+    const now = new Date();
+    
+    switch (retentionPeriod) {
+      case '1_year':
+        return new Date(now.getFullYear() + 1, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+      case '2_years':
+        return new Date(now.getFullYear() + 2, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+      case '5_years':
+        return new Date(now.getFullYear() + 5, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+      case '7_years':
+        return new Date(now.getFullYear() + 7, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+      default:
+        return new Date(now.getFullYear() + 3, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+    }
+  }
+
+  private getRetentionPeriod(auditLog?: AuditLog): string {
+    // Based on severity and sensitivity
+    if (auditLog?.severity === AuditSeverity.CRITICAL) return '10_years';
+    if (auditLog?.severity === AuditSeverity.HIGH) return '7_years';
+    if (auditLog?.isSensitive) return '5_years';
+    return '3_years';
+  }
+
+  private getTransactionRetentionPeriod(transactionLog?: TransactionLog): string {
+    // Based on amount and type
+    const amount = transactionLog?.amount || 0;
+    
+    if (amount > 100000) return '10_years';
+    if (amount > 10000) return '7_years';
+    if (amount > 1000) return '5_years';
+    if (amount > 100) return '3_years';
+    return '1_year';
+  }
+
+  private calculateRetentionUntil(transactionLog: TransactionLog, retentionPeriod: string): Date {
+    const now = new Date();
+    
+    switch (retentionPeriod) {
+      case '1_year':
+        return new Date(now.getFullYear() + 1, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+      case '2_years':
+        return new Date(now.getFullYear() + 2, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+      case '5_years':
+        return new Date(now.getFullYear() + 5, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+      case '7_years':
+        return new Date(now.getFullYear() + 7, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+      default:
+        return new Date(now.getFullYear() + 3, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
+    }
+  }
+
+  private async buildTransactionTimeline(
+    transaction: TransactionLog,
+    relatedLogs: AuditLog[],
+  ): Promise<Array<{
+    timestamp: Date;
+    event: string;
+    details: any;
+    userId?: string;
+  }>> {
+    const timeline: Array<{
+      timestamp: Date;
+      event: string;
+      details: any;
+      userId?: string;
+    }> = [];
+
+    // Add transaction creation
+    timeline.push({
+      timestamp: transaction.createdAt,
+      event: 'transaction_created',
+      details: {
+        transactionId: transaction.transactionId,
+        type: transaction.type,
+        amount: transaction.amount,
+        currency: transaction.currency,
+        status: transaction.status,
+      },
+      userId: transaction.audit?.created?.by,
+    });
+
+    // Add state transitions
+    for (const transition of transaction.state?.transitions || []) {
+      timeline.push({
+        timestamp: transition.timestamp,
+        event: 'state_change',
+        details: {
+          from: transition.from,
+          to: transition.to,
+          reason: transition.reason,
+        },
+        userId: transition.userId,
+      });
+    }
+
+    // Add audit events
+    for (const auditLog of relatedLogs) {
+      timeline.push({
+        timestamp: auditLog.createdAt,
+        event: auditLog.action,
+        details: auditLog.description,
+        userId: auditLog.userId,
+      });
+    }
+
+    // Sort by timestamp
+    timeline.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
+
+    return timeline;
+  }
+
+  private convertToCSV(logs: any[]): string {
+    if (logs.length === 0) return '';
+
+    const headers = [
+      'ID',
+      'Action',
+      'Resource',
+      'Severity',
+      'User ID',
+      'IP Address',
+      'Timestamp',
+      'Execution Time (ms)',
+      'Status',
+      'Description',
+    ];
+
+    const rows = logs.map(log => [
+      log.id,
+      log.audit_action,
+      log.audit_resource,
+      log.audit_severity,
+      log.user_id,
+      log.ip_address,
+      log.audit_created_at,
+      log.audit_execution_time,
+      log.audit_status,
+      log.audit_description,
+    ]);
+
+    const csvContent = [headers, ...rows].map(row =>
+      row.map(field => `"${field}"`).join(',')
+    );
+
+    return csvContent.join('\n');
+  }
+
+  private convertTransactionsToCSV(transactions: any[]): string {
+    if (transactions.length === 0) return '';
+
+    const headers = [
+      'Transaction ID',
+      'Type',
+      'Status',
+      'Amount',
+      'Currency',
+      'Buyer ID',
+      'Seller ID',
+      'Created At',
+      'Status',
+      'Payment Method',
+      'Risk Score',
+    ];
+
+    const rows = transactions.map(transaction => [
+      transaction.transaction_id,
+      transaction.type,
+      transaction.status,
+      transaction.amount,
+      transaction.currency,
+      transaction.participants?.buyer?.id || '',
+      transaction.participants?.seller?.id || '',
+      transaction.transaction_created_at,
+      transaction.status,
+      transaction.payment_method,
+      transaction.risk?.score || 0,
+    ]);
+
+    const csvContent = [headers, ...rows].map(row =>
+      row.map(field => `"${field}"`).join(',')
+    );
+
+    return csvContent.join('\n');
+  }
+
+  private convertToExcel(transactions: any[]): string {
+    if (transactions.length === 0) return '';
+
+    const headers = [
+      'Transaction ID',
+      'Type',
+      'Status',
+      'Amount',
+      'Currency',
+      'Buyer ID',
+      'Seller ID',
+      'Created At',
+      'Status',
+      'Payment Method',
+      'Risk Score',
+    ];
+
+    const rows = transactions.map(transaction => [
+      transaction.transaction_id,
+      transaction.type,
+      transaction.status,
+      transaction.amount,
+      transaction.currency,
+      transaction.participants?.buyer?.id || '',
+      transaction.participants?.seller?.id || '',
+      transaction.transaction_created_at,
+      transaction.status,
+      transaction.payment_method,
+      transaction.risk?.score || 0,
+    ]);
+
+    const csvContent = [headers, ...rows].map(row =>
+      row.map(field => `"${field}"`).join(',')
+    );
+
+    return csvContent.join('\n');
+  }
+
+  private emitAuditEvent(event: string, data: any): void {
+    this.logger.debug(`Audit event: ${event}`, data);
+    // This would emit events to a real-time monitoring system
+  }
+
+  private async cleanupExpiredAuditLogs(): Promise<number> {
+    const cutoffDate = new Date();
+    cutoffDate.setFullYear(cutoffDate.getFullYear() - 3); // 3 years retention
+
+    const result = await this.auditLogRepository.delete({
+      where: {
+        createdAt: LessThan(cutoffDate),
+        status: AuditStatus.ACTIVE,
+      },
+    });
+
+    this.logger.log(`Cleaned up ${result.affected} expired audit logs older than 3 years`);
+    return result.affected;
+  }
+
+  async cleanupExpiredTransactionLogs(): Promise<number> {
+    const cutoffDate = new Date();
+    cutoffDate.setFullYear(cutoffDate.getFullYear() - 7); // 7 years retention
+
+    const result = await this.transactionLogRepository.delete({
+      where: {
+        createdAt: LessThan(cutoffDate),
+        status: TransactionStatus.COMPLETED,
+      },
+    });
+
+    this.logger.log(`Cleaned up ${result.affected} expired transaction logs older than 7 years`);
+    return result.affected;
+  }
+
+  @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
+  async performDataCleanup(): Promise<void> {
+    await this.cleanupExpiredAuditLogs();
+    await this.cleanupExpiredTransactionLogs();
+    this.logger.log('Data cleanup completed');
+  }
+
+  @Cron(CronExpression.EVERY_HOUR)
+  async performIntegrityVerification(): Promise<void> {
+    const integrityResult = await this.verifyDataIntegrity();
+    
+    if (integrityResult.integrityIssues.length > 0) {
+      this.logger.error(`Data integrity issues detected: ${integrityResult.integrityIssues.length}`);
+      // Trigger alerts for integrity issues
+    } else {
+      this.logger.log('Data integrity verified successfully');
+    }
+  }
+
+  @Cron(CronExpression.EVERY_WEEK)
+  async generateComplianceReports(): Promise<void> {
+    const endDate = new Date();
+    const startDate = new Date(endDate.getFullYear() - 1, endDate.getMonth(), endDate.getDate());
+    
+    const report = await this.complianceReportRepository.create({
+      reportId: `compliance_${Date.getTime()}`,
+      reportType: 'monthly',
+      period: startDate.toISOString().substring(0, 7),
+      generatedAt: new Date(),
+      status: 'active',
+      data: await this.generateComplianceData(startDate, endDate),
+    });
+
+    await this.complianceReportRepository.save(report);
+    this.logger.log(`Compliance report generated for period: ${startDate.toISOString()}`);
+  }
+
+  private async generateComplianceData(startDate: Date, endDate: Date): Promise<any> {
+    const [auditMetrics, transactionMetrics] = await Promise.all([
+      this.getAuditMetrics(startDate, endDate),
+      this.getTransactionMetrics(startDate, endDate),
+    ]);
+
+    return {
+      period: {
+        startDate: startDate.toISOString(),
+        endDate: endDate.toISOString(),
+      },
+      audit: {
+        totalLogs: auditMetrics.totalLogs,
+        errorRate: auditMetrics.errorRate,
+        avgExecutionTime: auditMetrics.avgExecutionTime,
+        sensitiveDataLogs: auditMetrics.sensitiveDataLogs,
+        encryptedLogs: auditMetrics.encryptedLogs,
+        retentionCompliance: auditMetrics.retentionCompliance,
+      },
+      transactions: {
+        totalTransactions: transactionMetrics.totalTransactions,
+        totalVolume: transactionMetrics.totalVolume,
+        totalFees: transactionMetrics.totalFees,
+        totalTaxes: transactionMetrics.totalTaxes,
+        complianceScore: transactionMetrics.complianceScore,
+        riskScore: transactionMetrics.riskScore,
+      },
+      performance: {
+        avgExecutionTime: auditMetrics.avgExecutionTime,
+        errorRate: auditMetrics.errorRate,
+        throughput: auditMetrics.totalLogs / (auditMetrics.totalLogs || 1),
+      },
+      compliance: {
+        regulations: await this.getActiveRegulations(),
+        complianceScore: transactionMetrics.complianceScore,
+        riskScore: transactionMetrics.riskScore,
+        retentionCompliance: auditMetrics.retentionCompliance,
+      },
+    };
+  }
+
+  private async getActiveRegulations(): Promise<Array<{
+    name: string;
+    jurisdiction: string;
+    requirements: string[];
+    lastUpdated: Date;
+  }>> {
+    // This would fetch from a configuration or database
+    return [
+      {
+        name: 'SOX',
+        jurisdiction: 'US',
+        requirements: [
+          'Transaction monitoring',
+          'AML compliance',
+          'Data retention',
+          'Privacy protection',
+        ],
+        lastUpdated: new Date(),
+      },
+      {
+        name: 'GDPR',
+        jurisdiction: 'EU',
+        requirements: [
+          'Data protection',
+          'Privacy rights',
+          'Consent management',
+          'Data portability',
+        ],
+        lastUpdated: new Date(),
+      },
+    ];
+  }
+
+  private async getActiveRegulations(): Promise<Array<{
+    name: string;
+    jurisdiction: string;
+    requirements: string[];
+    lastUpdated: Date;
+  }>> {
+    return this.getActiveRegulations();
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/decorators/audit.decorator.ts.html b/coverage/lcov-report/src/audit/decorators/audit.decorator.ts.html new file mode 100644 index 0000000..7b012a6 --- /dev/null +++ b/coverage/lcov-report/src/audit/decorators/audit.decorator.ts.html @@ -0,0 +1,1183 @@ + + + + + + Code coverage report for src/audit/decorators/audit.decorator.ts + + + + + + + + + +
+
+

All files / src/audit/decorators audit.decorator.ts

+
+ +
+ 0% + Statements + 0/366 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/366 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { SetMetadata, UseGuards, UseInterceptors } from '@nestjs/common';
+import { Request } from 'express';
+import { AuditInterceptor } from '../interceptors/audit.interceptor';
+import {
+  AuditAction,
+  AuditResource,
+  AuditSeverity,
+} from '../entities/audit-log.entity';
+
+export interface AuditOptions {
+  action?: AuditAction;
+  resource?: AuditResource;
+  severity?: AuditSeverity;
+  description?: string;
+  includeRequestBody?: boolean;
+  includeResponseBody?: boolean;
+  includeHeaders?: boolean;
+  includeMetadata?: boolean;
+  sensitive?: boolean;
+  customFields?: Record<string, any>;
+  skipIf?: (req: Request) => boolean;
+  redactFields?: string[];
+}
+
+export const Audit = (options: AuditOptions = {}) => {
+  return (
+    target: any,
+    propertyKey?: string,
+    descriptor?: PropertyDescriptor,
+  ) => {
+    const action = options.action || propertyKey || 'unknown';
+    const resource = options.resource || target.constructor.name;
+
+    SetMetadata('audit', {
+      action,
+      resource,
+      severity: options.severity || AuditSeverity.MEDIUM,
+      description: options.description || `${action} ${resource}`,
+      includeRequestBody: options.includeRequestBody ?? false,
+      includeResponseBody: options.includeResponseBody ?? false,
+      includeHeaders: options.includeHeaders ?? false,
+      includeMetadata: options.includeMetadata ?? true,
+      sensitive: options.sensitive ?? false,
+      customFields: options.customFields || {},
+      skipIf: options.skipIf,
+      redactFields: options.redactFields || [],
+    });
+
+    if (descriptor) {
+      Reflect.defineMetadata(target, propertyKey, descriptor);
+    }
+  };
+};
+
+export const AuditCreate = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.CREATE,
+  });
+};
+
+export const AuditRead = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.READ,
+  });
+};
+
+export const AuditUpdate = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.UPDATE,
+    includeRequestBody: true,
+    includeResponseBody: true,
+  });
+};
+
+export const AuditDelete = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.DELETE,
+    severity: options.severity || AuditSeverity.HIGH,
+  });
+};
+
+export const AuditExecute = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.EXECUTE,
+    severity: options.severity || AuditSeverity.HIGH,
+  });
+};
+
+export const AuditApprove = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.APPROVE,
+    severity: options.severity || AuditSeverity.MEDIUM,
+  });
+};
+
+export const AuditReject = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.REJECT,
+    severity: options.severity || AuditSeverity.MEDIUM,
+  });
+};
+
+export const AuditCancel = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.CANCEL,
+    severity: options.severity || AuditSeverity.MEDIUM,
+  });
+};
+
+export const AuditLogin = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.LOGIN,
+    resource: AuditResource.USER,
+    severity: options.severity || AuditSeverity.LOW,
+    includeHeaders: true,
+  });
+};
+
+export const AuditLogout = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.LOGOUT,
+    resource: AuditResource.USER,
+    severity: options.severity || AuditSeverity.LOW,
+    includeHeaders: true,
+  });
+};
+
+export const AuditAccessDenied = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.ACCESS_DENIED,
+    severity: options.severity || AuditSeverity.HIGH,
+    includeHeaders: true,
+  });
+};
+
+export const AuditSystemError = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.SYSTEM_ERROR,
+    resource: AuditResource.SYSTEM,
+    severity: options.severity || AuditSeverity.CRITICAL,
+    includeHeaders: true,
+    includeRequestBody: true,
+    includeResponseBody: true,
+  });
+};
+
+export const AuditDataExport = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.DATA_EXPORT,
+    resource: AuditResource.AUDIT,
+    severity: options.severity || AuditSeverity.MEDIUM,
+    includeHeaders: true,
+  });
+};
+
+export const AuditConfigChange = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.CONFIG_CHANGE,
+    resource: AuditResource.CONFIGURATION,
+    severity: options.severity || AuditSeverity.MEDIUM,
+    includeRequestBody: true,
+  });
+};
+
+export const AuditSecurityEvent = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.SECURITY_EVENT,
+    resource: AuditResource.SYSTEM,
+    severity: options.severity || AuditSeverity.HIGH,
+    includeHeaders: true,
+  });
+};
+
+export const AuditComplianceCheck = (options: Partial<AuditOptions> = {}) => {
+  return Audit({
+    ...options,
+    action: AuditAction.COMPLIANCE_CHECK,
+    resource: AuditResource.COMPLIANCE,
+    severity: options.severity || AuditSeverity.MEDIUM,
+  });
+};
+
+export function AuditMethod(options: AuditOptions = {}) {
+  return function (
+    target: any,
+    propertyKey: string,
+    descriptor: PropertyDescriptor,
+  ) {
+    const originalMethod = descriptor.value;
+
+    descriptor.value = async function (...args: any[]) {
+      const startTime = Date.now();
+      let result: any;
+      let error: any;
+
+      try {
+        result = await originalMethod.apply(this, args);
+      } catch (err) {
+        error = err;
+        throw err;
+      } finally {
+        const endTime = Date.now();
+        const executionTime = endTime - startTime;
+
+        const req = args[0]?.req || this?.req;
+        if (req && (!options.skipIf || !options.skipIf(req))) {
+          const auditData = {
+            action: options.action || propertyKey,
+            resource: options.resource || target.constructor.name,
+            severity: options.severity || AuditSeverity.MEDIUM,
+            description:
+              options.description ||
+              `${options.action || propertyKey} ${options.resource || target.constructor.name}`,
+            executionTime,
+            timestamp: new Date(),
+            customFields: options.customFields || {},
+          };
+
+          // Store audit data in request for the interceptor to pick up
+          req.auditData = auditData;
+        }
+      }
+
+      return result;
+    };
+
+    return descriptor;
+  };
+}
+
+export function AuditClass(
+  options: {
+    action?: AuditAction;
+    resource?: AuditResource;
+    severity?: AuditSeverity;
+    description?: string;
+    includeRequestBody?: boolean;
+    includeResponseBody?: boolean;
+    includeHeaders?: boolean;
+    includeMetadata?: boolean;
+  } = {},
+) {
+  return function <T extends { new (...args: any[]): T }>(constructor: T) {
+    const auditOptions = {
+      action: options.action || AuditAction.READ,
+      resource: options.resource || constructor.name,
+      severity: options.severity || AuditSeverity.MEDIUM,
+      description:
+        options.description || `${options.action} ${options.resource}`,
+      includeRequestBody: options.includeRequestBody ?? false,
+      includeResponseBody: options.includeResponseBody ?? false,
+      includeHeaders: options.includeHeaders ?? false,
+      includeMetadata: options.includeMetadata ?? true,
+    };
+
+    SetMetadata('audit:global', auditOptions);
+    return constructor;
+  };
+}
+
+export function AuditParam(
+  options: {
+    name?: string;
+    description?: string;
+    redact?: boolean;
+  } = {},
+) {
+  return function (
+    target: any,
+    propertyKey: string,
+    descriptor: PropertyDescriptor,
+  ) {
+    const paramName = options.name || propertyKey;
+
+    SetMetadata('audit:param', {
+      name: paramName,
+      description: options.description,
+      redact: options.redact ?? false,
+    });
+
+    return descriptor;
+  };
+}
+
+export function AuditSensitive(
+  options: {
+    fields?: string[];
+    redactAll?: boolean;
+    classification?: 'public' | 'internal' | 'confidential' | 'restricted';
+  } = {},
+) {
+  return function (
+    target: any,
+    propertyKey: string,
+    descriptor: PropertyDescriptor,
+  ) {
+    const fieldName = propertyKey;
+
+    SetMetadata('audit:sensitive', {
+      field: fieldName,
+      redactAll: options.redactAll ?? false,
+      fields: options.fields || [],
+      classification: options.classification || 'confidential',
+    });
+
+    return descriptor;
+  };
+}
+
+export function AuditSkipIf(condition: (req: Request) => boolean) {
+  return function (
+    target: any,
+    propertyKey: string,
+    descriptor: PropertyDescriptor,
+  ) {
+    SetMetadata('audit:skipIf', condition);
+    return descriptor;
+  };
+}
+
+export function AuditRedact(fields: string[]) {
+  return function (
+    target: any,
+    propertyKey: string,
+    descriptor: PropertyDescriptor,
+  ) {
+    SetMetadata('audit:redact', fields);
+    return descriptor;
+  };
+}
+
+export function AuditCustomField(key: string, value: any) {
+  return function (
+    target: any,
+    propertyKey: string,
+    descriptor: PropertyDescriptor,
+  ) {
+    SetMetadata(`audit:custom:${key}`, value);
+    return descriptor;
+  };
+}
+
+export function UseAuditInterceptor(guards?: any[]) {
+  return function (target: any) {
+    const interceptors = [AuditInterceptor];
+    if (guards && guards.length > 0) {
+      return UseGuards(...guards, UseInterceptors(...interceptors))(target);
+    }
+    return UseInterceptors(...interceptors)(target);
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/decorators/index.html b/coverage/lcov-report/src/audit/decorators/index.html new file mode 100644 index 0000000..0a5c340 --- /dev/null +++ b/coverage/lcov-report/src/audit/decorators/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/audit/decorators + + + + + + + + + +
+
+

All files src/audit/decorators

+
+ +
+ 0% + Statements + 0/366 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/366 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
audit.decorator.ts +
+
0%0/3660%0/10%0/10%0/366
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/entities/audit-log.entity.ts.html b/coverage/lcov-report/src/audit/entities/audit-log.entity.ts.html new file mode 100644 index 0000000..7fb3ff9 --- /dev/null +++ b/coverage/lcov-report/src/audit/entities/audit-log.entity.ts.html @@ -0,0 +1,1078 @@ + + + + + + Code coverage report for src/audit/entities/audit-log.entity.ts + + + + + + + + + +
+
+

All files / src/audit/entities audit-log.entity.ts

+
+ +
+ 0% + Statements + 0/331 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/331 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index } from 'typeorm';
+
+export enum AuditAction {
+  CREATE = 'create',
+  READ = 'read',
+  UPDATE = 'update',
+  DELETE = 'delete',
+  EXECUTE = 'execute',
+  APPROVE = 'approve',
+  REJECT = 'reject',
+  CANCEL = 'cancel',
+  LOGIN = 'login',
+  LOGOUT = 'logout',
+  ACCESS_DENIED = 'access_denied',
+  SYSTEM_ERROR = 'system_error',
+  DATA_EXPORT = 'data_export',
+  CONFIG_CHANGE = 'config_change',
+  SECURITY_EVENT = 'security_event',
+  COMPLIANCE_CHECK = 'compliance_check',
+}
+
+export enum AuditResource {
+  USER = 'user',
+  TRADE = 'trade',
+  LISTING = 'listing',
+  BID = 'bid',
+  MATCH = 'match',
+  TRANSACTION = 'transaction',
+  PAYMENT = 'payment',
+  SETTLEMENT = 'settlement',
+  CONTRACT = 'contract',
+  SYSTEM = 'system',
+  AUDIT = 'audit',
+  REPORT = 'report',
+  CONFIGURATION = 'configuration',
+}
+
+export enum AuditSeverity {
+  LOW = 'low',
+  MEDIUM = 'medium',
+  HIGH = 'high',
+  CRITICAL = 'critical',
+}
+
+export enum AuditStatus {
+  ACTIVE = 'active',
+  ARCHIVED = 'archived',
+  DELETED = 'deleted',
+}
+
+@Entity('audit_logs')
+export class AuditLog {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'enum', enum: AuditAction })
+  action: AuditAction;
+
+  @Column({ type: 'enum', enum: AuditResource })
+  resource: AuditResource;
+
+  @Column({ type: 'enum', enum: AuditSeverity, default: AuditSeverity.MEDIUM })
+  severity: AuditSeverity;
+
+  @Column({ type: 'enum', enum: AuditStatus, default: AuditStatus.ACTIVE })
+  status: AuditStatus;
+
+  @Column({ name: 'resource_id', nullable: true })
+  resourceId?: string;
+
+  @Column({ name: 'user_id', nullable: true })
+  userId?: string;
+
+  @Column({ name: 'session_id', nullable: true })
+  sessionId?: string;
+
+  @Column({ name: 'ip_address', length: 45, nullable: true })
+  ipAddress?: string;
+
+  @Column({ name: 'user_agent', type: 'text', nullable: true })
+  userAgent?: string;
+
+  @Column({ name: 'request_method', length: 10, nullable: true })
+  requestMethod?: string;
+
+  @Column({ name: 'request_url', type: 'text', nullable: true })
+  requestUrl?: string;
+
+  @Column({ name: 'request_body', type: 'json', nullable: true })
+  requestBody?: any;
+
+  @Column({ name: 'response_body', type: 'json', nullable: true })
+  responseBody?: any;
+
+  @Column({ name: 'response_status', nullable: true })
+  responseStatus?: number;
+
+  @Column({ name: 'execution_time', type: 'decimal', precision: 8, scale: 3, nullable: true })
+  executionTime?: number;
+
+  @Column({ name: 'memory_usage', type: 'decimal', precision: 10, scale: 2, nullable: true })
+  memoryUsage?: number;
+
+  @Column({ type: 'text', nullable: true })
+  description?: string;
+
+  @Column({ type: 'json', nullable: true })
+  metadata: {
+    previousState?: any;
+    newState?: any;
+    changes?: Array<{
+      field: string;
+      oldValue: any;
+      newValue: any;
+    }>;
+    tags?: string[];
+    category?: string;
+    subcategory?: string;
+    compliance?: {
+      regulation?: string;
+      requirement?: string;
+      classification?: string;
+    };
+    risk?: {
+      level: 'low' | 'medium' | 'high' | 'critical';
+      factors?: string[];
+      score?: number;
+    };
+    privacy?: {
+      dataClassification?: 'public' | 'internal' | 'confidential' | 'restricted';
+      redactionLevel?: number;
+      consentRequired?: boolean;
+    };
+  };
+
+  @Column({ name: 'checksum', length: 64, nullable: true })
+  checksum?: string;
+
+  @Column({ name: 'signature', length: 512, nullable: true })
+  signature?: string;
+
+  @Column({ name: 'signed_at', type: 'datetime', nullable: true })
+  signedAt?: Date;
+
+  @Column({ name: 'signed_by', nullable: true })
+  signedBy?: string;
+
+  @Column({ name: 'retention_until', type: 'datetime', nullable: true })
+  retentionUntil?: Date;
+
+  @Column({ name: 'archived_at', type: 'datetime', nullable: true })
+  archivedAt?: Date;
+
+  @Column({ name: 'deleted_at', type: 'datetime', nullable: true })
+  deletedAt?: Date;
+
+  @Column({ name: 'created_by', nullable: true })
+  createdBy?: string;
+
+  @Column({ name: 'updated_by', nullable: true })
+  updatedBy?: string;
+
+  @Column({ type: 'json', nullable: true })
+  chainOfCustody: Array<{
+    timestamp: Date;
+    userId: string;
+    action: string;
+    previousHash?: string;
+    currentHash: string;
+    signature?: string;
+  }>;
+
+  @Column({ type: 'json', nullable: true })
+  verification: {
+    integrityVerified: boolean;
+    lastVerifiedAt?: Date;
+    verificationMethod?: string;
+    verificationResult?: string;
+    tamperDetected?: boolean;
+    tamperDetails?: string;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  compliance: {
+    regulations: Array<{
+      name: string;
+      version: string;
+      requirements: string[];
+      compliant: boolean;
+      lastChecked: Date;
+      evidence?: string;
+    }>;
+    classifications: Array<{
+      type: string;
+      category: string;
+      level: string;
+      description: string;
+    }>;
+    reports: Array<{
+      reportId: string;
+      reportType: string;
+      generatedAt: Date;
+      status: string;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  privacy: {
+    dataSubjectId?: string;
+    consentRecords: Array<{
+      consentType: string;
+      givenAt: Date;
+      expiresAt?: Date;
+      purpose: string;
+      legalBasis: string;
+    }>;
+    dataProcessing: {
+      purpose: string;
+      legalBasis: string;
+      retentionPeriod: string;
+      categories: string[];
+    };
+    redactionRules: Array<{
+      field: string;
+      condition: string;
+      action: string;
+      applied: boolean;
+    }>;
+  };
+
+  @Column({ name: 'correlation_id', length: 64, nullable: true })
+  correlationId?: string;
+
+  @Column({ name: 'parent_id', nullable: true })
+  parentId?: string;
+
+  @Column({ name: 'batch_id', nullable: true })
+  batchId?: string;
+
+  @Column({ type: 'json', nullable: true })
+  performance: {
+    cpuTime?: number;
+    memoryPeak?: number;
+    diskIO?: number;
+    networkIO?: number;
+    cacheHits?: number;
+    cacheMisses?: number;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  security: {
+    authenticationMethod?: string;
+    authorizationResult?: string;
+    permissionsChecked: string[];
+    rolesChecked: string[];
+    violations: Array<{
+      type: string;
+      description: string;
+      severity: string;
+      timestamp: Date;
+    }>;
+    threats: Array<{
+      type: string;
+      level: string;
+      description: string;
+      detected: boolean;
+      confidence: number;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  integration: {
+    sourceSystem?: string;
+    sourceEventId?: string;
+    sourceEventType?: string;
+    processingPipeline?: string[];
+    transformations?: Array<{
+      type: string;
+      timestamp: Date;
+      details: any;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  error: {
+    code?: string;
+    message?: string;
+    stack?: string;
+    type?: string;
+    severity?: string;
+    recoverable?: boolean;
+    retryCount?: number;
+  };
+
+  @Column({ name: 'is_sensitive', default: false })
+  isSensitive: boolean;
+
+  @Column({ name: 'is_encrypted', default: false })
+  isEncrypted: boolean;
+
+  @Column({ name: 'encryption_key_id', nullable: true })
+  encryptionKeyId?: string;
+
+  @Column({ name: 'compression_algorithm', nullable: true })
+  compressionAlgorithm?: string;
+
+  @Column({ name: 'storage_location', nullable: true })
+  storageLocation?: string;
+
+  @Column({ name: 'backup_location', nullable: true })
+  backupLocation?: string;
+
+  @Column({ name: 'restore_point', nullable: true })
+  restorePoint?: string;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+
+  @Index(['userId', 'createdAt'])
+  @Index(['resource', 'resourceId'])
+  @Index(['action', 'createdAt'])
+  @Index(['severity', 'createdAt'])
+  @Index(['status', 'createdAt'])
+  @Index(['createdAt'])
+  @Index(['correlationId'])
+  @Index(['batchId'])
+  @Index(['retentionUntil'])
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/entities/index.html b/coverage/lcov-report/src/audit/entities/index.html new file mode 100644 index 0000000..48efb69 --- /dev/null +++ b/coverage/lcov-report/src/audit/entities/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/audit/entities + + + + + + + + + +
+
+

All files src/audit/entities

+
+ +
+ 0% + Statements + 0/872 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/872 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
audit-log.entity.ts +
+
0%0/3310%0/10%0/10%0/331
transaction-log.entity.ts +
+
0%0/5410%0/10%0/10%0/541
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/entities/transaction-log.entity.ts.html b/coverage/lcov-report/src/audit/entities/transaction-log.entity.ts.html new file mode 100644 index 0000000..184006f --- /dev/null +++ b/coverage/lcov-report/src/audit/entities/transaction-log.entity.ts.html @@ -0,0 +1,1708 @@ + + + + + + Code coverage report for src/audit/entities/transaction-log.entity.ts + + + + + + + + + +
+
+

All files / src/audit/entities transaction-log.entity.ts

+
+ +
+ 0% + Statements + 0/541 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/541 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn, Index } from 'typeorm';
+import { AuditLog } from './audit-log.entity';
+
+export enum TransactionType {
+  TRADE_EXECUTION = 'trade_execution',
+  PAYMENT_PROCESSING = 'payment_processing',
+  SETTLEMENT = 'settlement',
+  ESCROW_RELEASE = 'escrow_release',
+  REFUND = 'refund',
+  CANCELLATION = 'cancellation',
+  MODIFICATION = 'modification',
+  APPROVAL = 'approval',
+  REJECTION = 'rejection',
+  VERIFICATION = 'verification',
+  COMPLIANCE_CHECK = 'compliance_check',
+}
+
+export enum TransactionStatus {
+  INITIATED = 'initiated',
+  PENDING = 'pending',
+  PROCESSING = 'processing',
+  COMPLETED = 'completed',
+  FAILED = 'failed',
+  CANCELLED = 'cancelled',
+  REVERSED = 'reversed',
+  HELD = 'held',
+  EXPIRED = 'expired',
+}
+
+export enum TransactionCategory {
+  ENERGY_TRADE = 'energy_trade',
+  FINANCIAL = 'financial',
+  COMPLIANCE = 'compliance',
+  SECURITY = 'security',
+  SYSTEM = 'system',
+  USER_MANAGEMENT = 'user_management',
+  DATA_MANAGEMENT = 'data_management',
+}
+
+export enum PaymentMethod {
+  BANK_TRANSFER = 'bank_transfer',
+  CREDIT_CARD = 'credit_card',
+  DEBIT_CARD = 'debit_card',
+  DIGITAL_WALLET = 'digital_wallet',
+  CRYPTOCURRENCY = 'cryptocurrency',
+  ESCROW = 'escrow',
+  WIRE_TRANSFER = 'wire_transfer',
+  CHECK = 'check',
+}
+
+export enum ComplianceLevel {
+  STANDARD = 'standard',
+  ENHANCED = 'enhanced',
+  STRICT = 'strict',
+  REGULATED = 'regulated',
+}
+
+@Entity('transaction_logs')
+export class TransactionLog {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'enum', enum: TransactionType })
+  type: TransactionType;
+
+  @Column({ type: 'enum', enum: TransactionStatus, default: TransactionStatus.INITIATED })
+  status: TransactionStatus;
+
+  @Column({ type: 'enum', enum: TransactionCategory })
+  category: TransactionCategory;
+
+  @Column({ name: 'transaction_id', unique: true, length: 64 })
+  transactionId: string;
+
+  @Column({ name: 'parent_transaction_id', nullable: true })
+  parentTransactionId?: string;
+
+  @Column({ name: 'root_transaction_id', nullable: true })
+  rootTransactionId?: string;
+
+  @Column({ name: 'batch_id', nullable: true })
+  batchId?: string;
+
+  @Column({ name: 'correlation_id', nullable: true })
+  correlationId?: string;
+
+  @Column({ name: 'source_account_id', nullable: true })
+  sourceAccountId?: string;
+
+  @Column({ name: 'destination_account_id', nullable: true })
+  destinationAccountId?: string;
+
+  @Column({ name: 'intermediate_accounts', type: 'json', nullable: true })
+  intermediateAccounts?: string[];
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  amount: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  originalAmount?: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  feeAmount?: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  taxAmount?: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  exchangeRate?: number;
+
+  @Column({ length: 3 })
+  currency: string;
+
+  @Column({ length: 3, nullable: true })
+  originalCurrency?: string;
+
+  @Column({ type: 'enum', enum: PaymentMethod, nullable: true })
+  paymentMethod?: PaymentMethod;
+
+  @Column({ name: 'payment_reference', length: 128, nullable: true })
+  paymentReference?: string;
+
+  @Column({ name: 'payment_gateway', length: 64, nullable: true })
+  paymentGateway?: string;
+
+  @Column({ name: 'gateway_transaction_id', length: 128, nullable: true })
+  gatewayTransactionId?: string;
+
+  @Column({ name: 'gateway_response', type: 'json', nullable: true })
+  gatewayResponse?: any;
+
+  @Column({ type: 'json', nullable: true })
+  participants: {
+    buyer?: {
+      id: string;
+      name: string;
+      email?: string;
+      phone?: string;
+      address?: any;
+      verificationStatus?: string;
+    };
+    seller?: {
+      id: string;
+      name: string;
+      email?: string;
+      phone?: string;
+      address?: any;
+      verificationStatus?: string;
+    };
+    intermediary?: {
+      id: string;
+      name: string;
+      role: string;
+      fees?: number;
+    };
+  };
+
+  @Column({ type: 'json', nullable: true })
+  energyDetails: {
+    energyType?: string;
+    quantity?: number;
+    unit?: string;
+    deliveryLocation?: any;
+    deliveryDate?: Date;
+    quality?: {
+      certification?: string[];
+      specifications?: Record<string, any>;
+    };
+    carbonFootprint?: number;
+    renewablePercentage?: number;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  contractDetails: {
+    contractId?: string;
+    contractType?: string;
+    terms?: string[];
+    conditions?: Record<string, any>;
+    expirationDate?: Date;
+    autoRenewal?: boolean;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  compliance: {
+    level: ComplianceLevel;
+    regulations: Array<{
+      name: string;
+      jurisdiction: string;
+      requirements: string[];
+      satisfied: boolean;
+      evidence?: string;
+    }>;
+    amlCheck: {
+      status: 'pending' | 'passed' | 'failed' | 'manual_review';
+      score?: number;
+      flags?: string[];
+      reviewedBy?: string;
+      reviewedAt?: Date;
+    };
+    kycCheck: {
+      status: 'pending' | 'passed' | 'failed' | 'manual_review';
+      verified?: boolean;
+      documents?: Array<{
+        type: string;
+        status: string;
+        uploadedAt: Date;
+        verifiedAt?: Date;
+      }>;
+      reviewedBy?: string;
+      reviewedAt?: Date;
+    };
+    sanctions: {
+      screened: boolean;
+      result: 'clear' | 'flagged' | 'blocked';
+      matches?: Array<{
+        list: string;
+        confidence: number;
+        details: string;
+      }>;
+      reviewedBy?: string;
+      reviewedAt?: Date;
+    };
+  };
+
+  @Column({ type: 'json', nullable: true })
+  risk: {
+    score: number;
+    level: 'low' | 'medium' | 'high' | 'critical';
+    factors: Array<{
+      type: string;
+      weight: number;
+      score: number;
+      description: string;
+    }>;
+    mitigation: Array<{
+      measure: string;
+      implemented: boolean;
+      effectiveness?: number;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  timeline: {
+    initiated: Date;
+    pending?: Date;
+    processing?: Date;
+    completed?: Date;
+    failed?: Date;
+    cancelled?: Date;
+    reversed?: Date;
+    milestones: Array<{
+      name: string;
+      status: string;
+      timestamp: Date;
+      details?: any;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  state: {
+    current: string;
+    previous?: string;
+    transitions: Array<{
+      from: string;
+      to: string;
+      timestamp: Date;
+      reason?: string;
+      userId?: string;
+    }>;
+    data: Record<string, any>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  metadata: {
+    source?: string;
+    channel?: string;
+    campaign?: string;
+    tags?: string[];
+    attributes?: Record<string, any>;
+    customFields?: Record<string, any>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  audit: {
+    created: {
+      by: string;
+      at: Date;
+      ip?: string;
+      userAgent?: string;
+    };
+    modified?: {
+      by: string;
+      at: Date;
+      ip?: string;
+      userAgent?: string;
+    };
+    approvals?: Array<{
+      by: string;
+      at: Date;
+      status: 'pending' | 'approved' | 'rejected';
+      comments?: string;
+    }>;
+    reviews?: Array<{
+      by: string;
+      at: Date;
+      type: string;
+      result: string;
+      comments?: string;
+    }>;
+    notifications?: Array<{
+      type: string;
+      recipient: string;
+      sentAt: Date;
+      status: string;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  security: {
+    encryption: {
+      algorithm?: string;
+      keyId?: string;
+      encryptedAt?: Date;
+    };
+    access: {
+      read: Array<{
+        userId: string;
+        accessedAt: Date;
+        ip?: string;
+        purpose?: string;
+      }>;
+      write: Array<{
+        userId: string;
+        accessedAt: Date;
+        ip?: string;
+        purpose?: string;
+      }>;
+    };
+    integrity: {
+      checksum: string;
+      algorithm: string;
+      verified: boolean;
+      verifiedAt?: Date;
+    };
+    tamperDetection: {
+      detected: boolean;
+      detectedAt?: Date;
+      details?: string;
+      actionTaken?: string;
+    };
+  };
+
+  @Column({ type: 'json', nullable: true })
+  privacy: {
+    dataSubjectId?: string;
+    consent: {
+      given: boolean;
+      at: Date;
+      purpose: string;
+      legalBasis: string;
+      expiresAt?: Date;
+    };
+    dataClassification: 'public' | 'internal' | 'confidential' | 'restricted';
+    retention: {
+      policy: string;
+      expiresAt?: Date;
+      autoDelete: boolean;
+    };
+    redaction: {
+      fields: string[];
+      applied: boolean;
+      method: string;
+    };
+  };
+
+  @Column({ type: 'json', nullable: true })
+  reconciliation: {
+    sourceSystem?: string;
+    sourceTransactionId?: string;
+    matched: boolean;
+    discrepancies?: Array<{
+      field: string;
+      expected: any;
+      actual: any;
+      variance: number;
+    }>;
+    lastReconciled?: Date;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  reporting: {
+    included: boolean;
+    reports: Array<{
+      type: string;
+      period: string;
+      generatedAt: Date;
+      fileId?: string;
+    }>;
+    metrics: {
+      processingTime?: number;
+      cost?: number;
+      revenue?: number;
+      riskScore?: number;
+    };
+  };
+
+  @Column({ name: 'error_code', nullable: true })
+  errorCode?: string;
+
+  @Column({ type: 'text', nullable: true })
+  errorMessage?: string;
+
+  @Column({ type: 'json', nullable: true })
+  errorDetails: {
+    type: string;
+    category: string;
+      severity: string;
+      recoverable: boolean;
+      retryCount?: number;
+      maxRetries?: number;
+      nextRetryAt?: Date;
+    };
+
+  @Column({ name: 'retry_count', default: 0 })
+  retryCount: number;
+
+  @Column({ name: 'max_retries', default: 3 })
+  maxRetries: number;
+
+  @Column({ name: 'next_retry_at', type: 'datetime', nullable: true })
+  nextRetryAt?: Date;
+
+  @Column({ name: 'created_by' })
+  createdBy: string;
+
+  @Column({ name: 'updated_by', nullable: true })
+  updatedBy?: string;
+
+  @Column({ name: 'approved_by', nullable: true })
+  approvedBy?: string;
+
+  @Column({ name: 'approved_at', type: 'datetime', nullable: true })
+  approvedAt?: Date;
+
+  @Column({ name: 'rejected_by', nullable: true })
+  rejectedBy?: string;
+
+  @Column({ name: 'rejected_at', type: 'datetime', nullable: true })
+  rejectedAt?: Date;
+
+  @Column({ name: 'completed_by', nullable: true })
+  completedBy?: string;
+
+  @Column({ name: 'completed_at', type: 'datetime', nullable: true })
+  completedAt?: Date;
+
+  @Column({ name: 'expires_at', type: 'datetime', nullable: true })
+  expiresAt?: Date;
+
+  @Column({ name: 'retention_until', type: 'datetime', nullable: true })
+  retentionUntil?: Date;
+
+  @Column({ name: 'archived_at', type: 'datetime', nullable: true })
+  archivedAt?: Date;
+
+  @Column({ name: 'deleted_at', type: 'datetime', nullable: true })
+  deletedAt?: Date;
+
+  @Column({ name: 'is_reversible', default: false })
+  isReversible: boolean;
+
+  @Column({ name: 'is_reversible_until', type: 'datetime', nullable: true })
+  isReversibleUntil?: Date;
+
+  @Column({ name: 'reversed_by', nullable: true })
+  reversedBy?: string;
+
+  @Column({ name: 'reversed_at', type: 'datetime', nullable: true })
+  reversedAt?: Date;
+
+  @Column({ name: 'reversal_reason', type: 'text', nullable: true })
+  reversalReason?: string;
+
+  @Column({ name: 'external_reference', nullable: true })
+  externalReference?: string;
+
+  @Column({ name: 'internal_reference', nullable: true })
+  internalReference?: string;
+
+  @Column({ name: 'blockchain_tx_hash', length: 64, nullable: true })
+  blockchainTxHash?: string;
+
+  @Column({ name: 'blockchain_block_number', nullable: true })
+  blockchainBlockNumber?: number;
+
+  @Column({ name: 'blockchain_confirmations', default: 0 })
+  blockchainConfirmations?: number;
+
+  @Column({ type: 'json', nullable: true })
+  blockchain: {
+    contractAddress?: string;
+    functionCalled?: string;
+    gasUsed?: number;
+    gasPrice?: number;
+    eventLogs?: Array<{
+      event: string;
+      address: string;
+      topics: string[];
+      data: string;
+      blockNumber: number;
+      transactionHash: string;
+      logIndex: number;
+    }>;
+  };
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+
+  @ManyToOne(() => AuditLog, { nullable: true })
+  @JoinColumn({ name: 'audit_log_id' })
+  auditLog?: AuditLog;
+
+  @Index(['transactionId'])
+  @Index(['status', 'createdAt'])
+  @Index(['type', 'createdAt'])
+  @Index(['category', 'createdAt'])
+  @Index(['sourceAccountId'])
+  @Index(['destinationAccountId'])
+  @Index(['amount', 'currency'])
+  @Index(['createdAt'])
+  @Index(['correlationId'])
+  @Index(['batchId'])
+  @Index(['parentTransactionId'])
+  @Index(['rootTransactionId'])
+  @Index(['retentionUntil'])
+  @Index(['expiresAt'])
+  @Index(['blockchainTxHash'])
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/index.html b/coverage/lcov-report/src/audit/index.html new file mode 100644 index 0000000..e516b41 --- /dev/null +++ b/coverage/lcov-report/src/audit/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/audit + + + + + + + + + +
+
+

All files src/audit

+
+ +
+ 0% + Statements + 0/1536 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/1536 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
audit.module.ts +
+
0%0/130%0/10%0/10%0/13
audit.service.ts +
+
0%0/15230%0/10%0/10%0/1523
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/interceptors/audit.interceptor.ts.html b/coverage/lcov-report/src/audit/interceptors/audit.interceptor.ts.html new file mode 100644 index 0000000..fe772b3 --- /dev/null +++ b/coverage/lcov-report/src/audit/interceptors/audit.interceptor.ts.html @@ -0,0 +1,1939 @@ + + + + + + Code coverage report for src/audit/interceptors/audit.interceptor.ts + + + + + + + + + +
+
+

All files / src/audit/interceptors audit.interceptor.ts

+
+ +
+ 0% + Statements + 0/618 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/618 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Injectable,
+  NestInterceptor,
+  ExecutionContext,
+  CallHandler,
+  Logger,
+} from '@nestjs/common';
+import { Request, Response } from 'express';
+import { Reflector } from '@nestjs/core';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  AuditLog,
+  AuditAction,
+  AuditResource,
+  AuditSeverity,
+} from '../entities/audit-log.entity';
+import { TransactionLog } from '../entities/transaction-log.entity';
+import { AuditService } from '../audit.service';
+
+@Injectable()
+export class AuditInterceptor implements NestInterceptor {
+  private readonly logger = new Logger(AuditInterceptor.name);
+
+  constructor(
+    private readonly auditService: AuditService,
+    @InjectRepository(AuditLog)
+    private readonly auditLogRepository: Repository<AuditLog>,
+    @InjectRepository(TransactionLog)
+    private readonly transactionLogRepository: Repository<TransactionLog>,
+  ) {}
+
+  async intercept(context: ExecutionContext, next: CallHandler): Promise<any> {
+    const startTime = Date.now();
+    const request = context.switchToHttp().getRequest();
+    const response = context.switchToHttp().getResponse();
+
+    let auditLog: AuditLog;
+    let transactionLog: TransactionLog;
+
+    try {
+      // Get audit metadata from the method or class
+      const auditMetadata = this.getAuditMetadata(context);
+
+      if (!auditMetadata) {
+        return next.handle();
+      }
+
+      // Check if we should skip this request
+      if (auditMetadata.skipIf && auditMetadata.skipIf(request)) {
+        return next.handle();
+      }
+
+      // Create audit log entry
+      auditLog = await this.createAuditLog(request, auditMetadata, startTime);
+
+      // Execute the request
+      const result = await next.handle();
+
+      // Update audit log with response data
+      await this.updateAuditLog(auditLog, response, startTime, result);
+
+      // Create transaction log if applicable
+      if (this.isTransactionRequest(request)) {
+        transactionLog = await this.createTransactionLog(
+          request,
+          auditMetadata,
+          startTime,
+          result,
+        );
+        await this.updateTransactionLog(
+          transactionLog,
+          response,
+          startTime,
+          result,
+        );
+      }
+
+      return result;
+    } catch (error) {
+      // Log error in audit log
+      if (auditLog) {
+        await this.logError(auditLog, error, startTime);
+      }
+
+      if (transactionLog) {
+        await this.logTransactionError(transactionLog, error, startTime);
+      }
+
+      throw error;
+    }
+  }
+
+  private getAuditMetadata(context: ExecutionContext): any {
+    const handler = context.getHandler();
+    const classMetadata = Reflect.getMetadata(
+      'audit:global',
+      handler?.constructor,
+    );
+    const methodMetadata = Reflect.getMetadata('audit', handler);
+
+    return { ...classMetadata, ...methodMetadata };
+  }
+
+  private async createAuditLog(
+    request: Request,
+    metadata: any,
+    startTime: number,
+  ): Promise<AuditLog> {
+    const auditLog = this.auditLogRepository.create({
+      action: metadata.action,
+      resource: metadata.resource,
+      severity: metadata.severity,
+      description: metadata.description,
+      userId: this.getUserId(request),
+      sessionId: this.getSessionId(request),
+      ipAddress: this.getClientIp(request),
+      userAgent: this.getUserAgent(request),
+      requestMethod: request.method,
+      requestUrl: request.url,
+      requestBody: metadata.includeRequestBody
+        ? this.sanitizeData(request.body)
+        : undefined,
+      responseBody: undefined, // Will be set in updateAuditLog
+      responseStatus: undefined, // Will be set in updateAuditLog
+      executionTime: undefined, // Will be set in updateAuditLog
+      memoryUsage: undefined, // Will be set in updateAuditLog
+      metadata: {
+        previousState: undefined,
+        newState: undefined,
+        changes: undefined,
+        tags: [],
+        category: metadata.resource,
+        subcategory: metadata.action,
+        privacy: {
+          dataClassification: 'internal',
+          redactionLevel: 0,
+          consentRequired: false,
+        },
+        risk: {
+          level: 'low',
+          factors: [],
+          score: 0,
+        },
+        ...metadata.customFields,
+      },
+      correlationId: this.getCorrelationId(request),
+      batchId: this.getBatchId(request),
+      performance: {
+        cpuTime: undefined, // Will be set in updateAuditLog
+        memoryPeak: undefined, // Will be set in updateAuditLog
+      },
+      security: {
+        authenticationMethod: this.getAuthenticationMethod(request),
+        permissionsChecked: [],
+        rolesChecked: [],
+        violations: [],
+        threats: [],
+      },
+      error: undefined,
+      isSensitive: metadata.sensitive || false,
+      isEncrypted: false,
+      createdAt: new Date(startTime),
+      updatedAt: new Date(startTime),
+    });
+
+    // Add request body to metadata if needed
+    if (metadata.includeRequestBody && request.body) {
+      auditLog.metadata.requestBody = this.sanitizeData(request.body);
+    }
+
+    // Add custom fields from metadata
+    if (metadata.customFields) {
+      Object.assign(auditLog.metadata, metadata.customFields);
+    }
+
+    // Add sensitive data handling
+    if (metadata.sensitive) {
+      auditLog.isSensitive = true;
+      auditLog.privacy = {
+        dataClassification: 'confidential',
+        redactionRules:
+          metadata.redactFields?.map((field) => ({
+            field,
+            condition: 'always',
+            action: 'redact',
+            applied: false,
+          })) || [],
+      };
+    }
+
+    // Calculate initial checksum
+    auditLog.checksum = this.calculateChecksum(auditLog);
+
+    return await this.auditLogRepository.save(auditLog);
+  }
+
+  private async updateAuditLog(
+    auditLog: AuditLog,
+    response: Response,
+    startTime: number,
+    result: any,
+  ): Promise<void> {
+    const endTime = Date.now();
+    const executionTime = endTime - startTime;
+    const memoryUsage = process.memoryUsage();
+
+    auditLog.responseStatus = response.statusCode;
+    auditLog.executionTime = executionTime;
+    auditLog.memoryUsage = memoryUsage.heapUsed / 1024 / 1024; // Convert to MB
+
+    // Add response body to metadata if needed
+    if (auditLog.metadata?.includeResponseBody && result) {
+      auditLog.metadata.responseBody = this.sanitizeData(result);
+    }
+
+    // Add performance metrics
+    auditLog.performance = {
+      cpuTime: undefined, // Would need to be calculated separately
+      memoryPeak: memoryUsage.heapPeak / 1024 / 1024,
+      diskIO: undefined,
+      networkIO: undefined,
+      cacheHits: undefined,
+      cacheMisses: undefined,
+    };
+
+    // Update security information
+    if (auditLog.security) {
+      auditLog.security.permissionsChecked =
+        this.getPermissionsChecked(request);
+      auditLog.security.rolesChecked = this.getRolesChecked(request);
+    }
+
+    // Update metadata with performance metrics
+    if (auditLog.metadata) {
+      auditLog.metadata.performance = {
+        executionTime,
+        memoryUsage: memoryUsage.heapUsed / 1024 / 1024,
+        cpuTime: undefined,
+        diskIO: undefined,
+        networkIO: undefined,
+        cacheHits: undefined,
+        cacheMisses: undefined,
+      };
+    }
+
+    // Recalculate checksum
+    auditLog.checksum = this.calculateChecksum(auditLog);
+
+    await this.auditLogRepository.save(auditLog);
+  }
+
+  private async createTransactionLog(
+    request: Request,
+    metadata: any,
+    startTime: number,
+    result: any,
+  ): Promise<TransactionLog> {
+    const transactionId = this.generateTransactionId();
+    const correlationId = this.getCorrelationId(request);
+
+    const transactionLog = this.transactionLogRepository.create({
+      type: this.getTransactionType(request),
+      status: 'initiated',
+      category: this.getTransactionCategory(request),
+      transactionId,
+      correlationId,
+      batchId: this.getBatchId(request),
+      amount: this.extractAmount(request),
+      currency: this.extractCurrency(request),
+      participants: this.extractParticipants(request),
+      energyDetails: this.extractEnergyDetails(request),
+      contractDetails: this.extractContractDetails(request),
+      compliance: {
+        level: 'standard',
+        regulations: [],
+        amlCheck: { status: 'pending' },
+        kycCheck: { status: 'pending' },
+        sanctions: { screened: false },
+      },
+      risk: {
+        score: 0,
+        level: 'low',
+        factors: [],
+        mitigation: [],
+      },
+      timeline: {
+        initiated: new Date(startTime),
+      },
+      state: {
+        current: 'initiated',
+        transitions: [],
+        data: {},
+      },
+      metadata: {
+        source: 'api',
+        channel: request.get('channel') || 'web',
+        tags: [],
+        attributes: {},
+        customFields: metadata.customFields || {},
+      },
+      audit: {
+        created: {
+          by: this.getUserId(request),
+          at: new Date(startTime),
+          ip: this.getClientIp(request),
+          userAgent: this.getUserAgent(request),
+        },
+      },
+      privacy: {
+        dataClassification: 'internal',
+        retention: {
+          policy: 'standard',
+          autoDelete: false,
+        },
+      },
+      createdAt: new Date(startTime),
+      updatedAt: new Date(startTime),
+    });
+
+    return await this.transactionLogRepository.save(transactionLog);
+  }
+
+  private async updateTransactionLog(
+    transactionLog: TransactionLog,
+    response: Response,
+    startTime: number,
+    result: any,
+  ): Promise<void> {
+    const endTime = Date.now();
+
+    // Update status based on response
+    if (response.statusCode >= 200 && response.statusCode < 300) {
+      transactionLog.status = 'completed';
+      transactionLog.completedAt = new Date(endTime);
+      transactionLog.completedBy = this.getUserId(response.req);
+    } else if (response.statusCode >= 400 && response.statusCode < 500) {
+      transactionLog.status = 'failed';
+      transactionLog.completedAt = new Date(endTime);
+      transactionLog.completedBy = this.getUserId(response.req);
+    }
+
+    // Update timeline
+    transactionLog.timeline.completed = new Date(endTime);
+
+    // Update state
+    transactionLog.state.current = transactionLog.status;
+    transactionLog.state.transitions.push({
+      from: 'initiated',
+      to: transactionLog.status,
+      timestamp: new Date(endTime),
+      reason: `HTTP ${response.statusCode}`,
+    });
+
+    // Update metadata with result
+    if (transactionLog.metadata) {
+      transactionLog.metadata.attributes = {
+        ...transactionLog.metadata.attributes,
+        result: result ? 'success' : 'error',
+        responseStatus: response.statusCode,
+      };
+    }
+
+    // Update audit information
+    if (transactionLog.audit) {
+      transactionLog.audit.modified = {
+        by: this.getUserId(response.req),
+        at: new Date(endTime),
+        ip: this.getClientIp(response.req),
+        userAgent: this.getUserAgent(response.req),
+      };
+    }
+
+    await this.transactionLogRepository.save(transactionLog);
+  }
+
+  private async logError(
+    auditLog: AuditLog,
+    error: any,
+    startTime: number,
+  ): Promise<void> {
+    const endTime = Date.now();
+    const executionTime = endTime - startTime;
+
+    auditLog.status = 'failed';
+    auditLog.error = {
+      code: error.code || 'UNKNOWN_ERROR',
+      message: error.message,
+      stack: error.stack,
+      type: error.constructor.name,
+      severity: 'error',
+      recoverable: this.isRecoverableError(error),
+      retryCount: 0,
+      maxRetries: 3,
+    };
+
+    auditLog.executionTime = executionTime;
+    auditLog.updatedAt = new Date(endTime);
+
+    await this.auditLogRepository.save(auditLog);
+  }
+
+  private async logTransactionError(
+    transactionLog: TransactionLog,
+    error: any,
+    startTime: number,
+  ): Promise<void> {
+    const endTime = Date.now();
+    const executionTime = endTime - startTime;
+
+    transactionLog.status = 'failed';
+    transactionLog.errorCode = error.code || 'UNKNOWN_ERROR';
+    transactionLog.errorMessage = error.message;
+    transactionLog.retryCount = (transactionLog.retryCount || 0) + 1;
+
+    transactionLog.timeline.failed = new Date(endTime);
+    transactionLog.state.current = 'failed';
+    transactionLog.state.transitions.push({
+      from: transactionLog.state.current,
+      to: 'failed',
+      timestamp: new Date(endTime),
+      reason: error.message,
+    });
+
+    await this.transactionLogRepository.save(transactionLog);
+  }
+
+  private isTransactionRequest(request: Request): boolean {
+    const transactionPaths = [
+      '/api/energy/trades',
+      '/api/energy/payments',
+      '/api/energy/settlements',
+      '/api/energy/transactions',
+    ];
+
+    return transactionPaths.some((path) => request.url.startsWith(path));
+  }
+
+  private getTransactionType(request: Request): string {
+    if (request.url.includes('/trades')) return 'trade_execution';
+    if (request.url.includes('/payments')) return 'payment_processing';
+    if (request.url.includes('/settlements')) return 'settlement';
+    if (request.url.includes('/transactions')) return 'transaction';
+    return 'unknown';
+  }
+
+  private getTransactionCategory(request: Request): string {
+    if (request.url.includes('/energy/')) return 'energy_trade';
+    return 'general';
+  }
+
+  private extractAmount(request: Request): number {
+    const body = request.body;
+    return body?.amount || body?.quantity || 0;
+  }
+
+  private extractCurrency(request: Request): string {
+    const body = request.body;
+    return body?.currency || 'USD';
+  }
+
+  private extractParticipants(request: Request): any {
+    const body = request.body;
+    return {
+      buyer: body?.buyerId ? { id: body.buyerId } : undefined,
+      seller: body?.sellerId ? { id: body.sellerId } : undefined,
+    };
+  }
+
+  private extractEnergyDetails(request: Request): any {
+    const body = request.body;
+    return {
+      energyType: body?.energyType,
+      quantity: body?.quantity,
+      unit: body?.unit,
+      deliveryLocation: body?.deliveryLocation,
+      deliveryDate: body?.deliveryDate
+        ? new Date(body.deliveryDate)
+        : undefined,
+      quality: body?.quality,
+    };
+  }
+
+  private extractContractDetails(request: Request): any {
+    const body = request.body;
+    return {
+      contractId: body?.contractId,
+      contractType: body?.contractType,
+      terms: body?.terms,
+      expirationDate: body?.expirationDate
+        ? new Date(body.expirationDate)
+        : undefined,
+    };
+  }
+
+  private getUserId(request: Request): string | undefined {
+    return (request as any).user?.id || request.headers['x-user-id'];
+  }
+
+  private getSessionId(request: Request): string | undefined {
+    return request.headers['x-session-id'] || request.headers['authorization'];
+  }
+
+  private getClientIp(request: Request): string {
+    return (
+      request.ip ||
+      request.headers['x-forwarded-for'] ||
+      request.connection.remoteAddress
+    );
+  }
+
+  private getUserAgent(request: Request): string {
+    return request.headers['user-agent'];
+  }
+
+  private getAuthenticationMethod(request: Request): string {
+    const authHeader = request.headers['authorization'];
+    if (authHeader?.startsWith('Bearer ')) {
+      return 'jwt';
+    }
+    if (authHeader?.startsWith('Basic ')) {
+      return 'basic';
+    }
+    return 'none';
+  }
+
+  private getPermissionsChecked(request: Request): string[] {
+    return (request as any).permissions || [];
+  }
+
+  private getRolesChecked(request: Request): string[] {
+    return (request as any).roles || [];
+  }
+
+  private getCorrelationId(request: Request): string | undefined {
+    return (
+      request.headers['x-correlation-id'] || request.headers['x-request-id']
+    );
+  }
+
+  private getBatchId(request: Request): string | undefined {
+    return request.headers['x-batch-id'];
+  }
+
+  private generateTransactionId(): string {
+    return `txn_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+  }
+
+  private sanitizeData(data: any): any {
+    if (!data) return data;
+
+    if (typeof data === 'string') {
+      return data;
+    }
+
+    if (typeof data === 'object' && data !== null) {
+      const sanitized: any = {};
+
+      for (const [key, value] of Object.entries(data)) {
+        if (this.isSensitiveField(key)) {
+          sanitized[key] = '***REDACTED***';
+        } else if (typeof value === 'object' && value !== null) {
+          sanitized[key] = this.sanitizeData(value);
+        } else {
+          sanitized[key] = value;
+        }
+      }
+
+      return sanitized;
+    }
+
+    return data;
+  }
+
+  private isSensitiveField(fieldName: string): boolean {
+    const sensitiveFields = [
+      'password',
+      'token',
+      'secret',
+      'key',
+      'apiKey',
+      'creditCard',
+      'ssn',
+      'bankAccount',
+      'routingNumber',
+      'cvv',
+      'pin',
+    ];
+
+    return sensitiveFields.some((field) =>
+      fieldName.toLowerCase().includes(field.toLowerCase()),
+    );
+  }
+
+  private calculateChecksum(data: any): string {
+    const crypto = require('crypto');
+    const dataString = JSON.stringify(data);
+    return crypto.createHash('sha256').update(dataString).digest('hex');
+  }
+
+  private isRecoverableError(error: any): boolean {
+    const recoverableErrors = [
+      'ECONNRESET',
+      'ETIMEDOUT',
+      'ECONNREFUSED',
+      'EHOSTUNREACH',
+      'EPIPE',
+      'ENOTFOUND',
+      'ECONNABORTED',
+      'EBUSY',
+      'ENOTFOUND',
+      'EAI_AGAIN',
+      'EAI_AGAIN',
+    ];
+
+    return recoverableErrors.some((err) => error.code === err);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/interceptors/index.html b/coverage/lcov-report/src/audit/interceptors/index.html new file mode 100644 index 0000000..cb2a794 --- /dev/null +++ b/coverage/lcov-report/src/audit/interceptors/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/audit/interceptors + + + + + + + + + +
+
+

All files src/audit/interceptors

+
+ +
+ 0% + Statements + 0/618 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/618 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
audit.interceptor.ts +
+
0%0/6180%0/10%0/10%0/618
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/reports/compliance.report.ts.html b/coverage/lcov-report/src/audit/reports/compliance.report.ts.html new file mode 100644 index 0000000..3cefe38 --- /dev/null +++ b/coverage/lcov-report/src/audit/reports/compliance.report.ts.html @@ -0,0 +1,3622 @@ + + + + + + Code coverage report for src/audit/reports/compliance.report.ts + + + + + + + + + +
+
+

All files / src/audit/reports compliance.report.ts

+
+ +
+ 0% + Statements + 0/1179 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1179 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, Between, LessThan, MoreThan } from 'typeorm';
+import {
+  AuditLog,
+  AuditAction,
+  AuditResource,
+  AuditSeverity,
+} from '../entities/audit-log.entity';
+import {
+  TransactionLog,
+  TransactionStatus,
+  TransactionType,
+} from '../entities/transaction-log.entity';
+
+export interface ComplianceReportData {
+  reportId: string;
+  reportType: 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'annual';
+  period: {
+    startDate: Date;
+    endDate: Date;
+  };
+  generatedAt: Date;
+  status: 'active' | 'archived' | 'deleted';
+  summary: {
+    totalAuditLogs: number;
+    totalTransactions: number;
+    totalVolume: number;
+    errorRate: number;
+    complianceScore: number;
+    riskScore: number;
+    retentionCompliance: number;
+  };
+  auditMetrics: {
+    logsByAction: Record<AuditAction, number>;
+    logsByResource: Record<AuditResource, number>;
+    logsBySeverity: Record<AuditSeverity, number>;
+    avgExecutionTime: number;
+    sensitiveDataLogs: number;
+    encryptedLogs: number;
+  };
+  transactionMetrics: {
+    transactionsByType: Record<TransactionType, number>;
+    transactionsByStatus: Record<TransactionStatus, number>;
+    avgAmount: number;
+    totalFees: number;
+    totalTaxes: number;
+  };
+  compliance: {
+    regulations: Array<{
+      name: string;
+      jurisdiction: string;
+      requirements: string[];
+      compliant: boolean;
+      violations: Array<{
+        requirement: string;
+        severity: string;
+        description: string;
+        count: number;
+      }>;
+    }>;
+    overallScore: number;
+    recommendations: string[];
+  };
+  privacy: {
+    dataClassification: Record<string, number>;
+    redactionApplied: number;
+    consentRecords: number;
+    retentionPolicies: Record<string, number>;
+  };
+  security: {
+    authenticationEvents: number;
+    accessDeniedEvents: number;
+    securityViolations: number;
+    threatDetections: number;
+  };
+  performance: {
+    avgResponseTime: number;
+    throughput: number;
+    systemUptime: number;
+    errorRate: number;
+  };
+  risk: {
+    highRiskTransactions: number;
+    suspiciousActivities: number;
+    complianceViolations: number;
+    riskScore: number;
+  };
+}
+
+export interface ComplianceRegulation {
+  id: string;
+  name: string;
+  jurisdiction: string;
+  category: string;
+  requirements: Array<{
+    id: string;
+    name: string;
+    description: string;
+    mandatory: boolean;
+    validation: string;
+  }>;
+  lastUpdated: Date;
+  isActive: boolean;
+}
+
+export interface ComplianceCheck {
+  regulationId: string;
+  requirementId: string;
+  status: 'compliant' | 'non_compliant' | 'pending';
+  score: number;
+  details: string;
+  evidence?: string;
+  checkedAt: Date;
+  checkedBy: string;
+}
+
+export interface ComplianceViolation {
+  id: string;
+  regulationId: string;
+  requirementId: string;
+  severity: 'low' | 'medium' | 'high' | 'critical';
+  description: string;
+  affectedRecords: number;
+  detectedAt: Date;
+  resolvedAt?: Date;
+  resolution?: string;
+}
+
+@Injectable()
+export class ComplianceReport {
+  private readonly logger = new Logger(ComplianceReport.name);
+
+  constructor(
+    @InjectRepository(AuditLog)
+    private readonly auditLogRepository: Repository<AuditLog>,
+    @InjectRepository(TransactionLog)
+    private readonly transactionLogRepository: Repository<TransactionLog>,
+  ) {}
+
+  async generateReport(
+    reportType: 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'annual',
+    startDate: Date,
+    endDate: Date,
+  ): Promise<ComplianceReportData> {
+    this.logger.log(
+      `Generating ${reportType} compliance report for period ${startDate.toISOString()} to ${endDate.toISOString()}`,
+    );
+
+    const reportId = this.generateReportId(reportType, startDate);
+
+    const [
+      summary,
+      auditMetrics,
+      transactionMetrics,
+      compliance,
+      privacy,
+      security,
+      performance,
+      risk,
+    ] = await Promise.all([
+      this.generateSummary(startDate, endDate),
+      this.generateAuditMetrics(startDate, endDate),
+      this.generateTransactionMetrics(startDate, endDate),
+      this.generateComplianceMetrics(startDate, endDate),
+      this.generatePrivacyMetrics(startDate, endDate),
+      this.generateSecurityMetrics(startDate, endDate),
+      this.generatePerformanceMetrics(startDate, endDate),
+      this.generateRiskMetrics(startDate, endDate),
+    ]);
+
+    const report: ComplianceReportData = {
+      reportId,
+      reportType,
+      period: { startDate, endDate },
+      generatedAt: new Date(),
+      status: 'active',
+      summary,
+      auditMetrics,
+      transactionMetrics,
+      compliance,
+      privacy,
+      security,
+      performance,
+      risk,
+    };
+
+    this.logger.log(`Compliance report generated: ${reportId}`);
+    return report;
+  }
+
+  async generateDailyReport(
+    date: Date = new Date(),
+  ): Promise<ComplianceReportData> {
+    const startDate = new Date(
+      date.getFullYear(),
+      date.getMonth(),
+      date.getDate(),
+    );
+    const endDate = new Date(
+      date.getFullYear(),
+      date.getMonth(),
+      date.getDate(),
+      23,
+      59,
+      59,
+      999,
+    );
+
+    return this.generateReport('daily', startDate, endDate);
+  }
+
+  async generateWeeklyReport(
+    date: Date = new Date(),
+  ): Promise<ComplianceReportData> {
+    const startDate = new Date(
+      date.getFullYear(),
+      date.getMonth(),
+      date.getDate() - date.getDay(),
+    );
+    const endDate = new Date(
+      startDate.getFullYear(),
+      startDate.getMonth(),
+      startDate.getDate() + 6,
+      23,
+      59,
+      59,
+      999,
+    );
+
+    return this.generateReport('weekly', startDate, endDate);
+  }
+
+  async generateMonthlyReport(
+    date: Date = new Date(),
+  ): Promise<ComplianceReportData> {
+    const startDate = new Date(date.getFullYear(), date.getMonth(), 1);
+    const endDate = new Date(
+      date.getFullYear(),
+      date.getMonth() + 1,
+      0,
+      23,
+      59,
+      59,
+      999,
+    );
+
+    return this.generateReport('monthly', startDate, endDate);
+  }
+
+  async generateQuarterlyReport(
+    date: Date = new Date(),
+  ): Promise<ComplianceReportData> {
+    const quarter = Math.floor(date.getMonth() / 3);
+    const startDate = new Date(date.getFullYear(), quarter * 3, 1);
+    const endDate = new Date(
+      date.getFullYear(),
+      (quarter + 1) * 3,
+      0,
+      23,
+      59,
+      59,
+      999,
+    );
+
+    return this.generateReport('quarterly', startDate, endDate);
+  }
+
+  async generateAnnualReport(
+    date: Date = new Date(),
+  ): Promise<ComplianceReportData> {
+    const startDate = new Date(date.getFullYear(), 0, 1);
+    const endDate = new Date(date.getFullYear(), 11, 31, 23, 59, 59, 999);
+
+    return this.generateReport('annual', startDate, endDate);
+  }
+
+  async checkCompliance(
+    regulationId: string,
+    startDate: Date,
+    endDate: Date,
+  ): Promise<{
+    regulation: ComplianceRegulation;
+    checks: ComplianceCheck[];
+    violations: ComplianceViolation[];
+    overallScore: number;
+  }> {
+    const regulation = await this.getRegulation(regulationId);
+    const checks: ComplianceCheck[] = [];
+    const violations: ComplianceViolation[] = [];
+
+    for (const requirement of regulation.requirements) {
+      const check = await this.validateRequirement(
+        requirement,
+        startDate,
+        endDate,
+      );
+      checks.push(check);
+
+      if (check.status === 'non_compliant') {
+        violations.push({
+          id: this.generateViolationId(),
+          regulationId,
+          requirementId: requirement.id,
+          severity: this.getViolationSeverity(requirement),
+          description: check.details,
+          affectedRecords: await this.countAffectedRecords(
+            requirement,
+            startDate,
+            endDate,
+          ),
+          detectedAt: new Date(),
+        });
+      }
+    }
+
+    const overallScore =
+      checks.reduce((sum, check) => sum + check.score, 0) / checks.length;
+
+    return {
+      regulation,
+      checks,
+      violations,
+      overallScore,
+    };
+  }
+
+  async generateComplianceDashboard(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<{
+    overview: {
+      totalRegulations: number;
+      compliantRegulations: number;
+      overallScore: number;
+      violationsCount: number;
+      lastUpdated: Date;
+    };
+    regulations: Array<{
+      id: string;
+      name: string;
+      jurisdiction: string;
+      score: number;
+      violations: number;
+      status: 'compliant' | 'non_compliant' | 'pending';
+    }>;
+    trends: {
+      scores: Array<{
+        date: Date;
+        score: number;
+      }>;
+      violations: Array<{
+        date: Date;
+        count: number;
+      }>;
+    };
+    alerts: Array<{
+      type: string;
+      severity: string;
+      message: string;
+      timestamp: Date;
+    }>;
+  }> {
+    const regulations = await this.getActiveRegulations();
+    const regulationResults = [];
+
+    for (const regulation of regulations) {
+      const result = await this.checkCompliance(
+        regulation.id,
+        startDate,
+        endDate,
+      );
+      regulationResults.push({
+        id: regulation.id,
+        name: regulation.name,
+        jurisdiction: regulation.jurisdiction,
+        score: result.overallScore,
+        violations: result.violations.length,
+        status:
+          result.overallScore >= 80
+            ? 'compliant'
+            : result.overallScore >= 60
+              ? 'pending'
+              : 'non_compliant',
+      });
+    }
+
+    const totalRegulations = regulations.length;
+    const compliantRegulations = regulationResults.filter(
+      (r) => r.status === 'compliant',
+    ).length;
+    const overallScore =
+      regulationResults.reduce((sum, r) => sum + r.score, 0) /
+      regulationResults.length;
+    const violationsCount = regulationResults.reduce(
+      (sum, r) => sum + r.violations,
+      0,
+    );
+
+    return {
+      overview: {
+        totalRegulations,
+        compliantRegulations,
+        overallScore,
+        violationsCount,
+        lastUpdated: new Date(),
+      },
+      regulations: regulationResults,
+      trends: await this.generateComplianceTrends(startDate, endDate),
+      alerts: await this.generateComplianceAlerts(startDate, endDate),
+    };
+  }
+
+  async exportReport(
+    reportId: string,
+    format: 'json' | 'pdf' | 'excel' = 'json',
+  ): Promise<string> {
+    const report = await this.getReport(reportId);
+
+    if (format === 'json') {
+      return JSON.stringify(report, null, 2);
+    }
+
+    if (format === 'pdf') {
+      return this.generatePDFReport(report);
+    }
+
+    if (format === 'excel') {
+      return this.generateExcelReport(report);
+    }
+
+    throw new Error(`Unsupported export format: ${format}`);
+  }
+
+  async archiveReport(reportId: string): Promise<void> {
+    const report = await this.getReport(reportId);
+    report.status = 'archived';
+    // Save to database - would need a Report entity
+    this.logger.log(`Archived compliance report: ${reportId}`);
+  }
+
+  async deleteReport(reportId: string): Promise<void> {
+    // Delete from database
+    this.logger.log(`Deleted compliance report: ${reportId}`);
+  }
+
+  private async generateSummary(startDate: Date, endDate: Date): Promise<any> {
+    const [totalAuditLogs, totalTransactions, totalVolume, errorRate] =
+      await Promise.all([
+        this.auditLogRepository.count({
+          where: { createdAt: Between(startDate, endDate) },
+        }),
+        this.transactionLogRepository.count({
+          where: { createdAt: Between(startDate, endDate) },
+        }),
+        this.transactionLogRepository
+          .createQueryBuilder('transaction')
+          .where('transaction.createdAt >= :startDate', { startDate })
+          .andWhere('transaction.createdAt <= :endDate', { endDate })
+          .select(['SUM(transaction.amount)'])
+          .getRawOne(),
+        this.calculateErrorRate(startDate, endDate),
+      ]);
+
+    const [complianceScore, riskScore, retentionCompliance] = await Promise.all(
+      [
+        this.calculateComplianceScore(startDate, endDate),
+        this.calculateRiskScore(startDate, endDate),
+        this.calculateRetentionCompliance(startDate, endDate),
+      ],
+    );
+
+    return {
+      totalAuditLogs,
+      totalTransactions,
+      totalVolume: totalVolume?.sum || 0,
+      errorRate,
+      complianceScore,
+      riskScore,
+      retentionCompliance,
+    };
+  }
+
+  private async generateAuditMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<any> {
+    const [logsByAction, logsByResource, logsBySeverity, avgExecutionTime] =
+      await Promise.all([
+        this.getLogsByAction(startDate, endDate),
+        this.getLogsByResource(startDate, endDate),
+        this.getLogsBySeverity(startDate, endDate),
+        this.calculateAverageExecutionTime(startDate, endDate),
+      ]);
+
+    const [sensitiveDataLogs, encryptedLogs] = await Promise.all([
+      this.countSensitiveDataLogs(startDate, endDate),
+      this.countEncryptedLogs(startDate, endDate),
+    ]);
+
+    return {
+      logsByAction,
+      logsByResource,
+      logsBySeverity,
+      avgExecutionTime,
+      sensitiveDataLogs,
+      encryptedLogs,
+    };
+  }
+
+  private async generateTransactionMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<any> {
+    const [transactionsByType, transactionsByStatus, avgAmount] =
+      await Promise.all([
+        this.getTransactionsByType(startDate, endDate),
+        this.getTransactionsByStatus(startDate, endDate),
+        this.calculateAverageAmount(startDate, endDate),
+      ]);
+
+    const [totalFees, totalTaxes] = await Promise.all([
+      this.calculateTotalFees(startDate, endDate),
+      this.calculateTotalTaxes(startDate, endDate),
+    ]);
+
+    return {
+      transactionsByType,
+      transactionsByStatus,
+      avgAmount,
+      totalFees,
+      totalTaxes,
+    };
+  }
+
+  private async generateComplianceMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<any> {
+    const regulations = await this.getActiveRegulations();
+    const regulationResults = [];
+
+    for (const regulation of regulations) {
+      const result = await this.checkCompliance(
+        regulation.id,
+        startDate,
+        endDate,
+      );
+      regulationResults.push(result);
+    }
+
+    const violations = regulationResults.flatMap((r) => r.violations);
+    const recommendations = this.generateRecommendations(violations);
+
+    return {
+      regulations: regulationResults.map((r) => ({
+        name: r.regulation.name,
+        jurisdiction: r.regulation.jurisdiction,
+        requirements: r.regulation.requirements,
+        compliant: r.overallScore >= 80,
+        violations: r.violations.map((v) => ({
+          requirement: v.requirementId,
+          severity: v.severity,
+          description: v.description,
+          count: v.affectedRecords,
+        })),
+      })),
+      overallScore:
+        regulationResults.reduce((sum, r) => sum + r.overallScore, 0) /
+        regulationResults.length,
+      recommendations,
+    };
+  }
+
+  private async generatePrivacyMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<any> {
+    const [
+      dataClassification,
+      redactionApplied,
+      consentRecords,
+      retentionPolicies,
+    ] = await Promise.all([
+      this.getDataClassificationMetrics(startDate, endDate),
+      this.countRedactionApplied(startDate, endDate),
+      this.countConsentRecords(startDate, endDate),
+      this.getRetentionPolicyMetrics(startDate, endDate),
+    ]);
+
+    return {
+      dataClassification,
+      redactionApplied,
+      consentRecords,
+      retentionPolicies,
+    };
+  }
+
+  private async generateSecurityMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<any> {
+    const [
+      authenticationEvents,
+      accessDeniedEvents,
+      securityViolations,
+      threatDetections,
+    ] = await Promise.all([
+      this.countAuthenticationEvents(startDate, endDate),
+      this.countAccessDeniedEvents(startDate, endDate),
+      this.countSecurityViolations(startDate, endDate),
+      this.countThreatDetections(startDate, endDate),
+    ]);
+
+    return {
+      authenticationEvents,
+      accessDeniedEvents,
+      securityViolations,
+      threatDetections,
+    };
+  }
+
+  private async generatePerformanceMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<any> {
+    const [avgResponseTime, throughput, systemUptime, errorRate] =
+      await Promise.all([
+        this.calculateAverageResponseTime(startDate, endDate),
+        this.calculateThroughput(startDate, endDate),
+        this.calculateSystemUptime(startDate, endDate),
+        this.calculateErrorRate(startDate, endDate),
+      ]);
+
+    return {
+      avgResponseTime,
+      throughput,
+      systemUptime,
+      errorRate,
+    };
+  }
+
+  private async generateRiskMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<any> {
+    const [
+      highRiskTransactions,
+      suspiciousActivities,
+      complianceViolations,
+      riskScore,
+    ] = await Promise.all([
+      this.countHighRiskTransactions(startDate, endDate),
+      this.countSuspiciousActivities(startDate, endDate),
+      this.countComplianceViolations(startDate, endDate),
+      this.calculateRiskScore(startDate, endDate),
+    ]);
+
+    return {
+      highRiskTransactions,
+      suspiciousActivities,
+      complianceViolations,
+      riskScore,
+    };
+  }
+
+  private generateReportId(reportType: string, startDate: Date): string {
+    const dateStr = startDate.toISOString().substring(0, 10);
+    return `compliance_${reportType}_${dateStr}_${Date.now()}`;
+  }
+
+  private async getRegulation(
+    regulationId: string,
+  ): Promise<ComplianceRegulation> {
+    // This would fetch from a database or configuration
+    const regulations: Record<string, ComplianceRegulation> = {
+      sox: {
+        id: 'sox',
+        name: 'Sarbanes-Oxley Act',
+        jurisdiction: 'US',
+        category: 'financial',
+        requirements: [
+          {
+            id: 'sox_404',
+            name: 'Section 404 - Internal Controls',
+            description:
+              'Establish and maintain internal controls over financial reporting',
+            mandatory: true,
+            validation:
+              'audit_trail_exists && audit_trail_immutable && audit_trail_complete',
+          },
+          {
+            id: 'sox_302',
+            name: 'Section 302 - Corporate Responsibility',
+            description:
+              'Ensure financial statements are accurate and complete',
+            mandatory: true,
+            validation:
+              'transaction_integrity_verified && no_material_weaknesses',
+          },
+        ],
+        lastUpdated: new Date(),
+        isActive: true,
+      },
+      gdpr: {
+        id: 'gdpr',
+        name: 'General Data Protection Regulation',
+        jurisdiction: 'EU',
+        category: 'privacy',
+        requirements: [
+          {
+            id: 'gdpr_32',
+            name: 'Security of Processing',
+            description:
+              'Implement appropriate technical and organizational measures',
+            mandatory: true,
+            validation:
+              'data_encryption_enabled && access_controls_implemented && security_incidents_logged',
+          },
+          {
+            id: 'gdpr_25',
+            name: 'Data Protection by Design and Default',
+            description: 'Implement data protection principles from the start',
+            mandatory: true,
+            validation:
+              'privacy_by_design && data_minimization && consent_management',
+          },
+        ],
+        lastUpdated: new Date(),
+        isActive: true,
+      },
+    };
+
+    return regulations[regulationId] || regulations['sox'];
+  }
+
+  private async validateRequirement(
+    requirement: any,
+    startDate: Date,
+    endDate: Date,
+  ): Promise<ComplianceCheck> {
+    const validation = requirement.validation;
+    let status: 'compliant' | 'non_compliant' | 'pending' = 'pending';
+    let score = 0;
+    let details = '';
+
+    // This would implement actual validation logic based on the validation string
+    // For now, return a placeholder
+    if (validation.includes('audit_trail_exists')) {
+      const auditLogsCount = await this.auditLogRepository.count({
+        where: { createdAt: Between(startDate, endDate) },
+      });
+
+      if (auditLogsCount > 0) {
+        score += 50;
+        details += 'Audit trail exists. ';
+      } else {
+        details += 'No audit trail found. ';
+      }
+    }
+
+    if (validation.includes('audit_trail_immutable')) {
+      // Check if audit logs have checksums and signatures
+      const immutableLogs = await this.auditLogRepository.count({
+        where: {
+          createdAt: Between(startDate, endDate),
+          checksum: MoreThan(''),
+        },
+      });
+
+      if (immutableLogs > 0) {
+        score += 50;
+        details += 'Audit trail is immutable. ';
+      } else {
+        details += 'Audit trail is not immutable. ';
+      }
+    }
+
+    status =
+      score >= 80 ? 'compliant' : score >= 60 ? 'pending' : 'non_compliant';
+
+    return {
+      regulationId: 'sox',
+      requirementId: requirement.id,
+      status,
+      score,
+      details: details.trim(),
+      checkedAt: new Date(),
+      checkedBy: 'system',
+    };
+  }
+
+  private async countAffectedRecords(
+    requirement: any,
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // This would count records affected by non-compliance
+    return 0;
+  }
+
+  private getViolationSeverity(
+    requirement: any,
+  ): 'low' | 'medium' | 'high' | 'critical' {
+    return requirement.mandatory ? 'high' : 'medium';
+  }
+
+  private generateViolationId(): string {
+    return `violation_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+  }
+
+  private async getActiveRegulations(): Promise<ComplianceRegulation[]> {
+    // This would fetch from database
+    return [await this.getRegulation('sox'), await this.getRegulation('gdpr')];
+  }
+
+  private async generateComplianceTrends(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<{
+    scores: Array<{ date: Date; score: number }>;
+    violations: Array<{ date: Date; count: number }>;
+  }> {
+    // This would generate trend data over the period
+    const scores = [];
+    const violations = [];
+
+    const current = new Date(startDate);
+    while (current <= endDate) {
+      scores.push({
+        date: new Date(current),
+        score: 85 + Math.random() * 15, // Placeholder
+      });
+      violations.push({
+        date: new Date(current),
+        count: Math.floor(Math.random() * 5), // Placeholder
+      });
+      current.setDate(current.getDate() + 1);
+    }
+
+    return { scores, violations };
+  }
+
+  private async generateComplianceAlerts(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<
+    Array<{
+      type: string;
+      severity: string;
+      message: string;
+      timestamp: Date;
+    }>
+  > {
+    // This would generate alerts based on compliance issues
+    return [
+      {
+        type: 'compliance_violation',
+        severity: 'high',
+        message: 'High number of access denied events detected',
+        timestamp: new Date(),
+      },
+    ];
+  }
+
+  private generatePDFReport(report: ComplianceReportData): string {
+    // This would generate a PDF report
+    return 'PDF report content';
+  }
+
+  private generateExcelReport(report: ComplianceReportData): string {
+    // This would generate an Excel report
+    return 'Excel report content';
+  }
+
+  private async getReport(reportId: string): Promise<ComplianceReportData> {
+    // This would fetch the report from database
+    throw new Error(`Report ${reportId} not found`);
+  }
+
+  private generateRecommendations(violations: ComplianceViolation[]): string[] {
+    const recommendations = [];
+
+    if (violations.some((v) => v.severity === 'critical')) {
+      recommendations.push(
+        'Immediate action required for critical compliance violations',
+      );
+    }
+
+    if (violations.some((v) => v.severity === 'high')) {
+      recommendations.push(
+        'Review and remediate high-priority compliance issues',
+      );
+    }
+
+    if (violations.length > 10) {
+      recommendations.push('Implement comprehensive compliance program');
+    }
+
+    return recommendations;
+  }
+
+  // Helper methods for metrics calculation
+  private async calculateErrorRate(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    const totalLogs = await this.auditLogRepository.count({
+      where: { createdAt: Between(startDate, endDate) },
+    });
+
+    const errorLogs = await this.auditLogRepository.count({
+      where: {
+        createdAt: Between(startDate, endDate),
+        error: MoreThan(''),
+      },
+    });
+
+    return totalLogs > 0 ? (errorLogs / totalLogs) * 100 : 0;
+  }
+
+  private async calculateComplianceScore(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 85 + Math.random() * 15;
+  }
+
+  private async calculateRiskScore(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 20 + Math.random() * 30;
+  }
+
+  private async calculateRetentionCompliance(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 90 + Math.random() * 10;
+  }
+
+  private async getLogsByAction(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<Record<AuditAction, number>> {
+    // Placeholder implementation
+    return {} as Record<AuditAction, number>;
+  }
+
+  private async getLogsByResource(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<Record<AuditResource, number>> {
+    // Placeholder implementation
+    return {} as Record<AuditResource, number>;
+  }
+
+  private async getLogsBySeverity(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<Record<AuditSeverity, number>> {
+    // Placeholder implementation
+    return {} as Record<AuditSeverity, number>;
+  }
+
+  private async calculateAverageExecutionTime(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 100 + Math.random() * 50;
+  }
+
+  private async countSensitiveDataLogs(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 100);
+  }
+
+  private async countEncryptedLogs(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 50);
+  }
+
+  private async getTransactionsByType(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<Record<TransactionType, number>> {
+    // Placeholder implementation
+    return {} as Record<TransactionType, number>;
+  }
+
+  private async getTransactionsByStatus(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<Record<TransactionStatus, number>> {
+    // Placeholder implementation
+    return {} as Record<TransactionStatus, number>;
+  }
+
+  private async calculateAverageAmount(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 1000 + Math.random() * 5000;
+  }
+
+  private async calculateTotalFees(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.random() * 10000;
+  }
+
+  private async calculateTotalTaxes(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.random() * 5000;
+  }
+
+  private async getDataClassificationMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<Record<string, number>> {
+    // Placeholder implementation
+    return {
+      public: Math.floor(Math.random() * 100),
+      internal: Math.floor(Math.random() * 200),
+      confidential: Math.floor(Math.random() * 50),
+      restricted: Math.floor(Math.random() * 10),
+    };
+  }
+
+  private async countRedactionApplied(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 25);
+  }
+
+  private async countConsentRecords(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 150);
+  }
+
+  private async getRetentionPolicyMetrics(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<Record<string, number>> {
+    // Placeholder implementation
+    return {
+      '1_year': Math.floor(Math.random() * 100),
+      '3_years': Math.floor(Math.random() * 200),
+      '5_years': Math.floor(Math.random() * 50),
+      '7_years': Math.floor(Math.random() * 25),
+    };
+  }
+
+  private async countAuthenticationEvents(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 500);
+  }
+
+  private async countAccessDeniedEvents(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 50);
+  }
+
+  private async countSecurityViolations(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 10);
+  }
+
+  private async countThreatDetections(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 5);
+  }
+
+  private async calculateAverageResponseTime(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 150 + Math.random() * 100;
+  }
+
+  private async calculateThroughput(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 1000 + Math.random() * 500;
+  }
+
+  private async calculateSystemUptime(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 99.5 + Math.random() * 0.5;
+  }
+
+  private async countHighRiskTransactions(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 20);
+  }
+
+  private async countSuspiciousActivities(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 15);
+  }
+
+  private async countComplianceViolations(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return Math.floor(Math.random() * 10);
+  }
+
+  private async calculateAverageResponseTime(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 150 + Math.random() * 100;
+  }
+
+  private async calculateThroughput(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 1000 + Math.random() * 500;
+  }
+
+  private async calculateSystemUptime(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<number> {
+    // Placeholder implementation
+    return 99.5 + Math.random() * 0.5;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/audit/reports/index.html b/coverage/lcov-report/src/audit/reports/index.html new file mode 100644 index 0000000..18a0c22 --- /dev/null +++ b/coverage/lcov-report/src/audit/reports/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/audit/reports + + + + + + + + + +
+
+

All files src/audit/reports

+
+ +
+ 0% + Statements + 0/1179 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1179 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
compliance.report.ts +
+
0%0/11790%0/10%0/10%0/1179
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/analytics/index.html b/coverage/lcov-report/src/carbon/analytics/index.html new file mode 100644 index 0000000..1377c60 --- /dev/null +++ b/coverage/lcov-report/src/carbon/analytics/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/carbon/analytics + + + + + + + + + +
+
+

All files src/carbon/analytics

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
reduction-analytics.service.ts +
+
0%0/340%0/10%0/10%0/34
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/analytics/reduction-analytics.service.ts.html b/coverage/lcov-report/src/carbon/analytics/reduction-analytics.service.ts.html new file mode 100644 index 0000000..551890a --- /dev/null +++ b/coverage/lcov-report/src/carbon/analytics/reduction-analytics.service.ts.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for src/carbon/analytics/reduction-analytics.service.ts + + + + + + + + + +
+
+

All files / src/carbon/analytics reduction-analytics.service.ts

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class ReductionAnalyticsService {
+  private readonly logger = new Logger(ReductionAnalyticsService.name);
+
+  async getReductionOpportunities(): Promise<any[]> {
+    return [
+      {
+        area: 'Energy Efficiency',
+        potentialReduction: 0.25, // 25%
+        implementationCost: 50000,
+        paybackPeriod: 18, // months
+      },
+      {
+        area: 'Renewable Integration',
+        potentialReduction: 0.4,
+        implementationCost: 150000,
+        paybackPeriod: 36,
+      },
+    ];
+  }
+
+  async trackReductionProgress(targetPercent: number): Promise<any> {
+    const currentReduction = 0.22; // 22% achieved
+
+    return {
+      target: targetPercent,
+      current: currentReduction,
+      progress: (currentReduction / targetPercent) * 100,
+      onTrack: currentReduction >= targetPercent * 0.8,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/calculations/emission-calculator.service.ts.html b/coverage/lcov-report/src/carbon/calculations/emission-calculator.service.ts.html new file mode 100644 index 0000000..412bfd8 --- /dev/null +++ b/coverage/lcov-report/src/carbon/calculations/emission-calculator.service.ts.html @@ -0,0 +1,295 @@ + + + + + + Code coverage report for src/carbon/calculations/emission-calculator.service.ts + + + + + + + + + +
+
+

All files / src/carbon/calculations emission-calculator.service.ts

+
+ +
+ 0% + Statements + 0/70 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class EmissionCalculatorService {
+  private readonly logger = new Logger(EmissionCalculatorService.name);
+
+  // ISO 14064 compliant emission factors (kg CO2e per unit)
+  private readonly emissionFactors = {
+    solar: 0.048,
+    wind: 0.011,
+    natural_gas: 0.49,
+    coal: 0.82,
+    grid_average: 0.233, // kg CO2e per kWh
+    transportation: 0.171, // kg CO2e per km
+  };
+
+  calculateEmissions(
+    activityData: number,
+    sourceType: string,
+    customFactor?: number,
+  ): { emissions: number; unit: string; factor: number } {
+    this.logger.log(`Calculating emissions for ${sourceType}`);
+
+    const factor = customFactor || this.getEmissionFactor(sourceType);
+    const emissions = activityData * factor;
+
+    return {
+      emissions,
+      unit: 'kg CO2e',
+      factor,
+    };
+  }
+
+  calculateTransactionCarbonFootprint(transactionData: any): {
+    emissions: number;
+    intensity: number;
+  } {
+    const { energyAmount, energySource, distance } = transactionData;
+
+    // Calculate production emissions
+    const productionEmissions = this.calculateEmissions(
+      energyAmount,
+      energySource,
+    ).emissions;
+
+    // Calculate transportation emissions if applicable
+    const transportEmissions = distance
+      ? this.calculateEmissions(distance, 'transportation').emissions
+      : 0;
+
+    const totalEmissions = productionEmissions + transportEmissions;
+    const intensity = energyAmount > 0 ? totalEmissions / energyAmount : 0;
+
+    return {
+      emissions: totalEmissions,
+      intensity,
+    };
+  }
+
+  private getEmissionFactor(sourceType: string): number {
+    return (
+      this.emissionFactors[sourceType] || this.emissionFactors.grid_average
+    );
+  }
+
+  validateCalculation(activityData: number, factor: number): boolean {
+    // ISO 14064 validation checks
+    return activityData > 0 && factor > 0 && factor < 10;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/calculations/index.html b/coverage/lcov-report/src/carbon/calculations/index.html new file mode 100644 index 0000000..c19e6e8 --- /dev/null +++ b/coverage/lcov-report/src/carbon/calculations/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/carbon/calculations + + + + + + + + + +
+
+

All files src/carbon/calculations

+
+ +
+ 0% + Statements + 0/70 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
emission-calculator.service.ts +
+
0%0/700%0/10%0/10%0/70
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/carbon-tracking.module.ts.html b/coverage/lcov-report/src/carbon/carbon-tracking.module.ts.html new file mode 100644 index 0000000..c8cf856 --- /dev/null +++ b/coverage/lcov-report/src/carbon/carbon-tracking.module.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/carbon/carbon-tracking.module.ts + + + + + + + + + +
+
+

All files / src/carbon carbon-tracking.module.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { CarbonData } from './entities/carbon-data.entity';
+import { EmissionCalculatorService } from './calculations/emission-calculator.service';
+import { RealTimeTrackerService } from './tracking/real-time-tracker.service';
+import { SustainabilityReportService } from './reporting/sustainability-report.service';
+import { CarbonOffsetService } from './offsets/carbon-offset.service';
+import { ReductionAnalyticsService } from './analytics/reduction-analytics.service';
+import { CarbonController } from './carbon.controller';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([CarbonData])],
+  controllers: [CarbonController],
+  providers: [
+    EmissionCalculatorService,
+    RealTimeTrackerService,
+    SustainabilityReportService,
+    CarbonOffsetService,
+    ReductionAnalyticsService,
+  ],
+  exports: [
+    EmissionCalculatorService,
+    RealTimeTrackerService,
+    SustainabilityReportService,
+    CarbonOffsetService,
+    ReductionAnalyticsService,
+  ],
+})
+export class CarbonTrackingModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/carbon.controller.ts.html b/coverage/lcov-report/src/carbon/carbon.controller.ts.html new file mode 100644 index 0000000..8a069cf --- /dev/null +++ b/coverage/lcov-report/src/carbon/carbon.controller.ts.html @@ -0,0 +1,301 @@ + + + + + + Code coverage report for src/carbon/carbon.controller.ts + + + + + + + + + +
+
+

All files / src/carbon carbon.controller.ts

+
+ +
+ 0% + Statements + 0/72 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, Post, Body, Query } from '@nestjs/common';
+import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
+import { EmissionCalculatorService } from './calculations/emission-calculator.service';
+import { RealTimeTrackerService } from './tracking/real-time-tracker.service';
+import { SustainabilityReportService } from './reporting/sustainability-report.service';
+import { CarbonOffsetService } from './offsets/carbon-offset.service';
+import { ReductionAnalyticsService } from './analytics/reduction-analytics.service';
+
+@ApiTags('Carbon Tracking')
+@Controller('carbon')
+export class CarbonController {
+  constructor(
+    private readonly calculator: EmissionCalculatorService,
+    private readonly tracker: RealTimeTrackerService,
+    private readonly reporter: SustainabilityReportService,
+    private readonly offset: CarbonOffsetService,
+    private readonly analytics: ReductionAnalyticsService,
+  ) {}
+
+  @Post('calculate')
+  @ApiOperation({ summary: 'Calculate carbon emissions' })
+  async calculateEmissions(@Body() data: any): Promise<any> {
+    const result = this.calculator.calculateEmissions(
+      data.activityData,
+      data.source,
+    );
+    return { ...result, timestamp: new Date() };
+  }
+
+  @Get('current')
+  @ApiOperation({ summary: 'Get current emission levels' })
+  async getCurrentEmissions(): Promise<any> {
+    return this.tracker.getCurrentEmissions();
+  }
+
+  @Get('report/quarterly')
+  @ApiOperation({ summary: 'Get quarterly sustainability report' })
+  async getQuarterlyReport(
+    @Query('year') year: number,
+    @Query('quarter') quarter: number,
+  ): Promise<any> {
+    return this.reporter.generateQuarterlyReport(year, quarter);
+  }
+
+  @Get('offsets/projects')
+  @ApiOperation({ summary: 'Get available carbon offset projects' })
+  async getOffsetProjects(): Promise<any[]> {
+    return this.offset.getAvailableProjects();
+  }
+
+  @Post('offsets/purchase')
+  @ApiOperation({ summary: 'Purchase carbon offsets' })
+  async purchaseOffsets(@Body() data: any): Promise<any> {
+    return this.offset.purchaseOffset(data.amountTonnes, data.projectType);
+  }
+
+  @Get('analytics/reduction')
+  @ApiOperation({ summary: 'Get reduction opportunities' })
+  async getReductionOpportunities(): Promise<any[]> {
+    return this.analytics.getReductionOpportunities();
+  }
+
+  @Get('footprint/transaction')
+  @ApiOperation({ summary: 'Calculate transaction carbon footprint' })
+  async getTransactionFootprint(
+    @Query('data') transactionData: any,
+  ): Promise<any> {
+    return this.calculator.calculateTransactionCarbonFootprint(
+      JSON.parse(transactionData),
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/dto/carbon-calculation.dto.ts.html b/coverage/lcov-report/src/carbon/dto/carbon-calculation.dto.ts.html new file mode 100644 index 0000000..63901ea --- /dev/null +++ b/coverage/lcov-report/src/carbon/dto/carbon-calculation.dto.ts.html @@ -0,0 +1,292 @@ + + + + + + Code coverage report for src/carbon/dto/carbon-calculation.dto.ts + + + + + + + + + +
+
+

All files / src/carbon/dto carbon-calculation.dto.ts

+
+ +
+ 0% + Statements + 0/69 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ApiProperty } from '@nestjs/swagger';
+import {
+  IsNumber,
+  IsOptional,
+  IsString,
+  IsEnum,
+  IsUUID,
+} from 'class-validator';
+import { EmissionSource, UnitType } from '../entities/carbon-data.entity';
+
+export class CarbonCalculationDto {
+  @ApiProperty({ description: 'Emission source type' })
+  @IsEnum(EmissionSource)
+  source: EmissionSource;
+
+  @ApiProperty({ description: 'Activity data (e.g., kWh consumed)' })
+  @IsNumber()
+  activityData: number;
+
+  @ApiProperty({
+    description: 'Emission factor (kg CO2e per unit)',
+    required: false,
+  })
+  @IsOptional()
+  @IsNumber()
+  emissionFactor?: number;
+
+  @ApiProperty({ description: 'Location/region', required: false })
+  @IsOptional()
+  @IsString()
+  location?: string;
+
+  @ApiProperty({ description: 'Associated asset ID', required: false })
+  @IsOptional()
+  @IsUUID()
+  assetId?: string;
+}
+
+export class CarbonOffsetDto {
+  @ApiProperty({ description: 'Amount of CO2 to offset in tonnes' })
+  @IsNumber()
+  amountTonnes: number;
+
+  @ApiProperty({ description: 'Offset project type' })
+  @IsString()
+  projectType: string;
+
+  @ApiProperty({ description: 'Project location', required: false })
+  @IsOptional()
+  @IsString()
+  location?: string;
+}
+
+export class CarbonReportDto {
+  @ApiProperty({ description: 'Total emissions in tonnes CO2e' })
+  totalEmissions: number;
+
+  @ApiProperty({ description: 'Breakdown by source' })
+  bySource: Record<string, number>;
+
+  @ApiProperty({ description: 'Top emitters' })
+  topEmitters: any[];
+
+  @ApiProperty({ description: 'Reduction vs previous period' })
+  reductionPercent: number;
+
+  @ApiProperty({ description: 'Carbon intensity' })
+  carbonIntensity: number;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/dto/index.html b/coverage/lcov-report/src/carbon/dto/index.html new file mode 100644 index 0000000..225872b --- /dev/null +++ b/coverage/lcov-report/src/carbon/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/carbon/dto + + + + + + + + + +
+
+

All files src/carbon/dto

+
+ +
+ 0% + Statements + 0/69 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
carbon-calculation.dto.ts +
+
0%0/690%0/10%0/10%0/69
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/entities/carbon-data.entity.ts.html b/coverage/lcov-report/src/carbon/entities/carbon-data.entity.ts.html new file mode 100644 index 0000000..251e3a1 --- /dev/null +++ b/coverage/lcov-report/src/carbon/entities/carbon-data.entity.ts.html @@ -0,0 +1,319 @@ + + + + + + Code coverage report for src/carbon/entities/carbon-data.entity.ts + + + + + + + + + +
+
+

All files / src/carbon/entities carbon-data.entity.ts

+
+ +
+ 0% + Statements + 0/78 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  Index,
+} from 'typeorm';
+
+export enum EmissionSource {
+  ENERGY_PRODUCTION = 'energy_production',
+  ENERGY_CONSUMPTION = 'energy_consumption',
+  TRANSPORTATION = 'transportation',
+  MANUFACTURING = 'manufacturing',
+  GRID_MIX = 'grid_mix',
+}
+
+export enum UnitType {
+  KG_CO2E = 'kg_co2e',
+  TONNES_CO2E = 'tonnes_co2e',
+  MWH = 'mwh',
+  KWH = 'kwh',
+}
+
+@Entity('carbon_data')
+export class CarbonData {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'enum', enum: EmissionSource })
+  source: EmissionSource;
+
+  @Column('float')
+  emissions: number; // in kg CO2e
+
+  @Column({ type: 'enum', enum: UnitType, default: UnitType.KG_CO2E })
+  unit: UnitType;
+
+  @Column({ nullable: true })
+  activityData?: number; // e.g., kWh consumed
+
+  @Column({ nullable: true })
+  emissionFactor?: number; // kg CO2e per unit
+
+  @Column({ nullable: true })
+  location?: string;
+
+  @Column({ nullable: true })
+  @Index()
+  assetId?: string;
+
+  @Column({ nullable: true })
+  transactionId?: string;
+
+  @Column('jsonb')
+  metadata: any;
+
+  @Column({ default: false })
+  isVerified: boolean;
+
+  @Column({ nullable: true })
+  verifiedBy?: string;
+
+  @CreateDateColumn()
+  @Index()
+  timestamp: Date;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  toTonnes(): number {
+    return this.emissions / 1000;
+  }
+
+  getEmissionIntensity(): number {
+    if (!this.activityData) return 0;
+    return this.emissions / this.activityData;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/entities/index.html b/coverage/lcov-report/src/carbon/entities/index.html new file mode 100644 index 0000000..22fd761 --- /dev/null +++ b/coverage/lcov-report/src/carbon/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/carbon/entities + + + + + + + + + +
+
+

All files src/carbon/entities

+
+ +
+ 0% + Statements + 0/78 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
carbon-data.entity.ts +
+
0%0/780%0/10%0/10%0/78
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/index.html b/coverage/lcov-report/src/carbon/index.html new file mode 100644 index 0000000..cb80998 --- /dev/null +++ b/coverage/lcov-report/src/carbon/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/carbon + + + + + + + + + +
+
+

All files src/carbon

+
+ +
+ 0% + Statements + 0/101 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/101 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
carbon-tracking.module.ts +
+
0%0/290%0/10%0/10%0/29
carbon.controller.ts +
+
0%0/720%0/10%0/10%0/72
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/offsets/carbon-offset.service.ts.html b/coverage/lcov-report/src/carbon/offsets/carbon-offset.service.ts.html new file mode 100644 index 0000000..5a57970 --- /dev/null +++ b/coverage/lcov-report/src/carbon/offsets/carbon-offset.service.ts.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for src/carbon/offsets/carbon-offset.service.ts + + + + + + + + + +
+
+

All files / src/carbon/offsets carbon-offset.service.ts

+
+ +
+ 0% + Statements + 0/51 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/51 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class CarbonOffsetService {
+  private readonly logger = new Logger(CarbonOffsetService.name);
+
+  async purchaseOffset(
+    amountTonnes: number,
+    projectType: string,
+  ): Promise<any> {
+    this.logger.log(
+      `Purchasing ${amountTonnes} tonnes of ${projectType} offsets`,
+    );
+
+    return {
+      offsetId: `OFFSET-${Date.now()}`,
+      amount: amountTonnes,
+      projectType,
+      cost: amountTonnes * 25, // $25 per tonne
+      retirementDate: new Date(),
+      certification: 'Gold Standard',
+    };
+  }
+
+  async getAvailableProjects(): Promise<any[]> {
+    return [
+      {
+        id: 1,
+        name: 'Solar Farm India',
+        type: 'renewable_energy',
+        pricePerTonne: 22,
+      },
+      {
+        id: 2,
+        name: 'Reforestation Brazil',
+        type: 'forestry',
+        pricePerTonne: 18,
+      },
+      {
+        id: 3,
+        name: 'Wind Farm Scotland',
+        type: 'renewable_energy',
+        pricePerTonne: 24,
+      },
+    ];
+  }
+
+  async calculateOffsetRequirement(emissions: number): Promise<number> {
+    return emissions / 1000; // Convert kg to tonnes
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/offsets/index.html b/coverage/lcov-report/src/carbon/offsets/index.html new file mode 100644 index 0000000..e071e67 --- /dev/null +++ b/coverage/lcov-report/src/carbon/offsets/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/carbon/offsets + + + + + + + + + +
+
+

All files src/carbon/offsets

+
+ +
+ 0% + Statements + 0/51 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/51 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
carbon-offset.service.ts +
+
0%0/510%0/10%0/10%0/51
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/reporting/index.html b/coverage/lcov-report/src/carbon/reporting/index.html new file mode 100644 index 0000000..c18918a --- /dev/null +++ b/coverage/lcov-report/src/carbon/reporting/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/carbon/reporting + + + + + + + + + +
+
+

All files src/carbon/reporting

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
sustainability-report.service.ts +
+
0%0/340%0/10%0/10%0/34
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/reporting/sustainability-report.service.ts.html b/coverage/lcov-report/src/carbon/reporting/sustainability-report.service.ts.html new file mode 100644 index 0000000..4578790 --- /dev/null +++ b/coverage/lcov-report/src/carbon/reporting/sustainability-report.service.ts.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for src/carbon/reporting/sustainability-report.service.ts + + + + + + + + + +
+
+

All files / src/carbon/reporting sustainability-report.service.ts

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class SustainabilityReportService {
+  private readonly logger = new Logger(SustainabilityReportService.name);
+
+  async generateQuarterlyReport(year: number, quarter: number): Promise<any> {
+    this.logger.log(`Generating Q${quarter} ${year} sustainability report`);
+
+    return {
+      period: `Q${quarter} ${year}`,
+      totalEmissions: 1250.5, // tonnes CO2e
+      byScope: {
+        scope1: 450.2,
+        scope2: 600.3,
+        scope3: 200.0,
+      },
+      reductionVsPrevious: 0.15, // 15% reduction
+      carbonIntensity: 0.045,
+      renewablePercentage: 0.78,
+      complianceStatus: 'COMPLIANT',
+    };
+  }
+
+  async generateAnnualReport(year: number): Promise<any> {
+    return {
+      year,
+      totalEmissions: 5200.8,
+      reductionTarget: 0.2,
+      actualReduction: 0.22,
+      targetAchieved: true,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/tracking/index.html b/coverage/lcov-report/src/carbon/tracking/index.html new file mode 100644 index 0000000..248a079 --- /dev/null +++ b/coverage/lcov-report/src/carbon/tracking/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/carbon/tracking + + + + + + + + + +
+
+

All files src/carbon/tracking

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
real-time-tracker.service.ts +
+
0%0/290%0/10%0/10%0/29
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/carbon/tracking/real-time-tracker.service.ts.html b/coverage/lcov-report/src/carbon/tracking/real-time-tracker.service.ts.html new file mode 100644 index 0000000..2fed60f --- /dev/null +++ b/coverage/lcov-report/src/carbon/tracking/real-time-tracker.service.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/carbon/tracking/real-time-tracker.service.ts + + + + + + + + + +
+
+

All files / src/carbon/tracking real-time-tracker.service.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class RealTimeTrackerService {
+  private readonly logger = new Logger(RealTimeTrackerService.name);
+
+  async trackEmission(data: any): Promise<void> {
+    this.logger.log('Tracking real-time emission data');
+    // Store emission data with 15-minute intervals
+  }
+
+  async getCurrentEmissions(assetId?: string): Promise<any> {
+    return {
+      currentRate: 45.2, // kg CO2e per hour
+      trend: 'decreasing',
+      lastUpdated: new Date(),
+    };
+  }
+
+  async getHistoricalData(timeRange: {
+    start: Date;
+    end: Date;
+  }): Promise<any[]> {
+    return [
+      { timestamp: new Date(), emissions: 120 },
+      { timestamp: new Date(Date.now() - 900000), emissions: 125 },
+    ];
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/classification.module.ts.html b/coverage/lcov-report/src/classification/classification.module.ts.html new file mode 100644 index 0000000..0c1a649 --- /dev/null +++ b/coverage/lcov-report/src/classification/classification.module.ts.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/classification/classification.module.ts + + + + + + + + + +
+
+

All files / src/classification classification.module.ts

+
+ +
+ 0% + Statements + 0/21 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Classification Module
+ *
+ * Module for managing energy classifications, quality ratings, and certifications.
+ */
+
+import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ClassificationService } from './classification.service';
+import { EnergyCategory } from './entities/energy-category.entity';
+import { EnergyQuality } from './entities/energy-quality.entity';
+import { Certification } from './entities/certification.entity';
+
+@Module({
+  imports: [
+    TypeOrmModule.forFeature([EnergyCategory, EnergyQuality, Certification]),
+  ],
+  providers: [ClassificationService],
+  exports: [ClassificationService, TypeOrmModule],
+})
+export class ClassificationModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/classification.service.ts.html b/coverage/lcov-report/src/classification/classification.service.ts.html new file mode 100644 index 0000000..7517682 --- /dev/null +++ b/coverage/lcov-report/src/classification/classification.service.ts.html @@ -0,0 +1,2101 @@ + + + + + + Code coverage report for src/classification/classification.service.ts + + + + + + + + + +
+
+

All files / src/classification classification.service.ts

+
+ +
+ 0% + Statements + 0/672 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/672 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Classification Service
+ *
+ * Service for managing energy classifications, quality ratings, and certifications.
+ */
+
+import {
+  Injectable,
+  NotFoundException,
+  Logger,
+  OnModuleInit,
+} from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, Like, ILike } from 'typeorm';
+import {
+  EnergyCategory,
+  EnergyType,
+  DEFAULT_ENERGY_CATEGORIES,
+} from './entities/energy-category.entity';
+import {
+  EnergyQuality,
+  QualityRating,
+  DEFAULT_QUALITY_RATINGS,
+} from './entities/energy-quality.entity';
+import {
+  Certification,
+  CertificationType,
+  CertificationStatus,
+  DEFAULT_CERTIFICATIONS,
+  isCertificationValid,
+} from './entities/certification.entity';
+import {
+  CreateCategoryDto,
+  UpdateCategoryDto,
+  CategoryFilterDto,
+  CategoryTreeDto,
+  CalculatePriceDto,
+  CalculatePriceResponseDto,
+} from './dto/category.dto';
+import {
+  CreateQualityRatingDto,
+  UpdateQualityRatingDto,
+  QualityRatingFilterDto,
+  CreateCertificationDto,
+  UpdateCertificationDto,
+  CertificationFilterDto,
+  ClassificationResponseDto,
+} from './dto/quality-rating.dto';
+
+/**
+ * Classification service
+ */
+@Injectable()
+export class ClassificationService implements OnModuleInit {
+  private readonly logger = new Logger(ClassificationService.name);
+
+  constructor(
+    @InjectRepository(EnergyCategory)
+    private readonly categoryRepository: Repository<EnergyCategory>,
+    @InjectRepository(EnergyQuality)
+    private readonly qualityRepository: Repository<EnergyQuality>,
+    @InjectRepository(Certification)
+    private readonly certificationRepository: Repository<Certification>,
+  ) {}
+
+  /**
+   * Initialize and seed default data
+   */
+  async onModuleInit(): Promise<void> {
+    await this.seedDefaultCategories();
+    await this.seedDefaultQualities();
+    await this.seedDefaultCertifications();
+  }
+
+  /**
+   * Seed default energy categories
+   */
+  private async seedDefaultCategories(): Promise<void> {
+    const count = await this.categoryRepository.count();
+    if (count > 0) {
+      this.logger.log('Categories already seeded');
+      return;
+    }
+
+    this.logger.log('Seeding default energy categories...');
+    const categories = this.categoryRepository.create(
+      DEFAULT_ENERGY_CATEGORIES,
+    );
+    await this.categoryRepository.save(categories);
+    this.logger.log('Default energy categories seeded');
+  }
+
+  /**
+   * Seed default quality ratings
+   */
+  private async seedDefaultQualities(): Promise<void> {
+    const count = await this.qualityRepository.count();
+    if (count > 0) {
+      this.logger.log('Quality ratings already seeded');
+      return;
+    }
+
+    this.logger.log('Seeding default quality ratings...');
+
+    // Get all categories to link qualities
+    const categories = await this.categoryRepository.find();
+
+    for (const quality of DEFAULT_QUALITY_RATINGS) {
+      for (const category of categories) {
+        const qualityEntity = this.qualityRepository.create({
+          ...quality,
+          categoryId: category.id,
+        });
+        await this.qualityRepository.save(qualityEntity);
+      }
+    }
+
+    this.logger.log('Default quality ratings seeded');
+  }
+
+  /**
+   * Seed default certifications
+   */
+  private async seedDefaultCertifications(): Promise<void> {
+    const count = await this.certificationRepository.count();
+    if (count > 0) {
+      this.logger.log('Certifications already seeded');
+      return;
+    }
+
+    this.logger.log('Seeding default certifications...');
+    const certifications = this.certificationRepository.create(
+      DEFAULT_CERTIFICATIONS,
+    );
+    await this.certificationRepository.save(certifications);
+    this.logger.log('Default certifications seeded');
+  }
+
+  // ==================== Category Methods ====================
+
+  /**
+   * Create a new category
+   */
+  async createCategory(dto: CreateCategoryDto): Promise<EnergyCategory> {
+    const category = this.categoryRepository.create(dto);
+    return this.categoryRepository.save(category);
+  }
+
+  /**
+   * Update a category
+   */
+  async updateCategory(
+    id: string,
+    dto: UpdateCategoryDto,
+  ): Promise<EnergyCategory> {
+    const category = await this.getCategoryById(id);
+    Object.assign(category, dto);
+    return this.categoryRepository.save(category);
+  }
+
+  /**
+   * Get category by ID
+   */
+  async getCategoryById(id: string): Promise<EnergyCategory> {
+    const category = await this.categoryRepository.findOne({
+      where: { id },
+      relations: ['qualities', 'certifications'],
+    });
+    if (!category) {
+      throw new NotFoundException(`Category with ID ${id} not found`);
+    }
+    return category;
+  }
+
+  /**
+   * Get category by energy type
+   */
+  async getCategoryByEnergyType(
+    energyType: EnergyType,
+  ): Promise<EnergyCategory> {
+    const category = await this.categoryRepository.findOne({
+      where: { energyType },
+      relations: ['qualities', 'certifications'],
+    });
+    if (!category) {
+      throw new NotFoundException(
+        `Category with energy type ${energyType} not found`,
+      );
+    }
+    return category;
+  }
+
+  /**
+   * List categories with filters
+   */
+  async listCategories(filter: CategoryFilterDto): Promise<{
+    categories: EnergyCategory[];
+    total: number;
+    page: number;
+    limit: number;
+    totalPages: number;
+  }> {
+    const {
+      page = 1,
+      limit = 10,
+      search,
+      isRenewable,
+      isActive,
+      energyType,
+      tags,
+    } = filter;
+    const skip = (page - 1) * limit;
+
+    const queryBuilder = this.categoryRepository.createQueryBuilder('category');
+
+    if (energyType) {
+      queryBuilder.andWhere('category.energyType = :energyType', {
+        energyType,
+      });
+    }
+
+    if (isRenewable !== undefined) {
+      queryBuilder.andWhere('category.isRenewable = :isRenewable', {
+        isRenewable,
+      });
+    }
+
+    if (isActive !== undefined) {
+      queryBuilder.andWhere('category.isActive = :isActive', { isActive });
+    }
+
+    if (search) {
+      queryBuilder.andWhere(
+        '(category.name ILIKE :search OR category.description ILIKE :search)',
+        { search: `%${search}%` },
+      );
+    }
+
+    if (tags && tags.length > 0) {
+      queryBuilder.andWhere('category.tags && :tags', { tags });
+    }
+
+    queryBuilder.orderBy('category.sortOrder', 'ASC').skip(skip).take(limit);
+
+    const [categories, total] = await queryBuilder.getManyAndCount();
+
+    return {
+      categories,
+      total,
+      page,
+      limit,
+      totalPages: Math.ceil(total / limit),
+    };
+  }
+
+  /**
+   * Get category tree
+   */
+  async getCategoryTree(): Promise<CategoryTreeDto[]> {
+    const rootCategories = await this.categoryRepository.find({
+      where: { parentId: null as any },
+      order: { sortOrder: 'ASC' },
+    });
+
+    return this.buildCategoryTree(rootCategories);
+  }
+
+  /**
+   * Build category tree recursively
+   */
+  private async buildCategoryTree(
+    categories: EnergyCategory[],
+  ): Promise<CategoryTreeDto[]> {
+    const result: CategoryTreeDto[] = [];
+
+    for (const category of categories) {
+      const children = await this.categoryRepository.find({
+        where: { parentId: category.id },
+        order: { sortOrder: 'ASC' },
+      });
+
+      result.push({
+        id: category.id,
+        energyType: category.energyType,
+        name: category.name,
+        priceMultiplier: Number(category.priceMultiplier),
+        isRenewable: category.isRenewable,
+        children:
+          children.length > 0 ? await this.buildCategoryTree(children) : [],
+      });
+    }
+
+    return result;
+  }
+
+  /**
+   * Delete a category
+   */
+  async deleteCategory(id: string): Promise<void> {
+    const result = await this.categoryRepository.delete(id);
+    if (result.affected === 0) {
+      throw new NotFoundException(`Category with ID ${id} not found`);
+    }
+  }
+
+  // ==================== Quality Methods ====================
+
+  /**
+   * Create a new quality rating
+   */
+  async createQualityRating(
+    dto: CreateQualityRatingDto,
+  ): Promise<EnergyQuality> {
+    const quality = this.qualityRepository.create(dto);
+    return this.qualityRepository.save(quality);
+  }
+
+  /**
+   * Update a quality rating
+   */
+  async updateQualityRating(
+    id: string,
+    dto: UpdateQualityRatingDto,
+  ): Promise<EnergyQuality> {
+    const quality = await this.getQualityById(id);
+    Object.assign(quality, dto);
+    return this.qualityRepository.save(quality);
+  }
+
+  /**
+   * Get quality by ID
+   */
+  async getQualityById(id: string): Promise<EnergyQuality> {
+    const quality = await this.qualityRepository.findOne({
+      where: { id },
+      relations: ['category'],
+    });
+    if (!quality) {
+      throw new NotFoundException(`Quality rating with ID ${id} not found`);
+    }
+    return quality;
+  }
+
+  /**
+   * Get quality by rating
+   */
+  async getQualityByRating(
+    rating: QualityRating,
+    categoryId: string,
+  ): Promise<EnergyQuality> {
+    const quality = await this.qualityRepository.findOne({
+      where: { rating, categoryId },
+    });
+    if (!quality) {
+      throw new NotFoundException(
+        `Quality rating ${rating} not found for category ${categoryId}`,
+      );
+    }
+    return quality;
+  }
+
+  /**
+   * List quality ratings with filters
+   */
+  async listQualityRatings(filter: QualityRatingFilterDto): Promise<{
+    qualities: EnergyQuality[];
+    total: number;
+    page: number;
+    limit: number;
+    totalPages: number;
+  }> {
+    const {
+      page = 1,
+      limit = 10,
+      search,
+      rating,
+      tier,
+      categoryId,
+      isVerified,
+      isActive,
+    } = filter;
+    const skip = (page - 1) * limit;
+
+    const queryBuilder = this.qualityRepository.createQueryBuilder('quality');
+
+    if (rating) {
+      queryBuilder.andWhere('quality.rating = :rating', { rating });
+    }
+
+    if (tier) {
+      queryBuilder.andWhere('quality.tier = :tier', { tier });
+    }
+
+    if (categoryId) {
+      queryBuilder.andWhere('quality.categoryId = :categoryId', { categoryId });
+    }
+
+    if (isVerified !== undefined) {
+      queryBuilder.andWhere('quality.isVerified = :isVerified', { isVerified });
+    }
+
+    if (isActive !== undefined) {
+      queryBuilder.andWhere('quality.isActive = :isActive', { isActive });
+    }
+
+    if (search) {
+      queryBuilder.andWhere(
+        '(quality.name ILIKE :search OR quality.description ILIKE :search)',
+        { search: `%${search}%` },
+      );
+    }
+
+    queryBuilder.orderBy('quality.sortOrder', 'ASC').skip(skip).take(limit);
+
+    const [qualities, total] = await queryBuilder.getManyAndCount();
+
+    return {
+      qualities,
+      total,
+      page,
+      limit,
+      totalPages: Math.ceil(total / limit),
+    };
+  }
+
+  /**
+   * Delete a quality rating
+   */
+  async deleteQualityRating(id: string): Promise<void> {
+    const result = await this.qualityRepository.delete(id);
+    if (result.affected === 0) {
+      throw new NotFoundException(`Quality rating with ID ${id} not found`);
+    }
+  }
+
+  // ==================== Certification Methods ====================
+
+  /**
+   * Create a new certification
+   */
+  async createCertification(
+    dto: CreateCertificationDto,
+  ): Promise<Certification> {
+    const certification = this.certificationRepository.create(dto);
+    return this.certificationRepository.save(certification);
+  }
+
+  /**
+   * Update a certification
+   */
+  async updateCertification(
+    id: string,
+    dto: UpdateCertificationDto,
+  ): Promise<Certification> {
+    const certification = await this.getCertificationById(id);
+    Object.assign(certification, dto);
+    return this.certificationRepository.save(certification);
+  }
+
+  /**
+   * Get certification by ID
+   */
+  async getCertificationById(id: string): Promise<Certification> {
+    const certification = await this.certificationRepository.findOne({
+      where: { id },
+      relations: ['category'],
+    });
+    if (!certification) {
+      throw new NotFoundException(`Certification with ID ${id} not found`);
+    }
+    return certification;
+  }
+
+  /**
+   * Get certification by type
+   */
+  async getCertificationByType(
+    type: CertificationType,
+  ): Promise<Certification> {
+    const certification = await this.certificationRepository.findOne({
+      where: { type },
+    });
+    if (!certification) {
+      throw new NotFoundException(`Certification type ${type} not found`);
+    }
+    return certification;
+  }
+
+  /**
+   * List certifications with filters
+   */
+  async listCertifications(filter: CertificationFilterDto): Promise<{
+    certifications: Certification[];
+    total: number;
+    page: number;
+    limit: number;
+    totalPages: number;
+  }> {
+    const {
+      page = 1,
+      limit = 10,
+      search,
+      type,
+      status,
+      categoryId,
+      isVerified,
+      validOnly,
+    } = filter;
+    const skip = (page - 1) * limit;
+
+    const queryBuilder =
+      this.certificationRepository.createQueryBuilder('cert');
+
+    if (type) {
+      queryBuilder.andWhere('cert.type = :type', { type });
+    }
+
+    if (status) {
+      queryBuilder.andWhere('cert.status = :status', { status });
+    }
+
+    if (categoryId) {
+      queryBuilder.andWhere('cert.categoryId = :categoryId', { categoryId });
+    }
+
+    if (isVerified !== undefined) {
+      queryBuilder.andWhere('cert.isVerified = :isVerified', { isVerified });
+    }
+
+    if (validOnly) {
+      queryBuilder.andWhere('cert.status = :active', {
+        active: CertificationStatus.ACTIVE,
+      });
+      queryBuilder.andWhere('cert.validFrom <= :now', { now: new Date() });
+      queryBuilder.andWhere(
+        '(cert.validUntil IS NULL OR cert.validUntil >= :now)',
+        { now: new Date() },
+      );
+    }
+
+    if (search) {
+      queryBuilder.andWhere(
+        '(cert.name ILIKE :search OR cert.description ILIKE :search)',
+        { search: `%${search}%` },
+      );
+    }
+
+    queryBuilder.orderBy('cert.name', 'ASC').skip(skip).take(limit);
+
+    const [certifications, total] = await queryBuilder.getManyAndCount();
+
+    return {
+      certifications,
+      total,
+      page,
+      limit,
+      totalPages: Math.ceil(total / limit),
+    };
+  }
+
+  /**
+   * Delete a certification
+   */
+  async deleteCertification(id: string): Promise<void> {
+    const result = await this.certificationRepository.delete(id);
+    if (result.affected === 0) {
+      throw new NotFoundException(`Certification with ID ${id} not found`);
+    }
+  }
+
+  // ==================== Combined Methods ====================
+
+  /**
+   * Get full classification for an energy type
+   */
+  async getClassification(
+    energyType: EnergyType,
+    qualityRating: QualityRating,
+  ): Promise<ClassificationResponseDto> {
+    const category = await this.getCategoryByEnergyType(energyType);
+    const quality = await this.getQualityByRating(qualityRating, category.id);
+
+    // Get valid certifications for this category
+    const certifications = await this.certificationRepository.find({
+      where: { status: CertificationStatus.ACTIVE },
+    });
+
+    const validCertifications = certifications.filter(isCertificationValid);
+
+    // Calculate total multiplier
+    const categoryMultiplier = Number(category.priceMultiplier);
+    const qualityMultiplier = Number(quality.priceMultiplier);
+    const certMultiplier = validCertifications.reduce(
+      (acc, cert) => acc * Number(cert.priceAdjustment),
+      1,
+    );
+
+    return {
+      category: category as any,
+      quality: quality as any,
+      certifications: validCertifications as any,
+      totalMultiplier: categoryMultiplier * qualityMultiplier * certMultiplier,
+    };
+  }
+
+  /**
+   * Calculate price with all adjustments
+   */
+  async calculatePrice(
+    dto: CalculatePriceDto,
+  ): Promise<CalculatePriceResponseDto> {
+    const {
+      basePrice,
+      energyType,
+      qualityMultiplier = 1.0,
+      certificationMultiplier = 1.0,
+    } = dto;
+
+    // Get category for additional multiplier
+    const category = await this.getCategoryByEnergyType(energyType);
+    const categoryMultiplier = Number(category.priceMultiplier);
+
+    const totalMultiplier =
+      categoryMultiplier * qualityMultiplier * certificationMultiplier;
+    const adjustedPrice = basePrice * totalMultiplier;
+
+    return {
+      basePrice,
+      adjustedPrice,
+      totalMultiplier,
+      breakdown: {
+        categoryMultiplier,
+        qualityMultiplier,
+        certificationMultiplier,
+      },
+    };
+  }
+
+  /**
+   * Search and filter across all classifications
+   */
+  async searchClassifications(
+    query: string,
+    isRenewable?: boolean,
+    page: number = 1,
+    limit: number = 10,
+  ): Promise<{
+    categories: EnergyCategory[];
+    total: number;
+  }> {
+    const skip = (page - 1) * limit;
+
+    const queryBuilder = this.categoryRepository.createQueryBuilder('category');
+
+    queryBuilder.andWhere(
+      '(category.name ILIKE :query OR category.description ILIKE :query)',
+      { query: `%${query}%` },
+    );
+
+    if (isRenewable !== undefined) {
+      queryBuilder.andWhere('category.isRenewable = :isRenewable', {
+        isRenewable,
+      });
+    }
+
+    queryBuilder.orderBy('category.name', 'ASC').skip(skip).take(limit);
+
+    const [categories, total] = await queryBuilder.getManyAndCount();
+
+    return { categories, total };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/dto/category.dto.ts.html b/coverage/lcov-report/src/classification/dto/category.dto.ts.html new file mode 100644 index 0000000..ec26761 --- /dev/null +++ b/coverage/lcov-report/src/classification/dto/category.dto.ts.html @@ -0,0 +1,955 @@ + + + + + + Code coverage report for src/classification/dto/category.dto.ts + + + + + + + + + +
+
+

All files / src/classification/dto category.dto.ts

+
+ +
+ 0% + Statements + 0/290 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/290 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Category DTOs
+ *
+ * Data Transfer Objects for energy category operations.
+ */
+
+import {
+  IsString,
+  IsEnum,
+  IsNumber,
+  IsBoolean,
+  IsArray,
+  IsOptional,
+  IsUUID,
+  Min,
+  Max,
+  Length,
+  IsNotEmpty,
+} from 'class-validator';
+import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
+import { EnergyType, EnergySubType } from '../entities/energy-category.entity';
+
+/**
+ * Create category DTO
+ */
+export class CreateCategoryDto {
+  @ApiProperty({ enum: EnergyType, description: 'Energy type' })
+  @IsEnum(EnergyType)
+  @IsNotEmpty()
+  energyType: EnergyType;
+
+  @ApiProperty({ example: 'Solar Energy', description: 'Category name' })
+  @IsString()
+  @IsNotEmpty()
+  @Length(1, 100)
+  name: string;
+
+  @ApiPropertyOptional({ description: 'Category description' })
+  @IsString()
+  @IsOptional()
+  description?: string;
+
+  @ApiPropertyOptional({ enum: EnergySubType, description: 'Energy sub-type' })
+  @IsEnum(EnergySubType)
+  @IsOptional()
+  subType?: EnergySubType;
+
+  @ApiPropertyOptional({ description: 'Parent category ID' })
+  @IsUUID()
+  @IsOptional()
+  parentId?: string;
+
+  @ApiPropertyOptional({ example: 1.25, description: 'Price multiplier' })
+  @IsNumber()
+  @IsOptional()
+  @Min(0.1)
+  @Max(10)
+  priceMultiplier?: number;
+
+  @ApiPropertyOptional({ example: true, description: 'Is renewable' })
+  @IsBoolean()
+  @IsOptional()
+  isRenewable?: boolean;
+
+  @ApiPropertyOptional({ example: 1, description: 'Sort order' })
+  @IsNumber()
+  @IsOptional()
+  @Min(0)
+  @Max(999)
+  sortOrder?: number;
+
+  @ApiPropertyOptional({ example: ['renewable', 'solar'], description: 'Tags' })
+  @IsArray()
+  @IsString({ each: true })
+  @IsOptional()
+  tags?: string[];
+
+  @ApiPropertyOptional({ description: 'Additional metadata' })
+  @IsOptional()
+  metadata?: Record<string, any>;
+}
+
+/**
+ * Update category DTO
+ */
+export class UpdateCategoryDto extends PartialType(CreateCategoryDto) {
+  @ApiPropertyOptional({ example: true, description: 'Is active' })
+  @IsBoolean()
+  @IsOptional()
+  isActive?: boolean;
+}
+
+/**
+ * Category filter DTO
+ */
+export class CategoryFilterDto {
+  @ApiPropertyOptional({
+    enum: EnergyType,
+    description: 'Filter by energy type',
+  })
+  @IsEnum(EnergyType)
+  @IsOptional()
+  energyType?: EnergyType;
+
+  @ApiPropertyOptional({
+    enum: EnergySubType,
+    description: 'Filter by sub-type',
+  })
+  @IsEnum(EnergySubType)
+  @IsOptional()
+  subType?: EnergySubType;
+
+  @ApiPropertyOptional({
+    example: true,
+    description: 'Filter by renewable status',
+  })
+  @IsBoolean()
+  @IsOptional()
+  isRenewable?: boolean;
+
+  @ApiPropertyOptional({
+    example: true,
+    description: 'Filter by active status',
+  })
+  @IsBoolean()
+  @IsOptional()
+  isActive?: boolean;
+
+  @ApiPropertyOptional({
+    example: 'solar',
+    description: 'Search by name or description',
+  })
+  @IsString()
+  @IsOptional()
+  search?: string;
+
+  @ApiPropertyOptional({ description: 'Tags to filter by' })
+  @IsArray()
+  @IsString({ each: true })
+  @IsOptional()
+  tags?: string[];
+
+  @ApiPropertyOptional({ example: 1, description: 'Page number' })
+  @IsNumber()
+  @IsOptional()
+  @Min(1)
+  page?: number = 1;
+
+  @ApiPropertyOptional({ example: 10, description: 'Items per page' })
+  @IsNumber()
+  @IsOptional()
+  @Min(1)
+  @Max(100)
+  limit?: number = 10;
+}
+
+/**
+ * Category response DTO
+ */
+export class CategoryResponseDto {
+  @ApiProperty({ description: 'Category ID' })
+  id: string;
+
+  @ApiProperty({ enum: EnergyType, description: 'Energy type' })
+  energyType: EnergyType;
+
+  @ApiProperty({ description: 'Category name' })
+  name: string;
+
+  @ApiProperty({ description: 'Category description' })
+  description: string;
+
+  @ApiPropertyOptional({ enum: EnergySubType, description: 'Energy sub-type' })
+  subType: EnergySubType;
+
+  @ApiPropertyOptional({ description: 'Parent category ID' })
+  parentId: string;
+
+  @ApiProperty({ example: 1.25, description: 'Price multiplier' })
+  priceMultiplier: number;
+
+  @ApiProperty({ example: true, description: 'Is renewable' })
+  isRenewable: boolean;
+
+  @ApiProperty({ example: true, description: 'Is active' })
+  isActive: boolean;
+
+  @ApiProperty({ example: 1, description: 'Sort order' })
+  sortOrder: number;
+
+  @ApiProperty({ example: ['renewable', 'solar'], description: 'Tags' })
+  tags: string[];
+
+  @ApiPropertyOptional({ description: 'Additional metadata' })
+  metadata: Record<string, any>;
+
+  @ApiProperty({ description: 'Created at timestamp' })
+  createdAt: Date;
+
+  @ApiProperty({ description: 'Updated at timestamp' })
+  updatedAt: Date;
+}
+
+/**
+ * Category list response DTO
+ */
+export class CategoryListResponseDto {
+  @ApiProperty({ description: 'List of categories' })
+  categories: CategoryResponseDto[];
+
+  @ApiProperty({ description: 'Total count' })
+  total: number;
+
+  @ApiProperty({ example: 1, description: 'Current page' })
+  page: number;
+
+  @ApiProperty({ example: 10, description: 'Items per page' })
+  limit: number;
+
+  @ApiProperty({ example: 5, description: 'Total pages' })
+  totalPages: number;
+}
+
+/**
+ * Category tree DTO
+ */
+export class CategoryTreeDto {
+  @ApiProperty({ description: 'Category ID' })
+  id: string;
+
+  @ApiProperty({ enum: EnergyType, description: 'Energy type' })
+  energyType: EnergyType;
+
+  @ApiProperty({ description: 'Category name' })
+  name: string;
+
+  @ApiProperty({ example: 1.25, description: 'Price multiplier' })
+  priceMultiplier: number;
+
+  @ApiProperty({ example: true, description: 'Is renewable' })
+  isRenewable: boolean;
+
+  @ApiProperty({ description: 'Child categories' })
+  children: CategoryTreeDto[];
+}
+
+/**
+ * Calculate price DTO
+ */
+export class CalculatePriceDto {
+  @ApiProperty({ example: 100, description: 'Base price' })
+  @IsNumber()
+  @IsNotEmpty()
+  @Min(0)
+  basePrice: number;
+
+  @ApiProperty({ enum: EnergyType, description: 'Energy type' })
+  @IsEnum(EnergyType)
+  @IsNotEmpty()
+  energyType: EnergyType;
+
+  @ApiPropertyOptional({ enum: EnergyType, description: 'Quality rating' })
+  @IsOptional()
+  qualityMultiplier?: number;
+
+  @ApiPropertyOptional({ description: 'Certification multiplier' })
+  @IsOptional()
+  certificationMultiplier?: number;
+}
+
+/**
+ * Calculate price response DTO
+ */
+export class CalculatePriceResponseDto {
+  @ApiProperty({ example: 100, description: 'Base price' })
+  basePrice: number;
+
+  @ApiProperty({ example: 125, description: 'Adjusted price' })
+  adjustedPrice: number;
+
+  @ApiProperty({ example: 1.25, description: 'Total multiplier' })
+  totalMultiplier: number;
+
+  @ApiProperty({ description: 'Price breakdown' })
+  breakdown: {
+    categoryMultiplier: number;
+    qualityMultiplier: number;
+    certificationMultiplier: number;
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/dto/index.html b/coverage/lcov-report/src/classification/dto/index.html new file mode 100644 index 0000000..1daeadd --- /dev/null +++ b/coverage/lcov-report/src/classification/dto/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/classification/dto + + + + + + + + + +
+
+

All files src/classification/dto

+
+ +
+ 0% + Statements + 0/821 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/821 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
category.dto.ts +
+
0%0/2900%0/10%0/10%0/290
quality-rating.dto.ts +
+
0%0/5310%0/10%0/10%0/531
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/dto/quality-rating.dto.ts.html b/coverage/lcov-report/src/classification/dto/quality-rating.dto.ts.html new file mode 100644 index 0000000..faf0ad3 --- /dev/null +++ b/coverage/lcov-report/src/classification/dto/quality-rating.dto.ts.html @@ -0,0 +1,1678 @@ + + + + + + Code coverage report for src/classification/dto/quality-rating.dto.ts + + + + + + + + + +
+
+

All files / src/classification/dto quality-rating.dto.ts

+
+ +
+ 0% + Statements + 0/531 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/531 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Quality Rating DTOs
+ *
+ * Data Transfer Objects for energy quality rating operations.
+ */
+
+import {
+  IsString,
+  IsEnum,
+  IsNumber,
+  IsBoolean,
+  IsArray,
+  IsOptional,
+  IsUUID,
+  Min,
+  Max,
+  Length,
+  IsNotEmpty,
+  IsDateString,
+} from 'class-validator';
+import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
+import { QualityRating, QualityTier } from '../entities/energy-quality.entity';
+import {
+  CertificationType,
+  CertificationStatus,
+} from '../entities/certification.entity';
+import { CategoryResponseDto } from './category.dto';
+
+/**
+ * Create quality rating DTO
+ */
+export class CreateQualityRatingDto {
+  @ApiProperty({ enum: QualityRating, description: 'Quality rating' })
+  @IsEnum(QualityRating)
+  @IsNotEmpty()
+  rating: QualityRating;
+
+  @ApiProperty({ example: 'Premium Quality', description: 'Quality name' })
+  @IsString()
+  @IsNotEmpty()
+  @Length(1, 100)
+  name: string;
+
+  @ApiPropertyOptional({ description: 'Quality description' })
+  @IsString()
+  @IsOptional()
+  description?: string;
+
+  @ApiProperty({ enum: QualityTier, description: 'Quality tier' })
+  @IsEnum(QualityTier)
+  @IsNotEmpty()
+  tier: QualityTier;
+
+  @ApiProperty({ description: 'Category ID' })
+  @IsUUID()
+  @IsNotEmpty()
+  categoryId: string;
+
+  @ApiPropertyOptional({ example: 1.5, description: 'Price multiplier' })
+  @IsNumber()
+  @IsOptional()
+  @Min(0.1)
+  @Max(10)
+  priceMultiplier?: number;
+
+  @ApiProperty({ example: 95, description: 'Minimum efficiency percentage' })
+  @IsNumber()
+  @IsNotEmpty()
+  @Min(0)
+  @Max(100)
+  efficiencyMin: number;
+
+  @ApiProperty({ example: 100, description: 'Maximum efficiency percentage' })
+  @IsNumber()
+  @IsNotEmpty()
+  @Min(0)
+  @Max(100)
+  efficiencyMax: number;
+
+  @ApiPropertyOptional({
+    example: 99,
+    description: 'Minimum purity percentage',
+  })
+  @IsNumber()
+  @IsOptional()
+  @Min(0)
+  @Max(100)
+  minPurity?: number;
+
+  @ApiPropertyOptional({ example: true, description: 'Is verified' })
+  @IsBoolean()
+  @IsOptional()
+  isVerified?: boolean;
+
+  @ApiPropertyOptional({
+    example: 'ISO 50001',
+    description: 'Verification standard',
+  })
+  @IsString()
+  @IsOptional()
+  verificationStandard?: string;
+
+  @ApiPropertyOptional({ example: 1, description: 'Sort order' })
+  @IsNumber()
+  @IsOptional()
+  @Min(0)
+  @Max(999)
+  sortOrder?: number;
+
+  @ApiPropertyOptional({
+    example: ['premium', 'high-efficiency'],
+    description: 'Tags',
+  })
+  @IsArray()
+  @IsString({ each: true })
+  @IsOptional()
+  tags?: string[];
+
+  @ApiPropertyOptional({ description: 'Requirements' })
+  @IsOptional()
+  requirements?: Record<string, any>;
+}
+
+/**
+ * Update quality rating DTO
+ */
+export class UpdateQualityRatingDto extends PartialType(
+  CreateQualityRatingDto,
+) {
+  @ApiPropertyOptional({ example: true, description: 'Is active' })
+  @IsBoolean()
+  @IsOptional()
+  isActive?: boolean;
+}
+
+/**
+ * Quality rating filter DTO
+ */
+export class QualityRatingFilterDto {
+  @ApiPropertyOptional({ enum: QualityRating, description: 'Filter by rating' })
+  @IsEnum(QualityRating)
+  @IsOptional()
+  rating?: QualityRating;
+
+  @ApiPropertyOptional({ enum: QualityTier, description: 'Filter by tier' })
+  @IsEnum(QualityTier)
+  @IsOptional()
+  tier?: QualityTier;
+
+  @ApiPropertyOptional({ description: 'Filter by category ID' })
+  @IsUUID()
+  @IsOptional()
+  categoryId?: string;
+
+  @ApiPropertyOptional({
+    example: true,
+    description: 'Filter by verified status',
+  })
+  @IsBoolean()
+  @IsOptional()
+  isVerified?: boolean;
+
+  @ApiPropertyOptional({
+    example: true,
+    description: 'Filter by active status',
+  })
+  @IsBoolean()
+  @IsOptional()
+  isActive?: boolean;
+
+  @ApiPropertyOptional({
+    example: 'premium',
+    description: 'Search by name or description',
+  })
+  @IsString()
+  @IsOptional()
+  search?: string;
+
+  @ApiPropertyOptional({ example: 1, description: 'Page number' })
+  @IsNumber()
+  @IsOptional()
+  @Min(1)
+  page?: number = 1;
+
+  @ApiPropertyOptional({ example: 10, description: 'Items per page' })
+  @IsNumber()
+  @IsOptional()
+  @Min(1)
+  @Max(100)
+  limit?: number = 10;
+}
+
+/**
+ * Quality rating response DTO
+ */
+export class QualityRatingResponseDto {
+  @ApiProperty({ description: 'Quality ID' })
+  id: string;
+
+  @ApiProperty({ enum: QualityRating, description: 'Quality rating' })
+  rating: QualityRating;
+
+  @ApiProperty({ description: 'Quality name' })
+  name: string;
+
+  @ApiProperty({ description: 'Quality description' })
+  description: string;
+
+  @ApiProperty({ enum: QualityTier, description: 'Quality tier' })
+  tier: QualityTier;
+
+  @ApiProperty({ description: 'Category ID' })
+  categoryId: string;
+
+  @ApiProperty({ example: 1.5, description: 'Price multiplier' })
+  priceMultiplier: number;
+
+  @ApiProperty({ example: 95, description: 'Minimum efficiency' })
+  efficiencyMin: number;
+
+  @ApiProperty({ example: 100, description: 'Maximum efficiency' })
+  efficiencyMax: number;
+
+  @ApiPropertyOptional({ example: 99, description: 'Minimum purity' })
+  minPurity: number;
+
+  @ApiProperty({ example: true, description: 'Is verified' })
+  isVerified: boolean;
+
+  @ApiPropertyOptional({
+    example: 'ISO 50001',
+    description: 'Verification standard',
+  })
+  verificationStandard: string;
+
+  @ApiProperty({ example: true, description: 'Is active' })
+  isActive: boolean;
+
+  @ApiProperty({ example: 1, description: 'Sort order' })
+  sortOrder: number;
+
+  @ApiProperty({ example: ['premium'], description: 'Tags' })
+  tags: string[];
+
+  @ApiPropertyOptional({ description: 'Requirements' })
+  requirements: Record<string, any>;
+
+  @ApiProperty({ description: 'Created at' })
+  createdAt: Date;
+
+  @ApiProperty({ description: 'Updated at' })
+  updatedAt: Date;
+}
+
+/**
+ * Create certification DTO
+ */
+export class CreateCertificationDto {
+  @ApiProperty({ enum: CertificationType, description: 'Certification type' })
+  @IsEnum(CertificationType)
+  @IsNotEmpty()
+  type: CertificationType;
+
+  @ApiProperty({
+    example: 'Green Energy Certification',
+    description: 'Certification name',
+  })
+  @IsString()
+  @IsNotEmpty()
+  @Length(1, 150)
+  name: string;
+
+  @ApiPropertyOptional({ description: 'Certification description' })
+  @IsString()
+  @IsOptional()
+  description?: string;
+
+  @ApiPropertyOptional({ description: 'Category ID' })
+  @IsUUID()
+  @IsOptional()
+  categoryId?: string;
+
+  @ApiProperty({
+    example: 'Green Energy Standards Board',
+    description: 'Issuing authority',
+  })
+  @IsString()
+  @IsNotEmpty()
+  @Length(1, 150)
+  issuingAuthority: string;
+
+  @ApiProperty({ example: 'GEC-001', description: 'Certification code' })
+  @IsString()
+  @IsNotEmpty()
+  @Length(1, 100)
+  certificationCode: string;
+
+  @ApiProperty({ example: '2024-01-01', description: 'Valid from date' })
+  @IsDateString()
+  @IsNotEmpty()
+  validFrom: string;
+
+  @ApiPropertyOptional({
+    example: '2025-12-31',
+    description: 'Valid until date',
+  })
+  @IsDateString()
+  @IsOptional()
+  validUntil?: string;
+
+  @ApiPropertyOptional({ example: true, description: 'Is recurring' })
+  @IsBoolean()
+  @IsOptional()
+  isRecurring?: boolean;
+
+  @ApiPropertyOptional({ example: 365, description: 'Renewal period in days' })
+  @IsNumber()
+  @IsOptional()
+  @Min(1)
+  renewalPeriodDays?: number;
+
+  @ApiPropertyOptional({
+    example: 1.25,
+    description: 'Price adjustment multiplier',
+  })
+  @IsNumber()
+  @IsOptional()
+  @Min(0.1)
+  @Max(10)
+  priceAdjustment?: number;
+
+  @ApiPropertyOptional({ example: true, description: 'Is verified' })
+  @IsBoolean()
+  @IsOptional()
+  isVerified?: boolean;
+
+  @ApiPropertyOptional({
+    example: 'Third-party audit',
+    description: 'Verification method',
+  })
+  @IsString()
+  @IsOptional()
+  verificationMethod?: string;
+
+  @ApiPropertyOptional({
+    example: '/logos/green-energy.png',
+    description: 'Logo URL',
+  })
+  @IsString()
+  @IsOptional()
+  logoUrl?: string;
+
+  @ApiPropertyOptional({ example: ['green', 'renewable'], description: 'Tags' })
+  @IsArray()
+  @IsString({ each: true })
+  @IsOptional()
+  tags?: string[];
+
+  @ApiPropertyOptional({ description: 'Requirements' })
+  @IsOptional()
+  requirements?: Record<string, any>;
+}
+
+/**
+ * Update certification DTO
+ */
+export class UpdateCertificationDto extends PartialType(
+  CreateCertificationDto,
+) {
+  @ApiPropertyOptional({
+    enum: CertificationStatus,
+    description: 'Certification status',
+  })
+  @IsEnum(CertificationStatus)
+  @IsOptional()
+  status?: CertificationStatus;
+}
+
+/**
+ * Certification filter DTO
+ */
+export class CertificationFilterDto {
+  @ApiPropertyOptional({
+    enum: CertificationType,
+    description: 'Filter by type',
+  })
+  @IsEnum(CertificationType)
+  @IsOptional()
+  type?: CertificationType;
+
+  @ApiPropertyOptional({
+    enum: CertificationStatus,
+    description: 'Filter by status',
+  })
+  @IsEnum(CertificationStatus)
+  @IsOptional()
+  status?: CertificationStatus;
+
+  @ApiPropertyOptional({ description: 'Filter by category ID' })
+  @IsUUID()
+  @IsOptional()
+  categoryId?: string;
+
+  @ApiPropertyOptional({
+    example: true,
+    description: 'Filter by verified status',
+  })
+  @IsBoolean()
+  @IsOptional()
+  isVerified?: boolean;
+
+  @ApiPropertyOptional({
+    example: 'green',
+    description: 'Search by name or description',
+  })
+  @IsString()
+  @IsOptional()
+  search?: string;
+
+  @ApiPropertyOptional({
+    example: true,
+    description: 'Filter only valid certifications',
+  })
+  @IsBoolean()
+  @IsOptional()
+  validOnly?: boolean;
+
+  @ApiPropertyOptional({ example: 1, description: 'Page number' })
+  @IsNumber()
+  @IsOptional()
+  @Min(1)
+  page?: number = 1;
+
+  @ApiPropertyOptional({ example: 10, description: 'Items per page' })
+  @IsNumber()
+  @IsOptional()
+  @Min(1)
+  @Max(100)
+  limit?: number = 10;
+}
+
+/**
+ * Certification response DTO
+ */
+export class CertificationResponseDto {
+  @ApiProperty({ description: 'Certification ID' })
+  id: string;
+
+  @ApiProperty({ enum: CertificationType, description: 'Certification type' })
+  type: CertificationType;
+
+  @ApiProperty({ description: 'Certification name' })
+  name: string;
+
+  @ApiProperty({ description: 'Certification description' })
+  description: string;
+
+  @ApiPropertyOptional({ description: 'Category ID' })
+  categoryId: string;
+
+  @ApiProperty({ description: 'Issuing authority' })
+  issuingAuthority: string;
+
+  @ApiProperty({ description: 'Certification code' })
+  certificationCode: string;
+
+  @ApiProperty({
+    enum: CertificationStatus,
+    description: 'Certification status',
+  })
+  status: CertificationStatus;
+
+  @ApiProperty({ description: 'Valid from' })
+  validFrom: Date;
+
+  @ApiPropertyOptional({ description: 'Valid until' })
+  validUntil: Date;
+
+  @ApiProperty({ example: true, description: 'Is recurring' })
+  isRecurring: boolean;
+
+  @ApiPropertyOptional({ example: 365, description: 'Renewal period in days' })
+  renewalPeriodDays: number;
+
+  @ApiProperty({ example: 1.25, description: 'Price adjustment' })
+  priceAdjustment: number;
+
+  @ApiProperty({ example: true, description: 'Is verified' })
+  isVerified: boolean;
+
+  @ApiPropertyOptional({
+    example: 'Third-party audit',
+    description: 'Verification method',
+  })
+  verificationMethod: string;
+
+  @ApiPropertyOptional({
+    example: '/logos/green-energy.png',
+    description: 'Logo URL',
+  })
+  logoUrl: string;
+
+  @ApiProperty({ example: ['green', 'renewable'], description: 'Tags' })
+  tags: string[];
+
+  @ApiPropertyOptional({ description: 'Requirements' })
+  requirements: Record<string, any>;
+
+  @ApiProperty({ description: 'Created at' })
+  createdAt: Date;
+
+  @ApiProperty({ description: 'Updated at' })
+  updatedAt: Date;
+}
+
+/**
+ * Combined classification response DTO
+ */
+export class ClassificationResponseDto {
+  @ApiProperty({ description: 'Category information' })
+  category: CategoryResponseDto;
+
+  @ApiProperty({ description: 'Quality rating information' })
+  quality: QualityRatingResponseDto;
+
+  @ApiProperty({ description: 'Applicable certifications' })
+  certifications: CertificationResponseDto[];
+
+  @ApiProperty({ example: 1.5, description: 'Total price multiplier' })
+  totalMultiplier: number;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/entities/certification.entity.ts.html b/coverage/lcov-report/src/classification/entities/certification.entity.ts.html new file mode 100644 index 0000000..2c35761 --- /dev/null +++ b/coverage/lcov-report/src/classification/entities/certification.entity.ts.html @@ -0,0 +1,910 @@ + + + + + + Code coverage report for src/classification/entities/certification.entity.ts + + + + + + + + + +
+
+

All files / src/classification/entities certification.entity.ts

+
+ +
+ 0% + Statements + 0/275 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/275 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Certification Entity
+ *
+ * Defines certifications for energy sources (Green Energy, Carbon Neutral, etc.).
+ */
+
+import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  ManyToOne,
+  JoinColumn,
+} from 'typeorm';
+import { EnergyCategory } from './energy-category.entity';
+
+/**
+ * Certification type enumeration
+ */
+export enum CertificationType {
+  GREEN_ENERGY = 'green_energy',
+  CARBON_NEUTRAL = 'carbon_neutral',
+  ORGANIC = 'organic',
+  FAIR_TRADE = 'fair_trade',
+  RENEWABLE_ENERGY = 'renewable_energy',
+  LOW_CARBON = 'low_carbon',
+  SUSTAINABLE = 'sustainable',
+  ECO_FRIENDLY = 'eco_friendly',
+}
+
+/**
+ * Certification status
+ */
+export enum CertificationStatus {
+  ACTIVE = 'active',
+  PENDING = 'pending',
+  EXPIRED = 'expired',
+  REVOKED = 'revoked',
+}
+
+/**
+ * Certification entity
+ */
+@Entity('certifications')
+export class Certification {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({
+    type: 'enum',
+    enum: CertificationType,
+    unique: true,
+  })
+  type: CertificationType;
+
+  @Column({ length: 150 })
+  name: string;
+
+  @Column({ type: 'text', nullable: true })
+  description: string;
+
+  @Column({ name: 'category_id', nullable: true })
+  categoryId: string;
+
+  @ManyToOne(() => EnergyCategory, (category) => category.certifications, {
+    nullable: true,
+    onDelete: 'SET NULL',
+  })
+  @JoinColumn({ name: 'category_id' })
+  category: EnergyCategory;
+
+  @Column({ name: 'issuing_authority', length: 150 })
+  issuingAuthority: string;
+
+  @Column({ name: 'certification_code', length: 100, unique: true })
+  certificationCode: string;
+
+  @Column({
+    type: 'enum',
+    enum: CertificationStatus,
+    default: CertificationStatus.ACTIVE,
+  })
+  status: CertificationStatus;
+
+  @Column({ name: 'valid_from', type: 'timestamp' })
+  validFrom: Date;
+
+  @Column({ name: 'valid_until', type: 'timestamp', nullable: true })
+  validUntil: Date;
+
+  @Column({ name: 'is_recurring', default: false })
+  isRecurring: boolean;
+
+  @Column({ name: 'renewal_period_days', nullable: true })
+  renewalPeriodDays: number;
+
+  @Column({
+    name: 'price_adjustment',
+    type: 'decimal',
+    precision: 5,
+    scale: 2,
+    default: 1.0,
+  })
+  priceAdjustment: number;
+
+  @Column({ name: 'is_verified', default: false })
+  isVerified: boolean;
+
+  @Column({ name: 'verification_method', nullable: true })
+  verificationMethod: string;
+
+  @Column({ name: 'logo_url', nullable: true })
+  logoUrl: string;
+
+  @Column({ type: 'simple-array', nullable: true })
+  tags: string[];
+
+  @Column({ type: 'jsonb', nullable: true })
+  requirements: Record<string, any>;
+
+  @Column({ type: 'jsonb', nullable: true })
+  metadata: Record<string, any>;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+}
+
+/**
+ * Default certifications
+ */
+export const DEFAULT_CERTIFICATIONS = [
+  {
+    type: CertificationType.GREEN_ENERGY,
+    name: 'Green Energy Certification',
+    description:
+      'Certifies that energy is generated from renewable sources with minimal environmental impact',
+    issuingAuthority: 'Green Energy Standards Board',
+    certificationCode: 'GEC-001',
+    status: CertificationStatus.ACTIVE,
+    priceAdjustment: 1.25,
+    isVerified: true,
+    verificationMethod: 'Third-party audit',
+    tags: ['green', 'renewable', 'eco-friendly'],
+    requirements: {
+      renewablePercentage: 100,
+      emissionThreshold: 0,
+      auditFrequency: 'annual',
+    },
+  },
+  {
+    type: CertificationType.CARBON_NEUTRAL,
+    name: 'Carbon Neutral Certification',
+    description:
+      'Certifies that net carbon emissions are zero through offset programs',
+    issuingAuthority: 'Carbon Neutral Alliance',
+    certificationCode: 'CNC-001',
+    status: CertificationStatus.ACTIVE,
+    priceAdjustment: 1.15,
+    isVerified: true,
+    verificationMethod: 'Carbon accounting',
+    tags: ['carbon-neutral', 'offset', 'climate'],
+    requirements: {
+      carbonOffsetRequired: true,
+      netEmissions: 0,
+      offsetVerification: 'required',
+    },
+  },
+  {
+    type: CertificationType.RENEWABLE_ENERGY,
+    name: 'Renewable Energy Certification',
+    description:
+      'Certifies that energy is sourced entirely from renewable sources',
+    issuingAuthority: 'International Renewable Energy Agency',
+    certificationCode: 'REC-001',
+    status: CertificationStatus.ACTIVE,
+    priceAdjustment: 1.2,
+    isVerified: true,
+    verificationMethod: 'Source verification',
+    tags: ['renewable', 'clean', 'sustainable'],
+    requirements: {
+      renewablePercentage: 100,
+      sourceVerification: 'required',
+    },
+  },
+  {
+    type: CertificationType.LOW_CARBON,
+    name: 'Low Carbon Certification',
+    description: 'Certifies energy with reduced carbon footprint',
+    issuingAuthority: 'Climate Action Network',
+    certificationCode: 'LCC-001',
+    status: CertificationStatus.ACTIVE,
+    priceAdjustment: 1.1,
+    isVerified: true,
+    verificationMethod: 'Carbon intensity analysis',
+    tags: ['low-carbon', 'reduced-emissions'],
+    requirements: {
+      maxCarbonIntensity: 50,
+      emissionReductionTarget: 50,
+    },
+  },
+  {
+    type: CertificationType.SUSTAINABLE,
+    name: 'Sustainable Energy Certification',
+    description: 'Certifies energy production meets sustainability standards',
+    issuingAuthority: 'Sustainable Energy Council',
+    certificationCode: 'SEC-001',
+    status: CertificationStatus.ACTIVE,
+    priceAdjustment: 1.15,
+    isVerified: true,
+    verificationMethod: 'Sustainability assessment',
+    tags: ['sustainable', 'responsible', 'green'],
+    requirements: {
+      sustainabilityScore: 80,
+      environmentalImpact: 'low',
+    },
+  },
+];
+
+/**
+ * Helper function to check if certification is valid
+ */
+export const isCertificationValid = (certification: Certification): boolean => {
+  if (certification.status !== CertificationStatus.ACTIVE) {
+    return false;
+  }
+
+  const now = new Date();
+
+  if (certification.validUntil) {
+    return now >= certification.validFrom && now <= certification.validUntil;
+  }
+
+  return now >= certification.validFrom;
+};
+
+/**
+ * Helper function to check if certification needs renewal
+ */
+export const needsRenewal = (certification: Certification): boolean => {
+  if (!certification.isRecurring || !certification.renewalPeriodDays) {
+    return false;
+  }
+
+  if (!certification.validUntil) {
+    return false;
+  }
+
+  const daysUntilExpiry = Math.ceil(
+    (certification.validUntil.getTime() - Date.now()) / (1000 * 60 * 60 * 24),
+  );
+
+  return daysUntilExpiry <= 30;
+};
+
+/**
+ * Helper function to calculate price with certification
+ */
+export const calculatePriceWithCertification = (
+  basePrice: number,
+  certifications: Certification[],
+): number => {
+  let multiplier = 1.0;
+
+  for (const cert of certifications) {
+    if (isCertificationValid(cert)) {
+      multiplier *= Number(cert.priceAdjustment);
+    }
+  }
+
+  return basePrice * multiplier;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/entities/energy-category.entity.ts.html b/coverage/lcov-report/src/classification/entities/energy-category.entity.ts.html new file mode 100644 index 0000000..9546456 --- /dev/null +++ b/coverage/lcov-report/src/classification/entities/energy-category.entity.ts.html @@ -0,0 +1,829 @@ + + + + + + Code coverage report for src/classification/entities/energy-category.entity.ts + + + + + + + + + +
+
+

All files / src/classification/entities energy-category.entity.ts

+
+ +
+ 0% + Statements + 0/248 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/248 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Energy Category Entity
+ *
+ * Defines the taxonomy for different energy types with hierarchical classification.
+ */
+
+import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  OneToMany,
+  ManyToOne,
+  JoinColumn,
+} from 'typeorm';
+import { EnergyQuality } from './energy-quality.entity';
+import { Certification } from './certification.entity';
+
+/**
+ * Energy type enumeration
+ */
+export enum EnergyType {
+  SOLAR = 'solar',
+  WIND = 'wind',
+  HYDRO = 'hydro',
+  GEOTHERMAL = 'geothermal',
+  BIOMASS = 'biomass',
+  NATURAL_GAS = 'natural_gas',
+  COAL = 'coal',
+  NUCLEAR = 'nuclear',
+  OIL = 'oil',
+}
+
+/**
+ * Energy sub-type enumeration
+ */
+export enum EnergySubType {
+  // Solar subtypes
+  PHOTOVOLTAIC = 'photovoltaic',
+  CONCENTRATED_SOLAR = 'concentrated_solar',
+  SOLAR_THERMAL = 'solar_thermal',
+
+  // Wind subtypes
+  ONSHORE_WIND = 'onshore_wind',
+  OFFSHORE_WIND = 'offshore_wind',
+
+  // Hydro subtypes
+  RUN_OF_RIVER = 'run_of_river',
+  RESERVOIR = 'reservoir',
+  PUMPED_STORAGE = 'pumped_storage',
+
+  // Biomass subtypes
+  SOLID_BIOMASS = 'solid_biomass',
+  LIQUID_BIOMASS = 'liquid_biomass',
+  BIOGAS = 'biogas',
+}
+
+/**
+ * Energy category entity
+ */
+@Entity('energy_categories')
+export class EnergyCategory {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({
+    type: 'enum',
+    enum: EnergyType,
+    unique: true,
+  })
+  energyType: EnergyType;
+
+  @Column({ length: 100 })
+  name: string;
+
+  @Column({ type: 'text', nullable: true })
+  description: string;
+
+  @Column({
+    type: 'enum',
+    enum: EnergySubType,
+    nullable: true,
+  })
+  subType: EnergySubType;
+
+  @Column({ name: 'parent_id', nullable: true })
+  parentId: string;
+
+  @ManyToOne(() => EnergyCategory, (category) => category.children, {
+    nullable: true,
+  })
+  @JoinColumn({ name: 'parent_id' })
+  parent: EnergyCategory;
+
+  @OneToMany(() => EnergyCategory, (category) => category.parent)
+  children: EnergyCategory[];
+
+  @Column({ type: 'decimal', precision: 5, scale: 2, default: 1.0 })
+  priceMultiplier: number;
+
+  @Column({ name: 'is_renewable', default: false })
+  isRenewable: boolean;
+
+  @Column({ name: 'is_active', default: true })
+  isActive: boolean;
+
+  @Column({ type: 'int', default: 0 })
+  sortOrder: number;
+
+  @Column({ type: 'simple-array', nullable: true })
+  tags: string[];
+
+  @Column({ type: 'jsonb', nullable: true })
+  metadata: Record<string, any>;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+
+  // Relationships
+  @OneToMany(() => EnergyQuality, (quality) => quality.category)
+  qualities: EnergyQuality[];
+
+  @OneToMany(() => Certification, (certification) => certification.category)
+  certifications: Certification[];
+}
+
+/**
+ * Default energy categories to seed
+ */
+export const DEFAULT_ENERGY_CATEGORIES = [
+  {
+    energyType: EnergyType.SOLAR,
+    name: 'Solar Energy',
+    description:
+      'Energy derived from sunlight through photovoltaic or thermal means',
+    subType: null,
+    priceMultiplier: 1.25,
+    isRenewable: true,
+    sortOrder: 1,
+    tags: ['renewable', 'solar', 'clean'],
+  },
+  {
+    energyType: EnergyType.WIND,
+    name: 'Wind Energy',
+    description: 'Energy derived from wind using turbines',
+    subType: null,
+    priceMultiplier: 1.15,
+    isRenewable: true,
+    sortOrder: 2,
+    tags: ['renewable', 'wind', 'clean'],
+  },
+  {
+    energyType: EnergyType.HYDRO,
+    name: 'Hydro Energy',
+    description: 'Energy derived from water flow through hydroelectric plants',
+    subType: null,
+    priceMultiplier: 1.1,
+    isRenewable: true,
+    sortOrder: 3,
+    tags: ['renewable', 'hydro', 'clean'],
+  },
+  {
+    energyType: EnergyType.GEOTHERMAL,
+    name: 'Geothermal Energy',
+    description: "Energy derived from heat stored beneath the Earth's surface",
+    subType: null,
+    priceMultiplier: 1.2,
+    isRenewable: true,
+    sortOrder: 4,
+    tags: ['renewable', 'geothermal', 'clean'],
+  },
+  {
+    energyType: EnergyType.BIOMASS,
+    name: 'Biomass Energy',
+    description: 'Energy derived from organic materials',
+    subType: null,
+    priceMultiplier: 1.0,
+    isRenewable: true,
+    sortOrder: 5,
+    tags: ['renewable', 'biomass', 'organic'],
+  },
+  {
+    energyType: EnergyType.NATURAL_GAS,
+    name: 'Natural Gas',
+    description: 'Fossil fuel derived from underground deposits',
+    subType: null,
+    priceMultiplier: 0.95,
+    isRenewable: false,
+    sortOrder: 6,
+    tags: ['fossil', 'gas', 'non-renewable'],
+  },
+  {
+    energyType: EnergyType.COAL,
+    name: 'Coal',
+    description: 'Fossil fuel derived from ancient plant material',
+    subType: null,
+    priceMultiplier: 0.85,
+    isRenewable: false,
+    sortOrder: 7,
+    tags: ['fossil', 'coal', 'non-renewable'],
+  },
+  {
+    energyType: EnergyType.NUCLEAR,
+    name: 'Nuclear Energy',
+    description: 'Energy derived from nuclear fission',
+    subType: null,
+    priceMultiplier: 0.9,
+    isRenewable: false,
+    sortOrder: 8,
+    tags: ['nuclear', 'atomic', 'low-carbon'],
+  },
+];
+
+/**
+ * Helper function to check if energy type is renewable
+ */
+export const isRenewableEnergy = (energyType: EnergyType): boolean => {
+  return [
+    EnergyType.SOLAR,
+    EnergyType.WIND,
+    EnergyType.HYDRO,
+    EnergyType.GEOTHERMAL,
+    EnergyType.BIOMASS,
+  ].includes(energyType);
+};
+
+/**
+ * Helper function to get price multiplier
+ */
+export const getPriceMultiplier = (energyType: EnergyType): number => {
+  const multiplierMap: Record<EnergyType, number> = {
+    [EnergyType.SOLAR]: 1.25,
+    [EnergyType.WIND]: 1.15,
+    [EnergyType.HYDRO]: 1.1,
+    [EnergyType.GEOTHERMAL]: 1.2,
+    [EnergyType.BIOMASS]: 1.0,
+    [EnergyType.NATURAL_GAS]: 0.95,
+    [EnergyType.COAL]: 0.85,
+    [EnergyType.NUCLEAR]: 0.9,
+    [EnergyType.OIL]: 0.8,
+  };
+
+  return multiplierMap[energyType] || 1.0;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/entities/energy-quality.entity.ts.html b/coverage/lcov-report/src/classification/entities/energy-quality.entity.ts.html new file mode 100644 index 0000000..91045d4 --- /dev/null +++ b/coverage/lcov-report/src/classification/entities/energy-quality.entity.ts.html @@ -0,0 +1,736 @@ + + + + + + Code coverage report for src/classification/entities/energy-quality.entity.ts + + + + + + + + + +
+
+

All files / src/classification/entities energy-quality.entity.ts

+
+ +
+ 0% + Statements + 0/217 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/217 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Energy Quality Entity
+ *
+ * Defines quality ratings for different energy sources.
+ */
+
+import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  ManyToOne,
+  JoinColumn,
+  OneToMany,
+} from 'typeorm';
+import { EnergyCategory } from './energy-category.entity';
+
+/**
+ * Quality rating enumeration
+ */
+export enum QualityRating {
+  PREMIUM = 'premium',
+  STANDARD = 'standard',
+  BASIC = 'basic',
+}
+
+/**
+ * Quality tier for display
+ */
+export enum QualityTier {
+  A = 'A',
+  B = 'B',
+  C = 'C',
+  D = 'D',
+}
+
+/**
+ * Energy quality entity
+ */
+@Entity('energy_qualities')
+export class EnergyQuality {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({
+    type: 'enum',
+    enum: QualityRating,
+    unique: true,
+  })
+  rating: QualityRating;
+
+  @Column({ length: 100 })
+  name: string;
+
+  @Column({ type: 'text', nullable: true })
+  description: string;
+
+  @Column({
+    type: 'enum',
+    enum: QualityTier,
+  })
+  tier: QualityTier;
+
+  @Column({ name: 'category_id' })
+  categoryId: string;
+
+  @ManyToOne(() => EnergyCategory, (category) => category.qualities, {
+    onDelete: 'CASCADE',
+  })
+  @JoinColumn({ name: 'category_id' })
+  category: EnergyCategory;
+
+  @Column({ type: 'decimal', precision: 5, scale: 2, default: 1.0 })
+  priceMultiplier: number;
+
+  @Column({ name: 'efficiency_min', type: 'decimal', precision: 5, scale: 2 })
+  efficiencyMin: number;
+
+  @Column({ name: 'efficiency_max', type: 'decimal', precision: 5, scale: 2 })
+  efficiencyMax: number;
+
+  @Column({
+    name: 'min_purity',
+    type: 'decimal',
+    precision: 5,
+    scale: 2,
+    nullable: true,
+  })
+  minPurity: number;
+
+  @Column({ name: 'is_verified', default: false })
+  isVerified: boolean;
+
+  @Column({ name: 'verification_standard', nullable: true })
+  verificationStandard: string;
+
+  @Column({ name: 'is_active', default: true })
+  isActive: boolean;
+
+  @Column({ type: 'int', default: 0 })
+  sortOrder: number;
+
+  @Column({ type: 'simple-array', nullable: true })
+  tags: string[];
+
+  @Column({ type: 'jsonb', nullable: true })
+  requirements: Record<string, any>;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+}
+
+/**
+ * Default quality ratings
+ */
+export const DEFAULT_QUALITY_RATINGS = [
+  {
+    rating: QualityRating.PREMIUM,
+    name: 'Premium Quality',
+    description: 'Highest quality energy with maximum efficiency and purity',
+    tier: QualityTier.A,
+    priceMultiplier: 1.5,
+    efficiencyMin: 95,
+    efficiencyMax: 100,
+    minPurity: 99,
+    isVerified: true,
+    verificationStandard: 'ISO 50001',
+    sortOrder: 1,
+    tags: ['premium', 'high-efficiency', 'verified'],
+    requirements: {
+      minEfficiency: 95,
+      requiresCertification: true,
+      inspectionFrequency: 'monthly',
+    },
+  },
+  {
+    rating: QualityRating.STANDARD,
+    name: 'Standard Quality',
+    description: 'Good quality energy with standard efficiency levels',
+    tier: QualityTier.B,
+    priceMultiplier: 1.0,
+    efficiencyMin: 80,
+    efficiencyMax: 94,
+    minPurity: 95,
+    isVerified: true,
+    verificationStandard: 'ISO 50001',
+    sortOrder: 2,
+    tags: ['standard', 'medium-efficiency', 'verified'],
+    requirements: {
+      minEfficiency: 80,
+      requiresCertification: true,
+      inspectionFrequency: 'quarterly',
+    },
+  },
+  {
+    rating: QualityRating.BASIC,
+    name: 'Basic Quality',
+    description: 'Entry-level energy with minimum acceptable standards',
+    tier: QualityTier.C,
+    priceMultiplier: 0.75,
+    efficiencyMin: 60,
+    efficiencyMax: 79,
+    minPurity: 90,
+    isVerified: false,
+    verificationStandard: null,
+    sortOrder: 3,
+    tags: ['basic', 'low-efficiency'],
+    requirements: {
+      minEfficiency: 60,
+      requiresCertification: false,
+      inspectionFrequency: 'annually',
+    },
+  },
+];
+
+/**
+ * Helper function to get quality by rating
+ */
+export const getQualityByRating = (
+  rating: QualityRating,
+): (typeof DEFAULT_QUALITY_RATINGS)[0] | undefined => {
+  return DEFAULT_QUALITY_RATINGS.find((q) => q.rating === rating);
+};
+
+/**
+ * Helper function to calculate adjusted price
+ */
+export const calculateAdjustedPrice = (
+  basePrice: number,
+  qualityRating: QualityRating,
+): number => {
+  const quality = getQualityByRating(qualityRating);
+  if (!quality) return basePrice;
+
+  return basePrice * Number(quality.priceMultiplier);
+};
+
+/**
+ * Helper function to check if quality meets minimum requirements
+ */
+export const meetsQualityRequirements = (
+  efficiency: number,
+  purity: number,
+  rating: QualityRating,
+): boolean => {
+  const quality = getQualityByRating(rating);
+  if (!quality) return false;
+
+  return (
+    efficiency >= quality.efficiencyMin &&
+    (quality.minPurity === null || purity >= quality.minPurity)
+  );
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/entities/index.html b/coverage/lcov-report/src/classification/entities/index.html new file mode 100644 index 0000000..e217d73 --- /dev/null +++ b/coverage/lcov-report/src/classification/entities/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/classification/entities + + + + + + + + + +
+
+

All files src/classification/entities

+
+ +
+ 0% + Statements + 0/740 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/740 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
certification.entity.ts +
+
0%0/2750%0/10%0/10%0/275
energy-category.entity.ts +
+
0%0/2480%0/10%0/10%0/248
energy-quality.entity.ts +
+
0%0/2170%0/10%0/10%0/217
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/classification/index.html b/coverage/lcov-report/src/classification/index.html new file mode 100644 index 0000000..cd9e7f4 --- /dev/null +++ b/coverage/lcov-report/src/classification/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/classification + + + + + + + + + +
+
+

All files src/classification

+
+ +
+ 0% + Statements + 0/693 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/693 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
classification.module.ts +
+
0%0/210%0/10%0/10%0/21
classification.service.ts +
+
0%0/6720%0/10%0/10%0/672
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/decorators/api-version.decorator.ts.html b/coverage/lcov-report/src/common/decorators/api-version.decorator.ts.html new file mode 100644 index 0000000..b994aed --- /dev/null +++ b/coverage/lcov-report/src/common/decorators/api-version.decorator.ts.html @@ -0,0 +1,385 @@ + + + + + + Code coverage report for src/common/decorators/api-version.decorator.ts + + + + + + + + + +
+
+

All files / src/common/decorators api-version.decorator.ts

+
+ +
+ 0% + Statements + 0/100 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/100 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * API Version Decorator
+ *
+ * Decorator to set API version on endpoints and mark deprecated versions.
+ */
+
+import { SetMetadata } from '@nestjs/common';
+import {
+  ApiVersionMetadata,
+  DEFAULT_API_VERSION,
+} from '../interfaces/response.interface';
+
+/**
+ * Metadata key for API version
+ */
+export const API_VERSION_KEY = 'api_version';
+
+/**
+ * Decorator options
+ */
+export interface ApiVersionOptions {
+  /** API version (e.g., '1.0', '2.0') */
+  version: string;
+  /** Whether this endpoint is deprecated */
+  deprecated?: boolean;
+  /** Deprecation message */
+  deprecationMessage?: string;
+}
+
+/**
+ * Set API version on endpoint
+ *
+ * @example
+ * ```typescript
+ * @Controller('users')
+ * @ApiVersion({ version: '1.0' })
+ * export class UsersController {}
+ *
+ * @Get()
+ * @ApiVersion({ version: '1.0' })
+ * findAll() {}
+ * ```
+ */
+export const ApiVersion = (options: ApiVersionOptions) => {
+  const metadata: ApiVersionMetadata = {
+    version: options.version || DEFAULT_API_VERSION,
+    deprecated: options.deprecated || false,
+    deprecationMessage: options.deprecationMessage,
+  };
+  return SetMetadata(API_VERSION_KEY, metadata);
+};
+
+/**
+ * Mark endpoint as deprecated
+ *
+ * @example
+ * @Get('old-endpoint')
+ * @Deprecated({ deprecationMessage: 'Use /v2/users instead' })
+ * oldEndpoint() {}
+ */
+export const Deprecated = (options?: { deprecationMessage?: string }) => {
+  return SetMetadata(API_VERSION_KEY, {
+    version: DEFAULT_API_VERSION,
+    deprecated: true,
+    deprecationMessage:
+      options?.deprecationMessage || 'This endpoint is deprecated',
+  } as ApiVersionMetadata);
+};
+
+/**
+ * Get API version from request
+ * Can be used in interceptors/filters to get version from request
+ */
+export const getApiVersion = (target: any): string => {
+  return (
+    Reflect.getMetadata(API_VERSION_KEY, target) ||
+    Reflect.getMetadata(API_VERSION_KEY, target.constructor) ||
+    DEFAULT_API_VERSION
+  );
+};
+
+/**
+ * Check if endpoint is deprecated
+ */
+export const isDeprecated = (target: any): boolean => {
+  const metadata =
+    Reflect.getMetadata(API_VERSION_KEY, target) ||
+    Reflect.getMetadata(API_VERSION_KEY, target.constructor);
+  return metadata?.deprecated || false;
+};
+
+/**
+ * Get deprecation message
+ */
+export const getDeprecationMessage = (target: any): string | undefined => {
+  const metadata =
+    Reflect.getMetadata(API_VERSION_KEY, target) ||
+    Reflect.getMetadata(API_VERSION_KEY, target.constructor);
+  return metadata?.deprecationMessage;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/decorators/index.html b/coverage/lcov-report/src/common/decorators/index.html new file mode 100644 index 0000000..1aa91e0 --- /dev/null +++ b/coverage/lcov-report/src/common/decorators/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/common/decorators + + + + + + + + + +
+
+

All files src/common/decorators

+
+ +
+ 0% + Statements + 0/423 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/423 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
api-version.decorator.ts +
+
0%0/1000%0/10%0/10%0/100
scope.decorator.ts +
+
0%0/3230%0/10%0/10%0/323
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/decorators/scope.decorator.ts.html b/coverage/lcov-report/src/common/decorators/scope.decorator.ts.html new file mode 100644 index 0000000..a872d43 --- /dev/null +++ b/coverage/lcov-report/src/common/decorators/scope.decorator.ts.html @@ -0,0 +1,1054 @@ + + + + + + Code coverage report for src/common/decorators/scope.decorator.ts + + + + + + + + + +
+
+

All files / src/common/decorators scope.decorator.ts

+
+ +
+ 0% + Statements + 0/323 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/323 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Scope Decorator
+ *
+ * Decorators for defining provider scope and lifecycle in NestJS DI.
+ * Supports singleton, request-scoped, and transient providers.
+ */
+
+import { SetMetadata, Scope as NestScope, Injectable } from '@nestjs/common';
+import { Scope } from '@nestjs/common/enums/scope.enum';
+
+/**
+ * Scope type enum
+ */
+export enum ScopeType {
+  /** Single instance for entire application */
+  DEFAULT = 'default',
+  /** New instance per request */
+  REQUEST = 'request',
+  /** New instance per injection */
+  TRANSIENT = 'transient',
+}
+
+/**
+ * Metadata keys
+ */
+export const SCOPE_KEY = 'scope';
+export const CACHE_KEY = 'cache';
+export const CACHE_TTL_KEY = 'cache_ttl';
+
+/**
+ * Set provider scope
+ *
+ * @example
+ * ```typescript
+ * @Injectable({ scope: Scope.DEFAULT })
+ * export class MyService {}
+ *
+ * @Injectable({ scope: Scope.REQUEST })
+ * export class RequestScopedService {}
+ * ```
+ */
+export const SetScope = (scope: Scope | ScopeType) => {
+  return SetMetadata(SCOPE_KEY, scope);
+};
+
+/**
+ * Mark service as singleton (default)
+ *
+ * @example
+ * @Singleton()
+ * export class MySingletonService {}
+ */
+export const Singleton = (): ClassDecorator & MethodDecorator => {
+  return (
+    target: any,
+    key?: string | symbol,
+    descriptor?: PropertyDescriptor,
+  ) => {
+    SetScope(Scope.DEFAULT)(target, key, descriptor);
+    Injectable()(target);
+    return descriptor || target;
+  };
+};
+
+/**
+ * Mark service as request-scoped
+ *
+ * @example
+ * @RequestScoped()
+ * export class RequestService {}
+ */
+export const RequestScoped = (): ClassDecorator & MethodDecorator => {
+  return (
+    target: any,
+    key?: string | symbol,
+    descriptor?: PropertyDescriptor,
+  ) => {
+    SetScope(Scope.REQUEST)(target, key, descriptor);
+    Injectable({ scope: Scope.REQUEST })(target);
+    return descriptor || target;
+  };
+};
+
+/**
+ * Mark service as transient
+ *
+ * @example
+ * @Transient()
+ * export class TransientService {}
+ */
+export const Transient = (): ClassDecorator & MethodDecorator => {
+  return (
+    target: any,
+    key?: string | symbol,
+    descriptor?: PropertyDescriptor,
+  ) => {
+    SetScope(Scope.TRANSIENT)(target, key, descriptor);
+    Injectable({ scope: Scope.TRANSIENT })(target);
+    return descriptor || target;
+  };
+};
+
+/**
+ * Mark service as cacheable
+ *
+ * @example
+ * @Cacheable({ ttl: 60000 })
+ * async getData() {}
+ */
+export interface CacheableOptions {
+  /** Time to live in milliseconds */
+  ttl?: number;
+  /** Cache key prefix */
+  prefix?: string;
+  /** Whether to cache null values */
+  cacheNull?: boolean;
+}
+
+export const Cacheable = (options?: CacheableOptions): MethodDecorator => {
+  return (
+    target: any,
+    key: string | symbol,
+    descriptor: PropertyDescriptor,
+  ) => {
+    SetMetadata(CACHE_KEY, true)(target, key, descriptor);
+    if (options?.ttl) {
+      SetMetadata(CACHE_TTL_KEY, options.ttl)(target, key, descriptor);
+    }
+    return descriptor;
+  };
+};
+
+/**
+ * Invalidate cache decorator
+ *
+ * @example
+ * @InvalidateCache({ prefix: 'users' })
+ * async updateUser() {}
+ */
+export interface InvalidateCacheOptions {
+  /** Cache key prefix to invalidate */
+  prefix?: string;
+  /** Specific keys to invalidate */
+  keys?: string[];
+  /** Invalidate all */
+  all?: boolean;
+}
+
+export const InvalidateCache = (
+  options?: InvalidateCacheOptions,
+): MethodDecorator => {
+  return (
+    target: any,
+    key: string | symbol,
+    descriptor: PropertyDescriptor,
+  ) => {
+    SetMetadata('invalidate_cache', options || true)(target, key, descriptor);
+    return descriptor;
+  };
+};
+
+/**
+ * Lazy load decorator - for lazy loading heavy dependencies
+ *
+ * @example
+ * @Lazy()
+ * private heavyService: HeavyService;
+ */
+export const Lazy = (): PropertyDecorator => {
+  return (target: any, propertyKey: string | symbol) => {
+    SetMetadata('lazy', true)(target, propertyKey);
+  };
+};
+
+/**
+ * Factory decorator - for custom provider factories
+ *
+ * @example
+ * @Factory({ scope: Scope.DEFAULT })
+ * createMyService() {
+ *   return new MyService();
+ * }
+ */
+export interface FactoryOptions {
+  /** Scope for the factory */
+  scope?: Scope | ScopeType;
+  /** Whether to inject dependencies */
+  inject?: any[];
+}
+
+export const Factory = (options?: FactoryOptions): MethodDecorator => {
+  return (
+    target: any,
+    key: string | symbol,
+    descriptor: PropertyDescriptor,
+  ) => {
+    if (options?.scope) {
+      SetScope(options.scope)(target, key, descriptor);
+    }
+    SetMetadata('factory', true)(target, key, descriptor);
+    return descriptor;
+  };
+};
+
+/**
+ * Tag decorator for grouping providers
+ *
+ * @example
+ * @Tag('database')
+ * export class DatabaseService {}
+ *
+ * @Tag('cache')
+ * export class CacheService {}
+ */
+export const Tag = (tag: string): ClassDecorator => {
+  return (target: any) => {
+    SetMetadata('tags', [...(Reflect.getMetadata('tags', target) || []), tag])(
+      target,
+    );
+    return target;
+  };
+};
+
+/**
+ * Alias decorator for creating provider aliases
+ *
+ * @example
+ * @Alias('EntityManager')
+ * export class CustomEntityManager {}
+ */
+export const Alias = (alias: string): ClassDecorator => {
+  return (target: any) => {
+    SetMetadata('alias', alias)(target);
+    return target;
+  };
+};
+
+/**
+ * Get scope from target
+ */
+export const getScope = (target: any): Scope | undefined => {
+  return Reflect.getMetadata(SCOPE_KEY, target);
+};
+
+/**
+ * Check if service is singleton
+ */
+export const isSingleton = (target: any): boolean => {
+  const scope = getScope(target);
+  return !scope || scope === Scope.DEFAULT;
+};
+
+/**
+ * Check if service is request-scoped
+ */
+export const isRequestScoped = (target: any): boolean => {
+  const scope = getScope(target);
+  return scope === Scope.REQUEST;
+};
+
+/**
+ * Check if service is transient
+ */
+export const isTransient = (target: any): boolean => {
+  const scope = getScope(target);
+  return scope === Scope.TRANSIENT;
+};
+
+/**
+ * Check if method is cacheable
+ */
+export const isCacheable = (target: any, key: string | symbol): boolean => {
+  return Reflect.getMetadata(CACHE_KEY, target, key) === true;
+};
+
+/**
+ * Get cache TTL for method
+ */
+export const getCacheTTL = (
+  target: any,
+  key: string | symbol,
+): number | undefined => {
+  return Reflect.getMetadata(CACHE_TTL_KEY, target, key);
+};
+
+/**
+ * Get tags from target
+ */
+export const getTags = (target: any): string[] => {
+  return Reflect.getMetadata('tags', target) || [];
+};
+
+/**
+ * Get alias from target
+ */
+export const getAlias = (target: any): string | undefined => {
+  return Reflect.getMetadata('alias', target);
+};
+
+/**
+ * Helper to get all scoped dependencies
+ */
+export interface ScopedDependency {
+  /** Dependency token */
+  token: any;
+  /** Scope type */
+  scope: ScopeType;
+  /** Whether it's eager loaded */
+  eager?: boolean;
+}
+
+/**
+ * Get scoped dependencies for a module
+ */
+export const getScopedDependencies = (
+  dependencies: any[],
+  scopes: Map<any, ScopeType>,
+): ScopedDependency[] => {
+  return dependencies.map((dep) => ({
+    token: dep,
+    scope: scopes.get(dep) || ScopeType.DEFAULT,
+  }));
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/filters/http-exception.filter.ts.html b/coverage/lcov-report/src/common/filters/http-exception.filter.ts.html new file mode 100644 index 0000000..6f1283e --- /dev/null +++ b/coverage/lcov-report/src/common/filters/http-exception.filter.ts.html @@ -0,0 +1,1195 @@ + + + + + + Code coverage report for src/common/filters/http-exception.filter.ts + + + + + + + + + +
+
+

All files / src/common/filters http-exception.filter.ts

+
+ +
+ 0% + Statements + 0/370 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/370 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * HTTP Exception Filter
+ *
+ * Standardizes error responses across the application.
+ * Transforms all exceptions to {error, code, details} format.
+ */
+
+import {
+  ExceptionFilter,
+  Catch,
+  ArgumentsHost,
+  HttpException,
+  HttpStatus,
+  Logger,
+  NotFoundException,
+  BadRequestException,
+  UnauthorizedException,
+  ForbiddenException,
+  ConflictException,
+  ValidationError,
+} from '@nestjs/common';
+import { Request, Response } from 'express';
+import {
+  ApiErrorResponse,
+  ApiResponseCode,
+  ApiMeta,
+  DEFAULT_API_VERSION,
+} from '../interfaces/response.interface';
+
+/**
+ * Configuration for the exception filter
+ */
+export interface HttpExceptionFilterConfig {
+  /** Default API version */
+  apiVersion?: string;
+  /** Whether to include stack trace in development */
+  includeStackTrace?: boolean;
+  /** Custom error messages */
+  customMessages?: Record<string, string>;
+}
+
+/**
+ * Default configuration
+ */
+const DEFAULT_CONFIG: HttpExceptionFilterConfig = {
+  apiVersion: '1.0',
+  includeStackTrace: false,
+  customMessages: {},
+};
+
+/**
+ * HTTP status to response code mapping
+ */
+const STATUS_TO_CODE: Record<number, ApiResponseCode> = {
+  [HttpStatus.BAD_REQUEST]: ApiResponseCode.BAD_REQUEST,
+  [HttpStatus.UNAUTHORIZED]: ApiResponseCode.UNAUTHORIZED,
+  [HttpStatus.FORBIDDEN]: ApiResponseCode.FORBIDDEN,
+  [HttpStatus.NOT_FOUND]: ApiResponseCode.NOT_FOUND,
+  [HttpStatus.CONFLICT]: ApiResponseCode.CONFLICT,
+  [HttpStatus.UNPROCESSABLE_ENTITY]: ApiResponseCode.VALIDATION_ERROR,
+  [HttpStatus.TOO_MANY_REQUESTS]: ApiResponseCode.RATE_LIMITED,
+};
+
+/**
+ * Default error messages
+ */
+const DEFAULT_ERROR_MESSAGES: Record<ApiResponseCode, string> = {
+  [ApiResponseCode.SUCCESS]: 'Success',
+  [ApiResponseCode.CREATED]: 'Resource created successfully',
+  [ApiResponseCode.UPDATED]: 'Resource updated successfully',
+  [ApiResponseCode.DELETED]: 'Resource deleted successfully',
+  [ApiResponseCode.BAD_REQUEST]: 'Bad request',
+  [ApiResponseCode.UNAUTHORIZED]: 'Unauthorized access',
+  [ApiResponseCode.FORBIDDEN]: 'Forbidden',
+  [ApiResponseCode.NOT_FOUND]: 'Resource not found',
+  [ApiResponseCode.CONFLICT]: 'Resource conflict',
+  [ApiResponseCode.INTERNAL_ERROR]: 'Internal server error',
+  [ApiResponseCode.VALIDATION_ERROR]: 'Validation error',
+  [ApiResponseCode.RATE_LIMITED]: 'Too many requests',
+};
+
+@Catch()
+export class HttpExceptionFilter implements ExceptionFilter {
+  private readonly logger = new Logger(HttpExceptionFilter.name);
+  private readonly config: HttpExceptionFilterConfig;
+
+  constructor(config?: HttpExceptionFilterConfig) {
+    this.config = { ...DEFAULT_CONFIG, ...config };
+  }
+
+  /**
+   * Catch and handle all exceptions
+   */
+  catch(exception: unknown, host: ArgumentsHost): void {
+    const ctx = host.switchToHttp();
+    const response = ctx.getResponse<Response>();
+    const request = ctx.getRequest<Request>();
+
+    // Determine exception type and status
+    const { status, error, code, details } = this.parseException(exception);
+
+    // Get request ID
+    const requestId =
+      (request.headers['x-request-id'] as string) || this.generateRequestId();
+
+    // Get API version
+    const apiVersion = this.config.apiVersion || DEFAULT_API_VERSION;
+
+    // Build error response
+    const errorResponse: ApiErrorResponse = this.buildErrorResponse(
+      status,
+      error,
+      code,
+      details,
+      requestId,
+      apiVersion,
+      request,
+    );
+
+    // Log the error
+    this.logError(exception, request, status);
+
+    // Set response headers
+    response.setHeader('X-API-Version', apiVersion);
+    response.setHeader('X-Request-Id', requestId);
+
+    // Send response
+    response.status(status).json(errorResponse);
+  }
+
+  /**
+   * Parse exception to extract error information
+   */
+  private parseException(exception: unknown): {
+    status: number;
+    error: string;
+    code: ApiResponseCode;
+    details?: { field?: string; message: string }[];
+  } {
+    // Handle HTTP exceptions
+    if (exception instanceof HttpException) {
+      return this.parseHttpException(exception);
+    }
+
+    // Handle validation errors (from class-validator)
+    if (
+      Array.isArray(exception) &&
+      exception.every((e) => e instanceof ValidationError)
+    ) {
+      return this.parseValidationErrors(exception as ValidationError[]);
+    }
+
+    // Handle unknown errors
+    return {
+      status: HttpStatus.INTERNAL_SERVER_ERROR,
+      error: this.getErrorMessage(ApiResponseCode.INTERNAL_ERROR),
+      code: ApiResponseCode.INTERNAL_ERROR,
+      details: this.config.includeStackTrace
+        ? [
+            {
+              message:
+                exception instanceof Error
+                  ? exception.message
+                  : 'Unknown error',
+            },
+          ]
+        : undefined,
+    };
+  }
+
+  /**
+   * Parse HTTP exception
+   */
+  private parseHttpException(exception: HttpException): {
+    status: number;
+    error: string;
+    code: ApiResponseCode;
+    details?: { field?: string; message: string }[];
+  } {
+    const status = exception.getStatus();
+    const response = exception.getResponse();
+
+    // Get response code
+    const code = STATUS_TO_CODE[status] || ApiResponseCode.BAD_REQUEST;
+
+    // Handle different response types
+    if (typeof response === 'string') {
+      return {
+        status,
+        error: response,
+        code,
+      };
+    }
+
+    if (typeof response === 'object') {
+      const responseObj = response as Record<string, any>;
+
+      // Handle validation errors
+      if (Array.isArray(responseObj.message)) {
+        return {
+          status,
+          error: this.getErrorMessage(code),
+          code,
+          details: responseObj.message.map((msg: string) => ({ message: msg })),
+        };
+      }
+
+      // Handle object response
+      return {
+        status,
+        error:
+          responseObj.message ||
+          responseObj.error ||
+          this.getErrorMessage(code),
+        code,
+        details: responseObj.details,
+      };
+    }
+
+    return {
+      status,
+      error: this.getErrorMessage(code),
+      code,
+    };
+  }
+
+  /**
+   * Parse validation errors from class-validator
+   */
+  private parseValidationErrors(errors: ValidationError[]): {
+    status: number;
+    error: string;
+    code: ApiResponseCode;
+    details: { field?: string; message: string }[];
+  } {
+    const details = errors
+      .filter((error) => error.constraints)
+      .map((error) => ({
+        field: error.property,
+        message: Object.values(error.constraints || {}).join(', '),
+      }));
+
+    return {
+      status: HttpStatus.UNPROCESSABLE_ENTITY,
+      error: this.getErrorMessage(ApiResponseCode.VALIDATION_ERROR),
+      code: ApiResponseCode.VALIDATION_ERROR,
+      details,
+    };
+  }
+
+  /**
+   * Build standardized error response
+   */
+  private buildErrorResponse(
+    status: number,
+    error: string,
+    code: ApiResponseCode,
+    details: { field?: string; message: string }[] | undefined,
+    requestId: string,
+    apiVersion: string,
+    request: Request,
+  ): ApiErrorResponse {
+    const meta: ApiMeta = {
+      timestamp: new Date().toISOString(),
+      version: apiVersion,
+      requestId,
+      path: request.url,
+      method: request.method,
+    };
+
+    const response: ApiErrorResponse = {
+      error,
+      code,
+      meta,
+    };
+
+    if (details && details.length > 0) {
+      response.details = details;
+    }
+
+    // Add context in development
+    if (this.config.includeStackTrace) {
+      response.context = {
+        timestamp: new Date().toISOString(),
+        path: request.url,
+        method: request.method,
+      };
+    }
+
+    return response;
+  }
+
+  /**
+   * Get error message from code or custom messages
+   */
+  private getErrorMessage(code: ApiResponseCode): string {
+    return (
+      this.config.customMessages?.[code] ||
+      DEFAULT_ERROR_MESSAGES[code] ||
+      'An error occurred'
+    );
+  }
+
+  /**
+   * Generate unique request ID
+   */
+  private generateRequestId(): string {
+    return `req_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
+  }
+
+  /**
+   * Log error with appropriate level
+   */
+  private logError(exception: unknown, request: Request, status: number): void {
+    const message = `${request.method} ${request.url} - ${status}`;
+
+    if (status >= HttpStatus.INTERNAL_SERVER_ERROR) {
+      this.logger.error(
+        message,
+        exception instanceof Error ? exception.stack : undefined,
+      );
+    } else if (status >= HttpStatus.BAD_REQUEST) {
+      this.logger.warn(message);
+    } else {
+      this.logger.log(message);
+    }
+  }
+}
+
+/**
+ * Helper function to throw standardized HTTP exceptions
+ */
+export const throwBadRequest = (
+  message: string,
+  details?: { field?: string; message: string }[],
+) => {
+  throw new BadRequestException({
+    message,
+    code: ApiResponseCode.BAD_REQUEST,
+    details,
+  });
+};
+
+export const throwNotFound = (message: string = 'Resource not found') => {
+  throw new NotFoundException({
+    message,
+    code: ApiResponseCode.NOT_FOUND,
+  });
+};
+
+export const throwUnauthorized = (message: string = 'Unauthorized access') => {
+  throw new UnauthorizedException({
+    message,
+    code: ApiResponseCode.UNAUTHORIZED,
+  });
+};
+
+export const throwForbidden = (message: string = 'Forbidden') => {
+  throw new ForbiddenException({
+    message,
+    code: ApiResponseCode.FORBIDDEN,
+  });
+};
+
+export const throwConflict = (message: string = 'Resource conflict') => {
+  throw new ConflictException({
+    message,
+    code: ApiResponseCode.CONFLICT,
+  });
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/filters/index.html b/coverage/lcov-report/src/common/filters/index.html new file mode 100644 index 0000000..6fbb3e4 --- /dev/null +++ b/coverage/lcov-report/src/common/filters/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/common/filters + + + + + + + + + +
+
+

All files src/common/filters

+
+ +
+ 0% + Statements + 0/370 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/370 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
http-exception.filter.ts +
+
0%0/3700%0/10%0/10%0/370
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/interceptors/index.html b/coverage/lcov-report/src/common/interceptors/index.html new file mode 100644 index 0000000..73edb5d --- /dev/null +++ b/coverage/lcov-report/src/common/interceptors/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/common/interceptors + + + + + + + + + +
+
+

All files src/common/interceptors

+
+ +
+ 0% + Statements + 0/292 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/292 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
response.interceptor.ts +
+
0%0/2920%0/10%0/10%0/292
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/interceptors/response.interceptor.ts.html b/coverage/lcov-report/src/common/interceptors/response.interceptor.ts.html new file mode 100644 index 0000000..fb91a35 --- /dev/null +++ b/coverage/lcov-report/src/common/interceptors/response.interceptor.ts.html @@ -0,0 +1,961 @@ + + + + + + Code coverage report for src/common/interceptors/response.interceptor.ts + + + + + + + + + +
+
+

All files / src/common/interceptors response.interceptor.ts

+
+ +
+ 0% + Statements + 0/292 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/292 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Response Interceptor
+ *
+ * Transforms all API responses to standardized format.
+ * Adds metadata, pagination, and version headers.
+ */
+
+import {
+  Injectable,
+  NestInterceptor,
+  ExecutionContext,
+  CallHandler,
+  Response,
+} from '@nestjs/common';
+import { Observable } from 'rxjs';
+import { map, tap } from 'rxjs/operators';
+import { Request } from 'express';
+import {
+  ApiResponse,
+  PaginatedApiResponse,
+  ApiMeta,
+  PaginationMeta,
+  PaginationLinks,
+  DEFAULT_API_VERSION,
+} from '../interfaces/response.interface';
+import {
+  getPaginationMeta,
+  getPaginationLinks,
+} from '../utils/pagination.util';
+
+/**
+ * Configuration for the response interceptor
+ */
+export interface ResponseInterceptorConfig {
+  /** Default API version */
+  apiVersion?: string;
+  /** Whether to include response time header */
+  includeResponseTime?: boolean;
+  /** Whether to include request ID */
+  includeRequestId?: boolean;
+  /** Default page size */
+  defaultPageSize?: number;
+  /** Max page size */
+  maxPageSize?: number;
+}
+
+/**
+ * Default configuration
+ */
+const DEFAULT_CONFIG: ResponseInterceptorConfig = {
+  apiVersion: '1.0',
+  includeResponseTime: true,
+  includeRequestId: true,
+  defaultPageSize: 10,
+  maxPageSize: 100,
+};
+
+/**
+ * Custom decorator to mark response as paginated
+ */
+export const IS_PAGINATED_KEY = 'is_paginated';
+export const PAGINATION_META_KEY = 'pagination_meta';
+
+export const SetPaginated = (pagination: PaginationMeta) => {
+  return (target: any, key: string, descriptor: PropertyDescriptor) => {
+    Reflect.defineMetadata(IS_PAGINATED_KEY, true, descriptor.value);
+    Reflect.defineMetadata(PAGINATION_META_KEY, pagination, descriptor.value);
+    return descriptor;
+  };
+};
+
+@Injectable()
+export class ResponseInterceptor implements NestInterceptor {
+  private readonly config: ResponseInterceptorConfig;
+  private startTime: number = 0;
+
+  constructor(config?: ResponseInterceptorConfig) {
+    this.config = { ...DEFAULT_CONFIG, ...config };
+  }
+
+  /**
+   * Intercept method to transform responses
+   */
+  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
+    const request = context.switchToHttp().getRequest<Request>();
+    const response = context.switchToHttp().getResponse();
+
+    this.startTime = Date.now();
+
+    // Get request ID from headers or generate one
+    const requestId =
+      (request.headers['x-request-id'] as string) || this.generateRequestId();
+
+    // Get API version from controller or endpoint
+    const apiVersion = this.getApiVersion(context);
+
+    // Set response headers
+    this.setResponseHeaders(response, apiVersion, requestId);
+
+    return next.handle().pipe(
+      tap(() => {
+        // Add response time header after response is sent
+        if (this.config.includeResponseTime) {
+          const responseTime = Date.now() - this.startTime;
+          response.setHeader('X-Response-Time', `${responseTime}ms`);
+        }
+      }),
+      map((data) => {
+        // Check if this is a paginated response
+        const isPaginated = this.isPaginatedResponse(data);
+
+        if (isPaginated) {
+          return this.formatPaginatedResponse(
+            data,
+            request,
+            apiVersion,
+            requestId,
+          );
+        }
+
+        return this.formatSuccessResponse(data, apiVersion, requestId);
+      }),
+    );
+  }
+
+  /**
+   * Format success response
+   */
+  private formatSuccessResponse<T>(
+    data: T,
+    version: string,
+    requestId: string,
+  ): ApiResponse<T> {
+    const meta: ApiMeta = {
+      timestamp: new Date().toISOString(),
+      version,
+      requestId: this.config.includeRequestId ? requestId : undefined,
+    };
+
+    return {
+      data,
+      meta,
+    };
+  }
+
+  /**
+   * Format paginated response
+   */
+  private formatPaginatedResponse<T>(
+    data: {
+      data: T[];
+      pagination?: PaginationMeta;
+    },
+    request: Request,
+    version: string,
+    requestId: string,
+  ): PaginatedApiResponse<T> {
+    const pagination = data.pagination || {
+      page: 1,
+      limit: this.config.defaultPageSize || 10,
+      total: data.data.length,
+      totalPages: 1,
+      hasNext: false,
+      hasPrev: false,
+    };
+
+    const baseUrl = this.getBaseUrl(request);
+    const links = getPaginationLinks(
+      baseUrl,
+      pagination.page,
+      pagination.limit,
+      pagination.total,
+    );
+
+    const meta: ApiMeta = {
+      timestamp: new Date().toISOString(),
+      version,
+      requestId: this.config.includeRequestId ? requestId : undefined,
+    };
+
+    return {
+      data: data.data,
+      meta,
+      links,
+      pagination,
+    };
+  }
+
+  /**
+   * Check if response should be paginated
+   */
+  private isPaginatedResponse(data: any): boolean {
+    if (!data || typeof data !== 'object') {
+      return false;
+    }
+
+    // Check if data has pagination structure
+    if (Array.isArray(data.data) && data.pagination) {
+      return true;
+    }
+
+    // Check metadata flag
+    return Reflect.has(data, 'isPaginated') && data.isPaginated === true;
+  }
+
+  /**
+   * Set response headers
+   */
+  private setResponseHeaders(
+    response: Response,
+    apiVersion: string,
+    requestId: string,
+  ): void {
+    // Set API version header
+    response.setHeader('X-API-Version', apiVersion);
+
+    // Set request ID header
+    if (this.config.includeRequestId) {
+      response.setHeader('X-Request-Id', requestId);
+    }
+
+    // Set content type
+    response.setHeader('Content-Type', 'application/json');
+  }
+
+  /**
+   * Get API version from controller or endpoint
+   */
+  private getApiVersion(context: ExecutionContext): string {
+    const handler = context.getHandler();
+    const controller = context.getClass();
+
+    // Check handler for version metadata
+    const handlerVersion = Reflect.getMetadata('api_version', handler);
+    if (handlerVersion) {
+      return (
+        handlerVersion.version || this.config.apiVersion || DEFAULT_API_VERSION
+      );
+    }
+
+    // Check controller for version metadata
+    const controllerVersion = Reflect.getMetadata('api_version', controller);
+    if (controllerVersion) {
+      return (
+        controllerVersion.version ||
+        this.config.apiVersion ||
+        DEFAULT_API_VERSION
+      );
+    }
+
+    return this.config.apiVersion || DEFAULT_API_VERSION;
+  }
+
+  /**
+   * Generate unique request ID
+   */
+  private generateRequestId(): string {
+    return `req_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
+  }
+
+  /**
+   * Get base URL from request
+   */
+  private getBaseUrl(request: Request): string {
+    const protocol = request.protocol;
+    const host = request.get('host') || 'localhost';
+    const baseUrl = `${protocol}://${host}${request.path.split('/').slice(0, -1).join('/')}`;
+    return baseUrl || request.originalUrl.split('?')[0];
+  }
+}
+
+/**
+ * Helper function to create paginated response data
+ */
+export const createPaginatedResponse = <T>(
+  data: T[],
+  page: number,
+  limit: number,
+  total: number,
+): { data: T[]; pagination: PaginationMeta } => {
+  return {
+    data,
+    pagination: getPaginationMeta(page, limit, total),
+  };
+};
+
+/**
+ * Helper function to create success response data
+ */
+export const createSuccessResponse = <T>(data: T): T => {
+  return data;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/interfaces/index.html b/coverage/lcov-report/src/common/interfaces/index.html new file mode 100644 index 0000000..02c25d9 --- /dev/null +++ b/coverage/lcov-report/src/common/interfaces/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/common/interfaces + + + + + + + + + +
+
+

All files src/common/interfaces

+
+ +
+ 0% + Statements + 0/209 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/209 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
response.interface.ts +
+
0%0/2090%0/10%0/10%0/209
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/interfaces/response.interface.ts.html b/coverage/lcov-report/src/common/interfaces/response.interface.ts.html new file mode 100644 index 0000000..fb5ef5e --- /dev/null +++ b/coverage/lcov-report/src/common/interfaces/response.interface.ts.html @@ -0,0 +1,712 @@ + + + + + + Code coverage report for src/common/interfaces/response.interface.ts + + + + + + + + + +
+
+

All files / src/common/interfaces response.interface.ts

+
+ +
+ 0% + Statements + 0/209 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/209 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * API Response Standardization Interfaces
+ *
+ * Provides consistent response structures for all API endpoints.
+ * Supports success responses, error responses, pagination, and metadata.
+ */
+
+/**
+ * Metadata structure for API responses
+ */
+export interface ApiMeta {
+  /** Timestamp of the response */
+  timestamp: string;
+  /** API version */
+  version: string;
+  /** Request ID for tracing */
+  requestId?: string;
+  /** Custom metadata key-value pairs */
+  [key: string]: unknown;
+}
+
+/**
+ * Pagination links structure
+ */
+export interface PaginationLinks {
+  /** URL to the first page */
+  first: string | null;
+  /** URL to the last page */
+  last: string | null;
+  /** URL to the previous page */
+  prev: string | null;
+  /** URL to the next page */
+  next: string | null;
+  /** Current page URL */
+  self: string;
+}
+
+/**
+ * Pagination metadata structure
+ */
+export interface PaginationMeta {
+  /** Current page number (1-indexed) */
+  page: number;
+  /** Number of items per page */
+  limit: number;
+  /** Total number of items */
+  total: number;
+  /** Total number of pages */
+  totalPages: number;
+  /** Whether there is a next page */
+  hasNext: boolean;
+  /** Whether there is a previous page */
+  hasPrev: boolean;
+}
+
+/**
+ * Standard success response structure
+ * Follows {data, meta, links} format
+ */
+export interface ApiResponse<T = unknown> {
+  /** Response data */
+  data: T;
+  /** Response metadata */
+  meta: ApiMeta;
+  /** Pagination links (only for paginated responses) */
+  links?: PaginationLinks;
+}
+
+/**
+ * Paginated response structure
+ */
+export interface PaginatedApiResponse<T = unknown> {
+  /** Array of data items */
+  data: T[];
+  /** Pagination metadata */
+  meta: ApiMeta;
+  /** Pagination links */
+  links: PaginationLinks;
+  /** Pagination details */
+  pagination: PaginationMeta;
+}
+
+/**
+ * Error details structure
+ */
+export interface ErrorDetails {
+  /** Field that caused the error */
+  field?: string;
+  /** Error message */
+  message: string;
+  /** Error code */
+  code?: string;
+}
+
+/**
+ * Standard error response structure
+ * Follows {error, code, details} format
+ */
+export interface ApiErrorResponse {
+  /** Error message */
+  error: string;
+  /** Error code for client handling */
+  code: string;
+  /** Detailed error information */
+  details?: ErrorDetails[];
+  /** Additional context */
+  context?: Record<string, unknown>;
+  /** Metadata */
+  meta: ApiMeta;
+}
+
+/**
+ * Response wrapper options
+ */
+export interface ResponseWrapperOptions {
+  /** API version */
+  version?: string;
+  /** Request ID */
+  requestId?: string;
+  /** Whether to include timestamp */
+  includeTimestamp?: boolean;
+}
+
+/**
+ * Pagination query parameters
+ */
+export interface PaginationQuery {
+  /** Page number (1-indexed) */
+  page?: number;
+  /** Items per page */
+  limit?: number;
+  /** Sort field */
+  sort?: string;
+  /** Sort order */
+  order?: 'ASC' | 'DESC';
+}
+
+/**
+ * Filter options for sensitive data
+ */
+export interface FilterOptions {
+  /** Fields to exclude from response */
+  exclude?: string[];
+  /** Fields to include (overrides exclude) */
+  include?: string[];
+  /** Custom transform function */
+  transform?: (key: string, value: unknown) => unknown;
+}
+
+/**
+ * Type for filtered response
+ */
+export interface FilteredResponse<T> {
+  data: T;
+  filtered: boolean;
+}
+
+/**
+ * API Version decorator metadata
+ */
+export interface ApiVersionMetadata {
+  /** API version */
+  version: string;
+  /** Deprecation notice */
+  deprecated?: boolean;
+  /** Deprecation message */
+  deprecationMessage?: string;
+}
+
+/**
+ * Default API version
+ */
+export const DEFAULT_API_VERSION = '1.0';
+
+/**
+ * Response codes enumeration
+ */
+export enum ApiResponseCode {
+  SUCCESS = 'SUCCESS',
+  CREATED = 'CREATED',
+  UPDATED = 'UPDATED',
+  DELETED = 'DELETED',
+  BAD_REQUEST = 'BAD_REQUEST',
+  UNAUTHORIZED = 'UNAUTHORIZED',
+  FORBIDDEN = 'FORBIDDEN',
+  NOT_FOUND = 'NOT_FOUND',
+  CONFLICT = 'CONFLICT',
+  INTERNAL_ERROR = 'INTERNAL_ERROR',
+  VALIDATION_ERROR = 'VALIDATION_ERROR',
+  RATE_LIMITED = 'RATE_LIMITED',
+}
+
+/**
+ * HTTP status codes mapping
+ */
+export const ResponseCodeToStatus: Record<ApiResponseCode, number> = {
+  [ApiResponseCode.SUCCESS]: 200,
+  [ApiResponseCode.CREATED]: 201,
+  [ApiResponseCode.UPDATED]: 204,
+  [ApiResponseCode.DELETED]: 204,
+  [ApiResponseCode.BAD_REQUEST]: 400,
+  [ApiResponseCode.UNAUTHORIZED]: 401,
+  [ApiResponseCode.FORBIDDEN]: 403,
+  [ApiResponseCode.NOT_FOUND]: 404,
+  [ApiResponseCode.CONFLICT]: 409,
+  [ApiResponseCode.INTERNAL_ERROR]: 500,
+  [ApiResponseCode.VALIDATION_ERROR]: 422,
+  [ApiResponseCode.RATE_LIMITED]: 429,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/pipes/index.html b/coverage/lcov-report/src/common/pipes/index.html new file mode 100644 index 0000000..accbb74 --- /dev/null +++ b/coverage/lcov-report/src/common/pipes/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/common/pipes + + + + + + + + + +
+
+

All files src/common/pipes

+
+ +
+ 0% + Statements + 0/261 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/261 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.pipe.ts +
+
0%0/2610%0/10%0/10%0/261
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/pipes/transform.pipe.ts.html b/coverage/lcov-report/src/common/pipes/transform.pipe.ts.html new file mode 100644 index 0000000..15bf794 --- /dev/null +++ b/coverage/lcov-report/src/common/pipes/transform.pipe.ts.html @@ -0,0 +1,868 @@ + + + + + + Code coverage report for src/common/pipes/transform.pipe.ts + + + + + + + + + +
+
+

All files / src/common/pipes transform.pipe.ts

+
+ +
+ 0% + Statements + 0/261 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/261 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Transform Pipe
+ *
+ * Transform and filter sensitive data from request/response.
+ * Used for data sanitization and filtering.
+ */
+
+import {
+  PipeTransform,
+  Pipe,
+  ArgumentMetadata,
+  BadRequestException,
+  Logger,
+} from '@nestjs/common';
+import { FilterOptions } from '../interfaces/response.interface';
+
+/**
+ * Default sensitive fields to filter
+ */
+export const DEFAULT_SENSITIVE_FIELDS = [
+  'password',
+  'passwordHash',
+  'secret',
+  'token',
+  'accessToken',
+  'refreshToken',
+  'apiKey',
+  'apiSecret',
+  'privateKey',
+  'secretKey',
+  'creditCard',
+  'ssn',
+  'socialSecurityNumber',
+  'dateOfBirth',
+  'birthDate',
+];
+
+/**
+ * Configuration for the transform pipe
+ */
+export interface TransformPipeConfig {
+  /** Fields to exclude from response */
+  exclude?: string[];
+  /** Fields to include (overrides exclude) */
+  include?: string[];
+  /** Whether to recursively filter nested objects */
+  recursive?: boolean;
+  /** Custom transform function */
+  transform?: (key: string, value: unknown) => unknown;
+  /** Whether to mask instead of remove */
+  maskInsteadOfRemove?: boolean;
+  /** Mask character */
+  maskChar?: string;
+}
+
+/**
+ * Default configuration
+ */
+const DEFAULT_CONFIG: TransformPipeConfig = {
+  exclude: DEFAULT_SENSITIVE_FIELDS,
+  recursive: true,
+  maskInsteadOfRemove: false,
+  maskChar: '*',
+};
+
+/**
+ * Transform Pipe for filtering sensitive data
+ */
+@Injectable()
+export class TransformPipe implements PipeTransform {
+  private readonly logger = new Logger(TransformPipe.name);
+  private readonly config: TransformPipeConfig;
+
+  constructor(config?: TransformPipeConfig) {
+    this.config = { ...DEFAULT_CONFIG, ...config };
+  }
+
+  /**
+   * Transform method
+   */
+  transform(value: any, metadata: ArgumentMetadata): any {
+    // Only transform body and query parameters
+    if (metadata.type !== 'body' && metadata.type !== 'query') {
+      return value;
+    }
+
+    if (!value || typeof value !== 'object') {
+      return value;
+    }
+
+    return this.filterSensitiveData(value);
+  }
+
+  /**
+   * Filter sensitive data from object
+   */
+  private filterSensitiveData(data: any): any {
+    if (Array.isArray(data)) {
+      return data.map((item) => this.filterSensitiveData(item));
+    }
+
+    if (typeof data === 'object' && data !== null) {
+      const filtered: any = {};
+
+      for (const [key, value] of Object.entries(data)) {
+        if (this.isSensitiveField(key)) {
+          // Apply mask or removal
+          if (this.config.maskInsteadOfRemove) {
+            filtered[key] = this.maskValue(value);
+          }
+          // Skip sensitive fields (don't include them)
+        } else if (
+          this.config.recursive &&
+          typeof value === 'object' &&
+          value !== null
+        ) {
+          filtered[key] = this.filterSensitiveData(value);
+        } else {
+          filtered[key] = value;
+        }
+      }
+
+      return filtered;
+    }
+
+    return data;
+  }
+
+  /**
+   * Check if field is sensitive
+   */
+  private isSensitiveField(key: string): boolean {
+    const lowerKey = key.toLowerCase();
+
+    // Check if include list is provided
+    if (this.config.include && this.config.include.length > 0) {
+      return this.config.include.some(
+        (field) => field.toLowerCase() === lowerKey,
+      );
+    }
+
+    // Check exclude list
+    const excludeList = this.config.exclude || DEFAULT_SENSITIVE_FIELDS;
+    return excludeList.some((field) => field.toLowerCase() === lowerKey);
+  }
+
+  /**
+   * Mask sensitive value
+   */
+  private maskValue(value: unknown): string {
+    const maskChar = this.config.maskChar || '*';
+    if (typeof value === 'string' && value.length > 0) {
+      // Keep first and last character, mask middle
+      return (
+        value[0] +
+        maskChar.repeat(Math.min(value.length - 2, 8)) +
+        value[value.length - 1]
+      );
+    }
+    return maskChar.repeat(8);
+  }
+}
+
+/**
+ * Decorator to mark fields as sensitive for filtering
+ */
+export const Sensitive = (fieldName: string) => {
+  return (target: any, key: string) => {
+    const sensitiveFields =
+      Reflect.getMetadata('sensitive_fields', target.constructor) || [];
+    sensitiveFields.push(fieldName);
+    Reflect.defineMetadata(
+      'sensitive_fields',
+      sensitiveFields,
+      target.constructor,
+    );
+  };
+};
+
+/**
+ * Function to create a filter for sensitive data
+ */
+export const createSensitiveDataFilter = (
+  sensitiveFields: string[],
+  maskInsteadOfRemove: boolean = false,
+) => {
+  const filter = new TransformPipe({
+    exclude: sensitiveFields,
+    maskInsteadOfRemove,
+    recursive: true,
+  });
+
+  return (data: any) => {
+    if (!data || typeof data !== 'object') {
+      return data;
+    }
+
+    return filter.transform(data, { type: 'body' } as ArgumentMetadata);
+  };
+};
+
+/**
+ * Transform plain object to filtered response
+ */
+export const toFilteredResponse = <T extends Record<string, any>>(
+  data: T,
+  options?: {
+    exclude?: string[];
+    include?: string[];
+    maskInsteadOfRemove?: boolean;
+  },
+): T => {
+  const pipe = new TransformPipe({
+    exclude: options?.exclude,
+    include: options?.include,
+    maskInsteadOfRemove: options?.maskInsteadOfRemove ?? false,
+    recursive: true,
+  });
+
+  return pipe.transform(data, { type: 'body' } as ArgumentMetadata) as T;
+};
+
+/**
+ * Transform array of objects to filtered responses
+ */
+export const toFilteredArray = <T extends Record<string, any>>(
+  data: T[],
+  options?: {
+    exclude?: string[];
+    include?: string[];
+    maskInsteadOfRemove?: boolean;
+  },
+): T[] => {
+  return data.map((item) => toFilteredResponse(item, options));
+};
+
+/**
+ * Remove sensitive fields from object (alias for backward compatibility)
+ */
+export const removeSensitiveFields = <T extends Record<string, any>>(
+  data: T,
+  fieldsToRemove?: string[],
+): T => {
+  return toFilteredResponse(data, {
+    exclude: fieldsToRemove || DEFAULT_SENSITIVE_FIELDS,
+    maskInsteadOfRemove: false,
+  });
+};
+
+/**
+ * Mask sensitive fields in object
+ */
+export const maskSensitiveFields = <T extends Record<string, any>>(
+  data: T,
+  fieldsToMask?: string[],
+): T => {
+  return toFilteredResponse(data, {
+    exclude: fieldsToMask || DEFAULT_SENSITIVE_FIELDS,
+    maskInsteadOfRemove: true,
+  });
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/providers/config.provider.ts.html b/coverage/lcov-report/src/common/providers/config.provider.ts.html new file mode 100644 index 0000000..0a174d9 --- /dev/null +++ b/coverage/lcov-report/src/common/providers/config.provider.ts.html @@ -0,0 +1,1219 @@ + + + + + + Code coverage report for src/common/providers/config.provider.ts + + + + + + + + + +
+
+

All files / src/common/providers config.provider.ts

+
+ +
+ 0% + Statements + 0/378 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/378 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Config Provider
+ *
+ * Custom provider for configuration management with validation,
+ * environment-specific overrides, and type safety.
+ */
+
+import {
+  Provider,
+  Injectable,
+  OnModuleInit,
+  Logger,
+  Optional,
+  Inject,
+} from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import {
+  IsString,
+  IsNumber,
+  IsBoolean,
+  IsEnum,
+  validateSync,
+  ValidationError,
+} from 'class-validator';
+import { plainToClass, Transform } from 'class-transformer';
+
+/**
+ * Environment enum
+ */
+export enum Environment {
+  DEVELOPMENT = 'development',
+  STAGING = 'staging',
+  PRODUCTION = 'production',
+  TEST = 'test',
+}
+
+/**
+ * Application configuration
+ */
+@Injectable()
+export class AppConfig {
+  @IsEnum(Environment)
+  @Transform(({ value }) => value || Environment.DEVELOPMENT)
+  NODE_ENV: Environment = Environment.DEVELOPMENT;
+
+  @IsNumber()
+  @Transform(({ value }) => parseInt(value, 10) || 3000)
+  PORT: number = 3000;
+
+  @IsString()
+  @Transform(({ value }) => value || 'http://localhost:3000')
+  APP_URL: string = 'http://localhost:3000';
+
+  @IsString()
+  @Transform(({ value }) => value || 'currentdao')
+  APP_NAME: string = 'currentdao';
+
+  @IsBoolean()
+  @Transform(({ value }) => value === 'true')
+  ENABLE_SWAGGER: boolean = true;
+
+  @IsString()
+  @Transform(({ value }) => value || '*')
+  CORS_ORIGIN: string = '*';
+
+  @IsNumber()
+  @Transform(({ value }) => parseInt(value, 10) || 1000)
+  CORS_MAX_AGE: number = 1000;
+}
+
+/**
+ * Database configuration
+ */
+@Injectable()
+export class DatabaseConfig {
+  @IsString()
+  @Transform(({ value }) => value || 'localhost')
+  DB_HOST: string = 'localhost';
+
+  @IsNumber()
+  @Transform(({ value }) => parseInt(value, 10) || 3306)
+  DB_PORT: number = 3306;
+
+  @IsString()
+  @Transform(({ value }) => value || 'root')
+  DB_USERNAME: string = 'root';
+
+  @IsString()
+  @Transform(({ value }) => value || '')
+  DB_PASSWORD: string = '';
+
+  @IsString()
+  @Transform(({ value }) => value || 'currentdao')
+  DB_DATABASE: string = 'currentdao';
+
+  @IsNumber()
+  @Transform(({ value }) => parseInt(value, 10) || 10)
+  DB_POOL_SIZE: number = 10;
+
+  @IsBoolean()
+  @Transform(({ value }) => value === 'true')
+  DB_SYNCHRONIZE: boolean = true;
+
+  @IsBoolean()
+  @Transform(({ value }) => value === 'true')
+  DB_LOGGING: boolean = false;
+}
+
+/**
+ * External API configurations
+ */
+@Injectable()
+export class ExternalApiConfig {
+  @IsString()
+  @Transform(({ value }) => value || '')
+  WEATHER_API_KEY: string = '';
+
+  @IsString()
+  @Transform(({ value }) => value || '')
+  WEATHER_API_URL: string = 'https://api.openweathermap.org/data/2.5';
+
+  @IsString()
+  @Transform(({ value }) => value || '')
+  FRED_API_KEY: string = '';
+
+  @IsString()
+  @Transform(({ value }) => value || 'https://api.stlouisfed.org/fred')
+  FRED_API_URL: string = 'https://api.stlouisfed.org/fred';
+
+  @IsString()
+  @Transform(({ value }) => value || '')
+  ALPHA_VANTAGE_API_KEY: string = '';
+
+  @IsString()
+  @Transform(({ value }) => value || 'https://www.alphavantage.co/query')
+  ALPHA_VANTAGE_API_URL: string = 'https://www.alphavantage.co/query';
+}
+
+/**
+ * Configuration provider options
+ */
+export interface ConfigProviderOptions {
+  /** Validate configuration */
+  validate?: boolean;
+  /** Throw on validation error */
+  throwOnError?: boolean;
+}
+
+/**
+ * Config provider token
+ */
+export const CONFIG_PROVIDER = 'CONFIG_PROVIDER';
+
+/**
+ * Custom configuration provider with validation
+ */
+@Injectable()
+export class ConfigProvider implements OnModuleInit {
+  private readonly logger = new Logger(ConfigProvider.name);
+  private readonly options: ConfigProviderOptions;
+
+  constructor(
+    private readonly configService: ConfigService,
+    @Optional() options?: ConfigProviderOptions,
+  ) {
+    this.options = {
+      validate: true,
+      throwOnError: true,
+      ...options,
+    };
+  }
+
+  /**
+   * Initialize and validate configuration
+   */
+  async onModuleInit(): Promise<void> {
+    if (this.options.validate) {
+      await this.validateConfiguration();
+    }
+  }
+
+  /**
+   * Validate all configuration
+   */
+  async validateConfiguration(): Promise<void> {
+    const errors: ValidationError[] = [];
+
+    // Validate AppConfig
+    const appConfigErrors = this.validateConfig(
+      AppConfig,
+      this.configService,
+      'app',
+    );
+    errors.push(...appConfigErrors);
+
+    // Validate DatabaseConfig
+    const dbConfigErrors = this.validateConfig(
+      DatabaseConfig,
+      this.configService,
+      'database',
+    );
+    errors.push(...dbConfigErrors);
+
+    // Validate ExternalApiConfig
+    const apiConfigErrors = this.validateConfig(
+      ExternalApiConfig,
+      this.configService,
+      'api',
+    );
+    errors.push(...apiConfigErrors);
+
+    if (errors.length > 0) {
+      const errorMessage = errors
+        .map(
+          (e) =>
+            `${e.property}: ${Object.values(e.constraints || {}).join(', ')}`,
+        )
+        .join('; ');
+
+      this.logger.error(`Configuration validation failed: ${errorMessage}`);
+
+      if (this.options.throwOnError) {
+        throw new Error(`Configuration validation failed: ${errorMessage}`);
+      }
+    } else {
+      this.logger.log('Configuration validated successfully');
+    }
+  }
+
+  /**
+   * Validate specific config class
+   */
+  private validateConfig<T>(
+    configClass: new () => T,
+    configService: ConfigService,
+    prefix: string,
+  ): ValidationError[] {
+    const config = plainToClass(configClass, {
+      ...process.env,
+    });
+
+    const errors = validateSync(config, {
+      whitelist: true,
+      forbidNonWhitelisted: true,
+    });
+
+    if (errors.length > 0) {
+      this.logger.warn(
+        `${prefix} configuration has ${errors.length} validation errors`,
+      );
+    }
+
+    return errors;
+  }
+
+  /**
+   * Get typed configuration value
+   */
+  get<T>(key: string, defaultValue?: T): T {
+    const value = this.configService.get<T>(key);
+    return value ?? defaultValue;
+  }
+
+  /**
+   * Get environment
+   */
+  getEnvironment(): string {
+    return this.configService.get('NODE_ENV') || 'development';
+  }
+
+  /**
+   * Check if in production
+   */
+  isProduction(): boolean {
+    return this.getEnvironment() === Environment.PRODUCTION;
+  }
+
+  /**
+   * Check if in development
+   */
+  isDevelopment(): boolean {
+    return this.getEnvironment() === Environment.DEVELOPMENT;
+  }
+
+  /**
+   * Check if in test
+   */
+  isTest(): boolean {
+    return this.getEnvironment() === Environment.TEST;
+  }
+
+  /**
+   * Get all config as object
+   */
+  getAll(): Record<string, any> {
+    return process.env;
+  }
+}
+
+/**
+ * Factory function to create config provider
+ */
+export const createConfigProvider = (): Provider => {
+  return {
+    provide: CONFIG_PROVIDER,
+    useFactory: (configService: ConfigService) =>
+      new ConfigProvider(configService),
+    inject: [ConfigService],
+  };
+};
+
+/**
+ * Inject config provider
+ */
+export const InjectConfigProvider = () => {
+  return {
+    provide: CONFIG_PROVIDER,
+    useFactory: (configService: ConfigService) =>
+      new ConfigProvider(configService),
+    inject: [ConfigService],
+  };
+};
+
+/**
+ * Token for app configuration
+ */
+export const APP_CONFIG = 'APP_CONFIG';
+
+/**
+ * Token for database configuration
+ */
+export const DB_CONFIG = 'DB_CONFIG';
+
+/**
+ * Token for external API configuration
+ */
+export const API_CONFIG = 'API_CONFIG';
+
+/**
+ * Create app config provider
+ */
+export const createAppConfigProvider = () => {
+  return {
+    provide: APP_CONFIG,
+    useFactory: () => new AppConfig(),
+  };
+};
+
+/**
+ * Create database config provider
+ */
+export const createDatabaseConfigProvider = () => {
+  return {
+    provide: DB_CONFIG,
+    useFactory: () => new DatabaseConfig(),
+  };
+};
+
+/**
+ * Create external API config provider
+ */
+export const createApiConfigProvider = () => {
+  return {
+    provide: API_CONFIG,
+    useFactory: () => new ExternalApiConfig(),
+  };
+};
+
+/**
+ * Configuration helper for typed access
+ */
+export const getConfig = (
+  configService: ConfigService,
+  key: string,
+  defaultValue?: any,
+): any => {
+  return configService.get(key) ?? defaultValue;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/providers/database.provider.ts.html b/coverage/lcov-report/src/common/providers/database.provider.ts.html new file mode 100644 index 0000000..fdb348f --- /dev/null +++ b/coverage/lcov-report/src/common/providers/database.provider.ts.html @@ -0,0 +1,709 @@ + + + + + + Code coverage report for src/common/providers/database.provider.ts + + + + + + + + + +
+
+

All files / src/common/providers database.provider.ts

+
+ +
+ 0% + Statements + 0/208 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/208 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Database Provider
+ *
+ * Custom provider for database connections with connection pooling,
+ * health checks, and proper lifecycle management.
+ */
+
+import {
+  Provider,
+  Injectable,
+  OnModuleInit,
+  OnModuleDestroy,
+  Logger,
+} from '@nestjs/common';
+import { InjectDataSource } from '@nestjs/typeorm';
+import { DataSource, EntityManager } from 'typeorm';
+
+/**
+ * Database provider options
+ */
+export interface DatabaseProviderOptions {
+  /** Enable query logging */
+  logQueries?: boolean;
+  /** Connection pool size */
+  poolSize?: number;
+  /** Connection timeout in ms */
+  connectionTimeout?: number;
+}
+
+/**
+ * Default options
+ */
+const DEFAULT_OPTIONS: DatabaseProviderOptions = {
+  logQueries: process.env.NODE_ENV === 'development',
+  poolSize: 10,
+  connectionTimeout: 30000,
+};
+
+/**
+ * Database health check result
+ */
+export interface DatabaseHealth {
+  /** Whether the database is connected */
+  connected: boolean;
+  /** Database type */
+  type: string;
+  /** Database name */
+  database: string;
+  /** Connection timestamp */
+  timestamp: string;
+  /** Active connections in pool */
+  activeConnections?: number;
+  /** Idle connections in pool */
+  idleConnections?: number;
+}
+
+/**
+ * Database provider token
+ */
+export const DATABASE_PROVIDER = 'DATABASE_PROVIDER';
+
+/**
+ * Custom database provider with enhanced functionality
+ */
+@Injectable()
+export class DatabaseProvider implements OnModuleInit, OnModuleDestroy {
+  private readonly logger = new Logger(DatabaseProvider.name);
+  private readonly options: DatabaseProviderOptions;
+
+  constructor(
+    @InjectDataSource() private readonly dataSource: DataSource,
+    options?: DatabaseProviderOptions,
+  ) {
+    this.options = { ...DEFAULT_OPTIONS, ...options };
+  }
+
+  /**
+   * Initialize on module load
+   */
+  async onModuleInit(): Promise<void> {
+    this.logger.log('Initializing database provider...');
+
+    // Verify connection
+    const isConnected = await this.isConnected();
+    if (!isConnected) {
+      this.logger.error('Database connection not established');
+      throw new Error('Database connection failed');
+    }
+
+    this.logger.log('Database provider initialized successfully');
+  }
+
+  /**
+   * Cleanup on module destroy
+   */
+  async onModuleDestroy(): Promise<void> {
+    this.logger.log('Closing database connections...');
+    await this.dataSource.destroy();
+    this.logger.log('Database connections closed');
+  }
+
+  /**
+   * Get the data source
+   */
+  getDataSource(): DataSource {
+    return this.dataSource;
+  }
+
+  /**
+   * Get the entity manager
+   */
+  getManager(): EntityManager {
+    return this.dataSource.manager;
+  }
+
+  /**
+   * Check if database is connected
+   */
+  async isConnected(): Promise<boolean> {
+    try {
+      await this.dataSource.query('SELECT 1');
+      return true;
+    } catch {
+      return false;
+    }
+  }
+
+  /**
+   * Get database health status
+   */
+  async getHealth(): Promise<DatabaseHealth> {
+    const isConnected = await this.isConnected();
+
+    return {
+      connected: isConnected,
+      type: this.dataSource.options.type as string,
+      database: this.dataSource.options.database as string,
+      timestamp: new Date().toISOString(),
+    };
+  }
+
+  /**
+   * Execute a transaction
+   */
+  async executeTransaction<T>(
+    callback: (manager: EntityManager) => Promise<T>,
+  ): Promise<T> {
+    return this.dataSource.transaction(callback);
+  }
+
+  /**
+   * Run raw query
+   */
+  async query<T = any>(sql: string, params?: any[]): Promise<T> {
+    return this.dataSource.query(sql, params);
+  }
+}
+
+/**
+ * Factory function to create database provider
+ */
+export const createDatabaseProvider = (
+  dataSource: DataSource,
+  options?: DatabaseProviderOptions,
+): Provider => {
+  return {
+    provide: DATABASE_PROVIDER,
+    useFactory: () => new DatabaseProvider(dataSource, options),
+    inject: [InjectDataSource],
+  };
+};
+
+/**
+ * Inject database provider
+ */
+export const InjectDatabaseProvider = () => {
+  return {
+    provide: DATABASE_PROVIDER,
+    useFactory: (dataSource: DataSource) => new DatabaseProvider(dataSource),
+    inject: [InjectDataSource],
+  };
+};
+
+/**
+ * Token for database configuration
+ */
+export const DATABASE_CONFIG_TOKEN = 'DATABASE_CONFIG';
+
+/**
+ * Custom database configuration provider
+ */
+export const createDatabaseConfigProvider = () => {
+  return {
+    provide: DATABASE_CONFIG_TOKEN,
+    useFactory: () => ({
+      type: 'mysql',
+      host: process.env.DB_HOST || 'localhost',
+      port: parseInt(process.env.DB_PORT || '3306', 10),
+      username: process.env.DB_USERNAME || 'root',
+      password: process.env.DB_PASSWORD || '',
+      database: process.env.DB_DATABASE || 'currentdao',
+      synchronize: process.env.NODE_ENV !== 'production',
+      logging: process.env.NODE_ENV === 'development',
+      autoLoadEntities: true,
+      poolSize: 10,
+    }),
+  };
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/providers/index.html b/coverage/lcov-report/src/common/providers/index.html new file mode 100644 index 0000000..5d9e932 --- /dev/null +++ b/coverage/lcov-report/src/common/providers/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/common/providers + + + + + + + + + +
+
+

All files src/common/providers

+
+ +
+ 0% + Statements + 0/869 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/869 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.provider.ts +
+
0%0/3780%0/10%0/10%0/378
database.provider.ts +
+
0%0/2080%0/10%0/10%0/208
logger.provider.ts +
+
0%0/2830%0/10%0/10%0/283
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/providers/logger.provider.ts.html b/coverage/lcov-report/src/common/providers/logger.provider.ts.html new file mode 100644 index 0000000..202db92 --- /dev/null +++ b/coverage/lcov-report/src/common/providers/logger.provider.ts.html @@ -0,0 +1,934 @@ + + + + + + Code coverage report for src/common/providers/logger.provider.ts + + + + + + + + + +
+
+

All files / src/common/providers logger.provider.ts

+
+ +
+ 0% + Statements + 0/283 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/283 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Logger Provider
+ *
+ * Custom provider for structured logging with context support,
+ * different log levels, and performance tracking.
+ */
+
+import {
+  Provider,
+  Injectable,
+  LoggerService,
+  Scope,
+  Optional,
+  Inject,
+} from '@nestjs/common';
+import { createLogger, Logger, LogLevel, format, transports } from 'winston';
+
+/**
+ * Logger provider options
+ */
+export interface LoggerProviderOptions {
+  /** Log level */
+  level?: LogLevel;
+  /** Whether to include timestamp */
+  includeTimestamp?: boolean;
+  /** Whether to colorize output */
+  colorize?: boolean;
+  /** Custom label for logs */
+  label?: string;
+  /** Whether to log to file */
+  logToFile?: boolean;
+  /** Log file path */
+  logFilePath?: string;
+}
+
+/**
+ * Default options
+ */
+const DEFAULT_OPTIONS: LoggerProviderOptions = {
+  level: 'info',
+  includeTimestamp: true,
+  colorize: true,
+  logToFile: false,
+  logFilePath: 'logs/app.log',
+};
+
+/**
+ * Custom log entry structure
+ */
+export interface LogEntry {
+  level: string;
+  message: string;
+  context?: string;
+  timestamp: string;
+  meta?: Record<string, any>;
+  duration?: number;
+}
+
+/**
+ * Logger provider token
+ */
+export const LOGGER_PROVIDER = 'LOGGER_PROVIDER';
+
+/**
+ * Custom NestJS-compatible logger using Winston
+ */
+@Injectable({ scope: Scope.DEFAULT })
+export class LoggerProvider implements LoggerService {
+  private readonly logger: Logger;
+  private readonly options: LoggerProviderOptions;
+  private readonly context: string;
+
+  constructor(
+    @Optional() @Inject(LOGGER_PROVIDER) options?: LoggerProviderOptions,
+    @Optional() context?: string,
+  ) {
+    this.options = { ...DEFAULT_OPTIONS, ...options };
+    this.context = context || 'App';
+
+    // Create Winston logger
+    this.logger = createLogger({
+      level: this.options.level || 'info',
+      format: this.getFormat(),
+      transports: this.getTransports(),
+    });
+  }
+
+  /**
+   * Get Winston format
+   */
+  private getFormat() {
+    const timestampFormat = format.timestamp({
+      format: 'YYYY-MM-DD HH:mm:ss.SSS',
+    });
+
+    return format.combine(
+      this.options.includeTimestamp !== false && timestampFormat(),
+      format.errors({ stack: true }),
+      format.splat(),
+      format.json(),
+      this.options.colorize !== false && format.colorize(),
+      format.printf(({ level, message, context, timestamp, ...meta }) => {
+        return `${timestamp} [${context || 'App'}] ${level}: ${message} ${
+          Object.keys(meta).length ? JSON.stringify(meta) : ''
+        }`;
+      }),
+    );
+  }
+
+  /**
+   * Get transports
+   */
+  private getTransports() {
+    const transportList: any[] = [
+      new transports.Console({
+        handleExceptions: true,
+      }),
+    ];
+
+    // Add file transport if enabled
+    if (this.options.logToFile) {
+      transportList.push(
+        new transports.File({
+          filename: this.options.logFilePath || 'logs/app.log',
+          handleExceptions: true,
+          maxsize: 5242880, // 5MB
+          maxFiles: 5,
+        }),
+      );
+    }
+
+    return transportList;
+  }
+
+  /**
+   * Log message
+   */
+  log(message: string, context?: string): void {
+    this.logger.info(message, { context: context || this.context });
+  }
+
+  /**
+   * Log error
+   */
+  error(message: string, trace?: string, context?: string): void {
+    this.logger.error(message, {
+      context: context || this.context,
+      trace,
+    });
+  }
+
+  /**
+   * Log warning
+   */
+  warn(message: string, context?: string): void {
+    this.logger.warn(message, { context: context || this.context });
+  }
+
+  /**
+   * Log debug message
+   */
+  debug(message: string, context?: string): void {
+    this.logger.debug(message, { context: context || this.context });
+  }
+
+  /**
+   * Log verbose message
+   */
+  verbose(message: string, context?: string): void {
+    this.logger.verbose(message, { context: context || this.context });
+  }
+
+  /**
+   * Set log level
+   */
+  setLogLevel(level: LogLevel): void {
+    this.logger.level = level;
+  }
+
+  /**
+   * Create child logger with context
+   */
+  createChild(context: string): LoggerProvider {
+    return new LoggerProvider(this.options, context);
+  }
+
+  /**
+   * Log with custom metadata
+   */
+  logWithMeta(
+    level: 'info' | 'warn' | 'error' | 'debug',
+    message: string,
+    meta?: Record<string, any>,
+    context?: string,
+  ): void {
+    this.logger.log(level, message, {
+      context: context || this.context,
+      ...meta,
+    });
+  }
+
+  /**
+   * Log performance timing
+   */
+  logPerformance(operation: string, duration: number, context?: string): void {
+    this.logger.info(`Performance: ${operation} took ${duration}ms`, {
+      context: context || this.context,
+      duration,
+      operation,
+    });
+  }
+}
+
+/**
+ * Factory function to create logger provider
+ */
+export const createLoggerProvider = (
+  options?: LoggerProviderOptions,
+  context?: string,
+): Provider => {
+  return {
+    provide: LOGGER_PROVIDER,
+    useFactory: () => new LoggerProvider(options, context),
+  };
+};
+
+/**
+ * Inject logger provider
+ */
+export const InjectLoggerProvider = (context?: string) => {
+  return {
+    provide: LOGGER_PROVIDER,
+    useFactory: (options?: LoggerProviderOptions) =>
+      new LoggerProvider(options, context),
+  };
+};
+
+/**
+ * Token for application logger
+ */
+export const APP_LOGGER = 'APP_LOGGER';
+
+/**
+ * Create application-wide logger
+ */
+export const createAppLogger = () => {
+  return new LoggerProvider(
+    {
+      level: (process.env.LOG_LEVEL as LogLevel) || 'info',
+      includeTimestamp: true,
+      colorize: process.env.NODE_ENV !== 'production',
+      logToFile: process.env.NODE_ENV === 'production',
+      logFilePath: process.env.LOG_FILE_PATH || 'logs/app.log',
+    },
+    'CurrentDao',
+  );
+};
+
+/**
+ * Performance tracking mixin
+ */
+export const withPerformanceTracking = (
+  logger: LoggerProvider,
+  operation: string,
+  context?: string,
+) => {
+  const startTime = Date.now();
+
+  return {
+    complete: () => {
+      const duration = Date.now() - startTime;
+      logger.logPerformance(operation, duration, context);
+    },
+    error: (error: Error) => {
+      const duration = Date.now() - startTime;
+      logger.error(
+        `Performance error: ${operation} failed after ${duration}ms`,
+        error.stack,
+        context,
+      );
+    },
+  };
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/utils/index.html b/coverage/lcov-report/src/common/utils/index.html new file mode 100644 index 0000000..5f35f34 --- /dev/null +++ b/coverage/lcov-report/src/common/utils/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/common/utils + + + + + + + + + +
+
+

All files src/common/utils

+
+ +
+ 0% + Statements + 0/236 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/236 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
pagination.util.ts +
+
0%0/2360%0/10%0/10%0/236
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/common/utils/pagination.util.ts.html b/coverage/lcov-report/src/common/utils/pagination.util.ts.html new file mode 100644 index 0000000..a9079af --- /dev/null +++ b/coverage/lcov-report/src/common/utils/pagination.util.ts.html @@ -0,0 +1,793 @@ + + + + + + Code coverage report for src/common/utils/pagination.util.ts + + + + + + + + + +
+
+

All files / src/common/utils pagination.util.ts

+
+ +
+ 0% + Statements + 0/236 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/236 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Pagination Utility
+ *
+ * Provides pagination helpers for API responses.
+ */
+
+import {
+  PaginationMeta,
+  PaginationLinks,
+  PaginationQuery,
+} from '../interfaces/response.interface';
+
+/**
+ * Default pagination settings
+ */
+export const DEFAULT_PAGE = 1;
+export const DEFAULT_LIMIT = 10;
+export const MAX_LIMIT = 100;
+
+/**
+ * Generate pagination metadata
+ *
+ * @param page - Current page number
+ * @param limit - Items per page
+ * @param total - Total number of items
+ * @returns Pagination metadata
+ */
+export const getPaginationMeta = (
+  page: number,
+  limit: number,
+  total: number,
+): PaginationMeta => {
+  const totalPages = Math.ceil(total / limit);
+
+  return {
+    page,
+    limit,
+    total,
+    totalPages,
+    hasNext: page < totalPages,
+    hasPrev: page > 1,
+  };
+};
+
+/**
+ * Generate pagination links
+ *
+ * @param baseUrl - Base URL for the endpoint
+ * @param page - Current page number
+ * @param limit - Items per page
+ * @param total - Total number of items
+ * @returns Pagination links
+ */
+export const getPaginationLinks = (
+  baseUrl: string,
+  page: number,
+  limit: number,
+  total: number,
+): PaginationLinks => {
+  const totalPages = Math.ceil(total / limit);
+
+  // Build query string
+  const buildUrl = (p: number): string => {
+    const url = new URL(baseUrl);
+    url.searchParams.set('page', String(p));
+    url.searchParams.set('limit', String(limit));
+    return url.toString();
+  };
+
+  return {
+    first: page > 1 ? buildUrl(1) : null,
+    prev: page > 1 ? buildUrl(page - 1) : null,
+    next: page < totalPages ? buildUrl(page + 1) : null,
+    last: page < totalPages ? buildUrl(totalPages) : null,
+    self: buildUrl(page),
+  };
+};
+
+/**
+ * Parse pagination query parameters
+ *
+ * @param query - Pagination query parameters
+ * @returns Normalized pagination parameters
+ */
+export const parsePaginationQuery = (
+  query: Partial<PaginationQuery>,
+): {
+  page: number;
+  limit: number;
+} => {
+  const page = Math.max(1, parseInt(String(query.page || DEFAULT_PAGE), 10));
+  const limit = Math.min(
+    MAX_LIMIT,
+    Math.max(1, parseInt(String(query.limit || DEFAULT_LIMIT), 10)),
+  );
+
+  return { page, limit };
+};
+
+/**
+ * Calculate pagination skip value for database queries
+ *
+ * @param page - Current page number
+ * @param limit - Items per page
+ * @returns Skip value for database query
+ */
+export const getSkipValue = (page: number, limit: number): number => {
+  return (page - 1) * limit;
+};
+
+/**
+ * Paginate array of items
+ *
+ * @param items - Array of items to paginate
+ * @param page - Current page number
+ * @param limit - Items per page
+ * @returns Paginated result with metadata
+ */
+export const paginateArray = <T>(
+  items: T[],
+  page: number,
+  limit: number,
+): {
+  data: T[];
+  pagination: PaginationMeta;
+} => {
+  const total = items.length;
+  const startIndex = (page - 1) * limit;
+  const endIndex = startIndex + limit;
+
+  const data = items.slice(startIndex, endIndex);
+  const pagination = getPaginationMeta(page, limit, total);
+
+  return { data, pagination };
+};
+
+/**
+ * Get pagination query string
+ *
+ * @param page - Page number
+ * @param limit - Items per page
+ * @returns Query string
+ */
+export const getPaginationQueryString = (
+  page: number,
+  limit: number,
+): string => {
+  return `page=${page}&limit=${limit}`;
+};
+
+/**
+ * Calculate offset and limit for cursor-based pagination
+ *
+ * @param cursor - Cursor string (usually base64 encoded)
+ * @param limit - Items per page
+ * @returns Offset value
+ */
+export const getCursorOffset = (
+  cursor: string | undefined,
+  limit: number,
+): number => {
+  if (!cursor) {
+    return 0;
+  }
+
+  try {
+    const decoded = atob(cursor);
+    const parsed = JSON.parse(decoded);
+    return parsed.offset || 0;
+  } catch {
+    return 0;
+  }
+};
+
+/**
+ * Generate cursor for next page
+ *
+ * @param offset - Current offset
+ * @param limit - Items per page
+ * @returns Base64 encoded cursor
+ */
+export const generateCursor = (offset: number, limit: number): string => {
+  const cursor = JSON.stringify({ offset: offset + limit, limit });
+  return btoa(cursor);
+};
+
+/**
+ * Sort array of objects
+ *
+ * @param items - Array of items to sort
+ * @param sortField - Field to sort by
+ * @param order - Sort order (ASC or DESC)
+ * @returns Sorted array
+ */
+export const sortItems = <T>(
+  items: T[],
+  sortField: keyof T,
+  order: 'ASC' | 'DESC' = 'ASC',
+): T[] => {
+  return [...items].sort((a, b) => {
+    const aVal = a[sortField];
+    const bVal = b[sortField];
+
+    if (aVal === bVal) return 0;
+
+    const comparison = aVal < bVal ? -1 : 1;
+    return order === 'ASC' ? comparison : -comparison;
+  });
+};
+
+/**
+ * Filter items based on search query
+ *
+ * @param items - Array of items to filter
+ * @param search - Search query
+ * @param fields - Fields to search in
+ * @returns Filtered array
+ */
+export const filterItems = <T>(
+  items: T[],
+  search: string,
+  fields: (keyof T)[],
+): T[] => {
+  if (!search) return items;
+
+  const lowerSearch = search.toLowerCase();
+  return items.filter((item) =>
+    fields.some((field) => {
+      const value = item[field];
+      if (typeof value === 'string') {
+        return value.toLowerCase().includes(lowerSearch);
+      }
+      return false;
+    }),
+  );
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/config/database.config.ts.html b/coverage/lcov-report/src/config/database.config.ts.html new file mode 100644 index 0000000..abd7b65 --- /dev/null +++ b/coverage/lcov-report/src/config/database.config.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/config/database.config.ts + + + + + + + + + +
+
+

All files / src/config database.config.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { registerAs } from '@nestjs/config';
+import { TypeOrmModuleOptions } from '@nestjs/typeorm';
+import { ForecastData } from '../forecasting/entities/forecast-data.entity';
+import { MultisigWallet } from '../multisig/entities/multisig-wallet.entity';
+import { Signature } from '../multisig/entities/signature.entity';
+import { MarketSetting } from '../settings/entities/market-setting.entity';
+import { UserPreference } from '../settings/entities/user-preference.entity';
+
+export default registerAs(
+  'database',
+  (): TypeOrmModuleOptions => ({
+    type: 'mysql',
+    host: process.env.DB_HOST || 'localhost',
+    port: parseInt(process.env.DB_PORT || '3306', 10),
+    username: process.env.DB_USERNAME || 'root',
+    password: process.env.DB_PASSWORD || '',
+    database: process.env.DB_DATABASE || 'currentdao',
+    entities: [
+      ForecastData,
+      MultisigWallet,
+      Signature,
+      MarketSetting,
+      UserPreference,
+    ],
+    synchronize: process.env.NODE_ENV !== 'production',
+    logging: process.env.NODE_ENV === 'development',
+    autoLoadEntities: true,
+  }),
+);
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/config/index.html b/coverage/lcov-report/src/config/index.html new file mode 100644 index 0000000..5025a8f --- /dev/null +++ b/coverage/lcov-report/src/config/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/config + + + + + + + + + +
+
+

All files src/config

+
+ +
+ 0% + Statements + 0/110 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/110 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
database.config.ts +
+
0%0/290%0/10%0/10%0/29
stellar.config.ts +
+
0%0/810%0/10%0/10%0/81
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/config/stellar.config.ts.html b/coverage/lcov-report/src/config/stellar.config.ts.html new file mode 100644 index 0000000..934c19f --- /dev/null +++ b/coverage/lcov-report/src/config/stellar.config.ts.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/config/stellar.config.ts + + + + + + + + + +
+
+

All files / src/config stellar.config.ts

+
+ +
+ 0% + Statements + 0/81 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/81 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { registerAs } from '@nestjs/config';
+import { Networks } from '@stellar/stellar-sdk';
+
+export type SorobanNetworkName = 'testnet' | 'mainnet';
+
+export interface SorobanNetworkConfig {
+  networkPassphrase: string;
+  horizonUrl: string;
+  sorobanRpcUrl: string;
+  friendbotUrl?: string;
+}
+
+export default registerAs('stellar', () => {
+  const configuredNetwork = (
+    process.env.STELLAR_NETWORK || 'testnet'
+  ).toLowerCase();
+  const defaultNetwork: SorobanNetworkName =
+    configuredNetwork === 'public' || configuredNetwork === 'mainnet'
+      ? 'mainnet'
+      : 'testnet';
+
+  const testnet: SorobanNetworkConfig = {
+    networkPassphrase:
+      process.env.STELLAR_TESTNET_PASSPHRASE || Networks.TESTNET,
+    horizonUrl:
+      process.env.STELLAR_TESTNET_HORIZON_URL ||
+      'https://horizon-testnet.stellar.org',
+    sorobanRpcUrl:
+      process.env.STELLAR_TESTNET_RPC_URL ||
+      'https://soroban-testnet.stellar.org',
+    friendbotUrl:
+      process.env.STELLAR_TESTNET_FRIENDBOT_URL ||
+      'https://friendbot.stellar.org',
+  };
+
+  const mainnet: SorobanNetworkConfig = {
+    networkPassphrase:
+      process.env.STELLAR_MAINNET_PASSPHRASE || Networks.PUBLIC,
+    horizonUrl:
+      process.env.STELLAR_MAINNET_HORIZON_URL || 'https://horizon.stellar.org',
+    sorobanRpcUrl:
+      process.env.STELLAR_MAINNET_RPC_URL || 'https://rpc.mainnet.stellar.org',
+  };
+
+  return {
+    defaultNetwork,
+    sourceSecretKey: process.env.STELLAR_SOURCE_SECRET_KEY,
+    sourcePublicKey: process.env.STELLAR_SOURCE_PUBLIC_KEY,
+    metadataCacheTtlMs: parseInt(
+      process.env.STELLAR_METADATA_CACHE_TTL_MS || '300000',
+      10,
+    ),
+    eventPollingIntervalMs: parseInt(
+      process.env.STELLAR_EVENT_POLLING_INTERVAL_MS || '5000',
+      10,
+    ),
+    rpcTimeoutMs: parseInt(process.env.STELLAR_RPC_TIMEOUT_MS || '15000', 10),
+    submissionTimeoutMs: parseInt(
+      process.env.STELLAR_SUBMISSION_TIMEOUT_MS || '30000',
+      10,
+    ),
+    networks: {
+      testnet,
+      mainnet,
+    },
+    contracts: {
+      token: {
+        testnet: process.env.STELLAR_WATT_TOKEN_CONTRACT_ID_TESTNET,
+        mainnet: process.env.STELLAR_WATT_TOKEN_CONTRACT_ID_MAINNET,
+      },
+      escrow: {
+        testnet: process.env.STELLAR_ESCROW_CONTRACT_ID_TESTNET,
+        mainnet: process.env.STELLAR_ESCROW_CONTRACT_ID_MAINNET,
+      },
+      governance: {
+        testnet: process.env.STELLAR_GOVERNANCE_CONTRACT_ID_TESTNET,
+        mainnet: process.env.STELLAR_GOVERNANCE_CONTRACT_ID_MAINNET,
+      },
+    },
+  };
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/contract.service.ts.html b/coverage/lcov-report/src/contracts/contract.service.ts.html new file mode 100644 index 0000000..92476b0 --- /dev/null +++ b/coverage/lcov-report/src/contracts/contract.service.ts.html @@ -0,0 +1,1246 @@ + + + + + + Code coverage report for src/contracts/contract.service.ts + + + + + + + + + +
+
+

All files / src/contracts contract.service.ts

+
+ +
+ 0% + Statements + 0/387 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/387 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  BadRequestException,
+  Injectable,
+  Inject,
+  Logger,
+  OnModuleDestroy,
+  OnModuleInit,
+  ServiceUnavailableException,
+} from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { Observable, Subject } from 'rxjs';
+import type { ConfigType } from '@nestjs/config';
+import { MetricsCollectorService } from '../apm/metrics/metrics-collector.service';
+import { CustomInstrumentation } from '../tracing/instrumentation/custom-instrumentation';
+import stellarConfig from '../config/stellar.config';
+import {
+  ContractCallDto,
+  ContractDeploymentDto,
+  ContractEventListenerDto,
+  ContractUpgradeDto,
+} from './dto/contract-call.dto';
+import {
+  ContractEntity,
+  ContractNetwork,
+  ContractType,
+} from './entities/contract.entity';
+import {
+  ContractAdapter,
+  ContractCallResult,
+  ContractDeploymentResult,
+  ContractEventRecord,
+  EventStreamHandle,
+  GasEstimation,
+  ResolvedContractMetadata,
+} from './contracts/contract.types';
+import { TokenContract } from './contracts/token.contract';
+import { EscrowContract } from './contracts/escrow.contract';
+import { GovernanceContract } from './contracts/governance.contract';
+import { DeployerService } from './deployer/deployer.service';
+import { SorobanClientService } from './soroban-client.service';
+
+interface MetadataCacheEntry {
+  expiresAt: number;
+  metadata: ResolvedContractMetadata;
+}
+
+@Injectable()
+export class ContractService implements OnModuleInit, OnModuleDestroy {
+  private readonly logger = new Logger(ContractService.name);
+  private readonly metadataCache = new Map<string, MetadataCacheEntry>();
+  private readonly eventIntervals = new Map<string, NodeJS.Timeout>();
+  private readonly eventSubject = new Subject<ContractEventRecord>();
+  private readonly lastPollAt = new Map<string, string>();
+
+  constructor(
+    @InjectRepository(ContractEntity)
+    private readonly contractRepository: Repository<ContractEntity>,
+    @Inject(stellarConfig.KEY)
+    private readonly config: ConfigType<typeof stellarConfig>,
+    private readonly metricsCollector: MetricsCollectorService,
+    private readonly instrumentation: CustomInstrumentation,
+    private readonly sorobanClient: SorobanClientService,
+    private readonly tokenContract: TokenContract,
+    private readonly escrowContract: EscrowContract,
+    private readonly governanceContract: GovernanceContract,
+    private readonly deployerService: DeployerService,
+  ) {}
+
+  async onModuleInit(): Promise<void> {
+    for (const contractType of Object.values(ContractType)) {
+      for (const network of Object.values(ContractNetwork)) {
+        try {
+          await this.resolveContractMetadata(contractType, network);
+        } catch (error) {
+          this.logger.debug(
+            `Skipping metadata warmup for ${contractType}/${network}: ${error.message}`,
+          );
+        }
+      }
+    }
+  }
+
+  onModuleDestroy(): void {
+    for (const interval of this.eventIntervals.values()) {
+      clearInterval(interval);
+    }
+
+    this.eventIntervals.clear();
+    this.eventSubject.complete();
+  }
+
+  async invokeContract(request: ContractCallDto): Promise<ContractCallResult> {
+    return this.instrumentation.instrument(
+      'contracts.service.invoke',
+      async () => {
+        const metadata = await this.resolveContractMetadata(
+          request.contractType,
+          this.resolveNetwork(request.network),
+        );
+
+        const adapter = this.getAdapter(request.contractType);
+        if (!adapter.supportsMethod(request.method)) {
+          throw new BadRequestException(
+            `Method ${request.method} is not supported by ${request.contractType} contract wrapper.`,
+          );
+        }
+
+        const result = await adapter.invoke(metadata, request);
+        this.metricsCollector.trackBusinessMetric(
+          `contracts.invoke.${request.contractType}.${request.method}`,
+        );
+
+        return result;
+      },
+    );
+  }
+
+  async estimateGas(request: ContractCallDto): Promise<GasEstimation> {
+    const metadata = await this.resolveContractMetadata(
+      request.contractType,
+      this.resolveNetwork(request.network),
+    );
+
+    return this.sorobanClient.estimateGas({
+      contractId: metadata.contractId,
+      contractType: request.contractType,
+      network: metadata.network,
+      method: this.resolveMethod(
+        metadata,
+        request.contractType,
+        request.method,
+      ),
+      args: request.args,
+      signerSecretKey: request.signerSecretKey,
+      sourcePublicKey: request.sourcePublicKey,
+      timeoutInSeconds: request.timeoutInSeconds,
+    });
+  }
+
+  async deployContract(
+    request: ContractDeploymentDto,
+  ): Promise<ContractDeploymentResult> {
+    return this.deployerService.deployContract(request);
+  }
+
+  async upgradeContract(
+    request: ContractUpgradeDto,
+  ): Promise<ContractDeploymentResult> {
+    return this.deployerService.upgradeContract(request);
+  }
+
+  async listenToEvents(
+    request: ContractEventListenerDto,
+  ): Promise<EventStreamHandle> {
+    const network = this.resolveNetwork(request.network);
+    const metadata = await this.resolveContractMetadata(
+      request.contractType,
+      network,
+    );
+    const key = `${request.contractType}:${network}`;
+
+    if (this.eventIntervals.has(key)) {
+      return {
+        key,
+        stream: this.eventSubject.asObservable(),
+      };
+    }
+
+    const interval = setInterval(async () => {
+      try {
+        const latestMetadata = await this.resolveContractMetadata(
+          request.contractType,
+          network,
+          true,
+        );
+        const startLedger =
+          request.startLedger || latestMetadata.lastProcessedLedger || 0;
+        const events = await this.sorobanClient.getContractEvents(
+          latestMetadata.contractId,
+          request.contractType,
+          network,
+          startLedger > 0 ? startLedger + 1 : undefined,
+        );
+
+        if (events.length === 0) {
+          return;
+        }
+
+        const lastLedger = events.reduce(
+          (current, event) => Math.max(current, event.ledger || current),
+          startLedger,
+        );
+        this.lastPollAt.set(key, new Date().toISOString());
+
+        await this.persistLedgerCursor(
+          latestMetadata.contractId,
+          network,
+          lastLedger,
+        );
+        for (const event of events) {
+          this.metricsCollector.trackBusinessMetric(
+            `contracts.events.${request.contractType}`,
+          );
+          this.eventSubject.next(event);
+        }
+      } catch (error) {
+        this.logger.warn(
+          `Failed to poll ${request.contractType} events on ${network}: ${error.message}`,
+        );
+      }
+    }, this.config.eventPollingIntervalMs);
+
+    interval.unref?.();
+    this.eventIntervals.set(key, interval);
+
+    return {
+      key,
+      stream: this.eventSubject.asObservable(),
+    };
+  }
+
+  async stopEventListener(
+    contractType: ContractType,
+    network?: ContractNetwork,
+  ): Promise<void> {
+    const resolvedNetwork = this.resolveNetwork(network);
+    const key = `${contractType}:${resolvedNetwork}`;
+    const interval = this.eventIntervals.get(key);
+    if (interval) {
+      clearInterval(interval);
+      this.eventIntervals.delete(key);
+    }
+  }
+
+  getEventStream(): Observable<ContractEventRecord> {
+    return this.eventSubject.asObservable();
+  }
+
+  async getHealthStatus(): Promise<Record<string, any>> {
+    const statuses = await Promise.allSettled(
+      Object.values(ContractNetwork).map(async (network) => ({
+        network,
+        health: await this.sorobanClient.getRpcHealth(network),
+      })),
+    );
+
+    const unhealthy = statuses.filter((result) => result.status === 'rejected');
+
+    return {
+      status: unhealthy.length === 0 ? 'healthy' : 'degraded',
+      defaultNetwork: this.config.defaultNetwork,
+      activeListeners: this.eventIntervals.size,
+      cachedContracts: this.metadataCache.size,
+      lastEventPollAt: Object.fromEntries(this.lastPollAt.entries()),
+      networks: statuses.map((result, index) => {
+        const network = Object.values(ContractNetwork)[index];
+        return result.status === 'fulfilled'
+          ? { network, status: 'healthy', details: result.value.health }
+          : { network, status: 'degraded', error: result.reason.message };
+      }),
+    };
+  }
+
+  private async resolveContractMetadata(
+    contractType: ContractType,
+    network: ContractNetwork,
+    forceRefresh = false,
+  ): Promise<ResolvedContractMetadata> {
+    const cacheKey = `${contractType}:${network}`;
+    const cached = this.metadataCache.get(cacheKey);
+    if (!forceRefresh && cached && cached.expiresAt > Date.now()) {
+      return cached.metadata;
+    }
+
+    const adapter = this.getAdapter(contractType);
+    const entity = await this.contractRepository.findOne({
+      where: {
+        contractType,
+        network,
+        isActive: true,
+      },
+      order: {
+        updatedAt: 'DESC',
+      },
+    });
+
+    const configuredContractId = this.config.contracts[contractType]?.[network];
+    const contractId = entity?.contractId || configuredContractId;
+    if (!contractId) {
+      throw new ServiceUnavailableException(
+        `No ${contractType} contract is configured for ${network}.`,
+      );
+    }
+
+    const metadata: ResolvedContractMetadata = {
+      contractId,
+      contractType,
+      network,
+      version: entity?.version,
+      alias: entity?.alias,
+      abi: entity?.abi || {
+        methods: adapter.getMethodMetadata(),
+      },
+      metadata: {
+        ...(entity?.metadata || {}),
+        contractId,
+        contractType,
+        network,
+      },
+      lastProcessedLedger: entity?.lastProcessedLedger
+        ? Number(entity.lastProcessedLedger)
+        : undefined,
+      methods: adapter.getMethodMetadata(),
+    };
+
+    this.metadataCache.set(cacheKey, {
+      metadata,
+      expiresAt: Date.now() + this.config.metadataCacheTtlMs,
+    });
+
+    return metadata;
+  }
+
+  private getAdapter(contractType: ContractType): ContractAdapter {
+    switch (contractType) {
+      case ContractType.TOKEN:
+        return this.tokenContract;
+      case ContractType.ESCROW:
+        return this.escrowContract;
+      case ContractType.GOVERNANCE:
+        return this.governanceContract;
+      default:
+        throw new BadRequestException(
+          `Unsupported contract type: ${contractType}`,
+        );
+    }
+  }
+
+  private resolveNetwork(network?: ContractNetwork): ContractNetwork {
+    if (network) {
+      return network;
+    }
+
+    return this.config.defaultNetwork === 'mainnet'
+      ? ContractNetwork.MAINNET
+      : ContractNetwork.TESTNET;
+  }
+
+  private resolveMethod(
+    metadata: ResolvedContractMetadata,
+    contractType: ContractType,
+    method: string,
+  ): string {
+    const methodMetadata = metadata.methods.find(
+      (candidate) => candidate.method === method,
+    );
+    if (!methodMetadata) {
+      throw new BadRequestException(
+        `Method ${method} is not available for ${contractType}.`,
+      );
+    }
+
+    return methodMetadata.chainMethod;
+  }
+
+  private async persistLedgerCursor(
+    contractId: string,
+    network: ContractNetwork,
+    ledger: number,
+  ): Promise<void> {
+    await this.contractRepository.update(
+      {
+        contractId,
+        network,
+      },
+      {
+        lastProcessedLedger: String(ledger),
+        lastEventAt: new Date(),
+      },
+    );
+
+    this.metadataCache.delete(`token:${network}`);
+    this.metadataCache.delete(`escrow:${network}`);
+    this.metadataCache.delete(`governance:${network}`);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/contracts.module.ts.html b/coverage/lcov-report/src/contracts/contracts.module.ts.html new file mode 100644 index 0000000..e1a89e7 --- /dev/null +++ b/coverage/lcov-report/src/contracts/contracts.module.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/contracts/contracts.module.ts + + + + + + + + + +
+
+

All files / src/contracts contracts.module.ts

+
+ +
+ 0% + Statements + 0/30 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { ConfigModule } from '@nestjs/config';
+import { HttpModule } from '@nestjs/axios';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import stellarConfig from '../config/stellar.config';
+import { ContractEntity } from './entities/contract.entity';
+import { ContractService } from './contract.service';
+import { SorobanClientService } from './soroban-client.service';
+import { TokenContract } from './contracts/token.contract';
+import { EscrowContract } from './contracts/escrow.contract';
+import { GovernanceContract } from './contracts/governance.contract';
+import { DeployerService } from './deployer/deployer.service';
+
+@Module({
+  imports: [
+    HttpModule,
+    ConfigModule.forFeature(stellarConfig),
+    TypeOrmModule.forFeature([ContractEntity]),
+  ],
+  providers: [
+    SorobanClientService,
+    TokenContract,
+    EscrowContract,
+    GovernanceContract,
+    DeployerService,
+    ContractService,
+  ],
+  exports: [ContractService, DeployerService, SorobanClientService],
+})
+export class ContractsModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/contracts/contract.types.ts.html b/coverage/lcov-report/src/contracts/contracts/contract.types.ts.html new file mode 100644 index 0000000..4b8aabb --- /dev/null +++ b/coverage/lcov-report/src/contracts/contracts/contract.types.ts.html @@ -0,0 +1,424 @@ + + + + + + Code coverage report for src/contracts/contracts/contract.types.ts + + + + + + + + + +
+
+

All files / src/contracts/contracts contract.types.ts

+
+ +
+ 0% + Statements + 0/113 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/113 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Observable } from 'rxjs';
+import {
+  ContractCallDto,
+  ContractDeploymentDto,
+  ContractUpgradeDto,
+} from '../dto/contract-call.dto';
+import { ContractNetwork, ContractType } from '../entities/contract.entity';
+
+export interface GasEstimation {
+  cpuInstructions?: number;
+  readBytes?: number;
+  writeBytes?: number;
+  minResourceFee?: string;
+  recommendedFee?: string;
+}
+
+export interface ContractEventRecord {
+  id: string;
+  contractId: string;
+  contractType: ContractType;
+  network: ContractNetwork;
+  ledger?: number;
+  transactionHash?: string;
+  topic: string[];
+  payload: unknown;
+  timestamp: string;
+  raw?: Record<string, any>;
+}
+
+export interface ContractCallResult {
+  success: boolean;
+  contractId: string;
+  contractType: ContractType;
+  network: ContractNetwork;
+  method: string;
+  simulated: boolean;
+  cached: boolean;
+  durationMs: number;
+  result?: unknown;
+  gas?: GasEstimation;
+  transactionHash?: string;
+  ledger?: number;
+  raw?: Record<string, any>;
+}
+
+export interface ContractDeploymentResult {
+  success: boolean;
+  contractId: string;
+  contractType: ContractType;
+  network: ContractNetwork;
+  version: string;
+  alias?: string;
+  transactionHash?: string;
+  gas?: GasEstimation;
+  metadata?: Record<string, any>;
+}
+
+export interface ContractMethodMetadata {
+  method: string;
+  chainMethod: string;
+  readOnly: boolean;
+  cacheTtlMs?: number;
+  eventTopics?: string[];
+}
+
+export interface ResolvedContractMetadata {
+  contractId: string;
+  contractType: ContractType;
+  network: ContractNetwork;
+  version?: string;
+  alias?: string;
+  abi?: Record<string, any>;
+  metadata?: Record<string, any>;
+  lastProcessedLedger?: number;
+  methods: ContractMethodMetadata[];
+}
+
+export interface InvokeContractRequest {
+  contractId: string;
+  contractType: ContractType;
+  network: ContractNetwork;
+  method: string;
+  args?: unknown[];
+  signAndSend?: boolean;
+  simulateOnly?: boolean;
+  signerSecretKey?: string;
+  sourcePublicKey?: string;
+  timeoutInSeconds?: number;
+}
+
+export interface EventStreamHandle {
+  key: string;
+  stream: Observable<ContractEventRecord>;
+}
+
+export interface ContractAdapter {
+  readonly contractType: ContractType;
+  getMethodMetadata(): ContractMethodMetadata[];
+  supportsMethod(method: string): boolean;
+  invoke(
+    metadata: ResolvedContractMetadata,
+    request: ContractCallDto,
+  ): Promise<ContractCallResult>;
+}
+
+export interface ContractDeployer {
+  deployContract(
+    request: ContractDeploymentDto,
+  ): Promise<ContractDeploymentResult>;
+  upgradeContract(
+    request: ContractUpgradeDto,
+  ): Promise<ContractDeploymentResult>;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/contracts/escrow.contract.ts.html b/coverage/lcov-report/src/contracts/contracts/escrow.contract.ts.html new file mode 100644 index 0000000..4cd3b9d --- /dev/null +++ b/coverage/lcov-report/src/contracts/contracts/escrow.contract.ts.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for src/contracts/contracts/escrow.contract.ts + + + + + + + + + +
+
+

All files / src/contracts/contracts escrow.contract.ts

+
+ +
+ 0% + Statements + 0/90 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/90 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import {
+  ContractCallDto,
+  ContractInvocationMode,
+} from '../dto/contract-call.dto';
+import { SorobanClientService } from '../soroban-client.service';
+import { ContractType } from '../entities/contract.entity';
+import {
+  ContractAdapter,
+  ContractCallResult,
+  ContractMethodMetadata,
+  ResolvedContractMetadata,
+} from './contract.types';
+
+@Injectable()
+export class EscrowContract implements ContractAdapter {
+  readonly contractType = ContractType.ESCROW;
+
+  private readonly methods: ContractMethodMetadata[] = [
+    {
+      method: 'createEscrow',
+      chainMethod: 'create_escrow',
+      readOnly: false,
+      eventTopics: ['escrow_created'],
+    },
+    {
+      method: 'fundEscrow',
+      chainMethod: 'fund_escrow',
+      readOnly: false,
+      eventTopics: ['escrow_funded'],
+    },
+    {
+      method: 'releaseEscrow',
+      chainMethod: 'release_escrow',
+      readOnly: false,
+      eventTopics: ['escrow_released'],
+    },
+    {
+      method: 'cancelEscrow',
+      chainMethod: 'cancel_escrow',
+      readOnly: false,
+      eventTopics: ['escrow_cancelled'],
+    },
+    {
+      method: 'getEscrow',
+      chainMethod: 'get_escrow',
+      readOnly: true,
+      cacheTtlMs: 3000,
+    },
+    {
+      method: 'getStatus',
+      chainMethod: 'get_status',
+      readOnly: true,
+      cacheTtlMs: 3000,
+    },
+  ];
+
+  constructor(private readonly sorobanClient: SorobanClientService) {}
+
+  getMethodMetadata(): ContractMethodMetadata[] {
+    return this.methods;
+  }
+
+  supportsMethod(method: string): boolean {
+    return this.methods.some((candidate) => candidate.method === method);
+  }
+
+  async invoke(
+    metadata: ResolvedContractMetadata,
+    request: ContractCallDto,
+  ): Promise<ContractCallResult> {
+    const method = this.methods.find(
+      (candidate) => candidate.method === request.method,
+    );
+
+    return this.sorobanClient.invokeContract({
+      contractId: metadata.contractId,
+      contractType: this.contractType,
+      network: metadata.network,
+      method: method?.chainMethod || request.method,
+      args: request.args,
+      signAndSend:
+        request.mode === ContractInvocationMode.SIGNED || !method?.readOnly,
+      simulateOnly: request.simulateOnly,
+      signerSecretKey: request.signerSecretKey,
+      sourcePublicKey: request.sourcePublicKey,
+      timeoutInSeconds: request.timeoutInSeconds,
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/contracts/governance.contract.ts.html b/coverage/lcov-report/src/contracts/contracts/governance.contract.ts.html new file mode 100644 index 0000000..4f6c63e --- /dev/null +++ b/coverage/lcov-report/src/contracts/contracts/governance.contract.ts.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for src/contracts/contracts/governance.contract.ts + + + + + + + + + +
+
+

All files / src/contracts/contracts governance.contract.ts

+
+ +
+ 0% + Statements + 0/90 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/90 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import {
+  ContractCallDto,
+  ContractInvocationMode,
+} from '../dto/contract-call.dto';
+import { SorobanClientService } from '../soroban-client.service';
+import { ContractType } from '../entities/contract.entity';
+import {
+  ContractAdapter,
+  ContractCallResult,
+  ContractMethodMetadata,
+  ResolvedContractMetadata,
+} from './contract.types';
+
+@Injectable()
+export class GovernanceContract implements ContractAdapter {
+  readonly contractType = ContractType.GOVERNANCE;
+
+  private readonly methods: ContractMethodMetadata[] = [
+    {
+      method: 'createProposal',
+      chainMethod: 'create_proposal',
+      readOnly: false,
+      eventTopics: ['proposal_created'],
+    },
+    {
+      method: 'vote',
+      chainMethod: 'vote',
+      readOnly: false,
+      eventTopics: ['vote_cast'],
+    },
+    {
+      method: 'getProposal',
+      chainMethod: 'get_proposal',
+      readOnly: true,
+      cacheTtlMs: 5000,
+    },
+    {
+      method: 'getProposalStatus',
+      chainMethod: 'get_proposal_status',
+      readOnly: true,
+      cacheTtlMs: 5000,
+    },
+    {
+      method: 'executeProposal',
+      chainMethod: 'execute_proposal',
+      readOnly: false,
+      eventTopics: ['proposal_executed'],
+    },
+    {
+      method: 'getQuorum',
+      chainMethod: 'get_quorum',
+      readOnly: true,
+      cacheTtlMs: 30000,
+    },
+  ];
+
+  constructor(private readonly sorobanClient: SorobanClientService) {}
+
+  getMethodMetadata(): ContractMethodMetadata[] {
+    return this.methods;
+  }
+
+  supportsMethod(method: string): boolean {
+    return this.methods.some((candidate) => candidate.method === method);
+  }
+
+  async invoke(
+    metadata: ResolvedContractMetadata,
+    request: ContractCallDto,
+  ): Promise<ContractCallResult> {
+    const method = this.methods.find(
+      (candidate) => candidate.method === request.method,
+    );
+
+    return this.sorobanClient.invokeContract({
+      contractId: metadata.contractId,
+      contractType: this.contractType,
+      network: metadata.network,
+      method: method?.chainMethod || request.method,
+      args: request.args,
+      signAndSend:
+        request.mode === ContractInvocationMode.SIGNED || !method?.readOnly,
+      simulateOnly: request.simulateOnly,
+      signerSecretKey: request.signerSecretKey,
+      sourcePublicKey: request.sourcePublicKey,
+      timeoutInSeconds: request.timeoutInSeconds,
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/contracts/index.html b/coverage/lcov-report/src/contracts/contracts/index.html new file mode 100644 index 0000000..b6cfb2c --- /dev/null +++ b/coverage/lcov-report/src/contracts/contracts/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/contracts/contracts + + + + + + + + + +
+
+

All files src/contracts/contracts

+
+ +
+ 0% + Statements + 0/384 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/384 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
contract.types.ts +
+
0%0/1130%0/10%0/10%0/113
escrow.contract.ts +
+
0%0/900%0/10%0/10%0/90
governance.contract.ts +
+
0%0/900%0/10%0/10%0/90
token.contract.ts +
+
0%0/910%0/10%0/10%0/91
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/contracts/token.contract.ts.html b/coverage/lcov-report/src/contracts/contracts/token.contract.ts.html new file mode 100644 index 0000000..575e9f9 --- /dev/null +++ b/coverage/lcov-report/src/contracts/contracts/token.contract.ts.html @@ -0,0 +1,358 @@ + + + + + + Code coverage report for src/contracts/contracts/token.contract.ts + + + + + + + + + +
+
+

All files / src/contracts/contracts token.contract.ts

+
+ +
+ 0% + Statements + 0/91 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/91 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import {
+  ContractCallDto,
+  ContractInvocationMode,
+} from '../dto/contract-call.dto';
+import { SorobanClientService } from '../soroban-client.service';
+import { ContractType } from '../entities/contract.entity';
+import {
+  ContractAdapter,
+  ContractCallResult,
+  ContractMethodMetadata,
+  ResolvedContractMetadata,
+} from './contract.types';
+
+@Injectable()
+export class TokenContract implements ContractAdapter {
+  readonly contractType = ContractType.TOKEN;
+
+  private readonly methods: ContractMethodMetadata[] = [
+    {
+      method: 'balance',
+      chainMethod: 'balance',
+      readOnly: true,
+      cacheTtlMs: 10000,
+      eventTopics: ['transfer'],
+    },
+    {
+      method: 'allowance',
+      chainMethod: 'allowance',
+      readOnly: true,
+      cacheTtlMs: 10000,
+    },
+    {
+      method: 'decimals',
+      chainMethod: 'decimals',
+      readOnly: true,
+      cacheTtlMs: 60000,
+    },
+    {
+      method: 'symbol',
+      chainMethod: 'symbol',
+      readOnly: true,
+      cacheTtlMs: 60000,
+    },
+    {
+      method: 'transfer',
+      chainMethod: 'transfer',
+      readOnly: false,
+      eventTopics: ['transfer'],
+    },
+    {
+      method: 'approve',
+      chainMethod: 'approve',
+      readOnly: false,
+      eventTopics: ['approval'],
+    },
+  ];
+
+  constructor(private readonly sorobanClient: SorobanClientService) {}
+
+  getMethodMetadata(): ContractMethodMetadata[] {
+    return this.methods;
+  }
+
+  supportsMethod(method: string): boolean {
+    return this.methods.some((candidate) => candidate.method === method);
+  }
+
+  async invoke(
+    metadata: ResolvedContractMetadata,
+    request: ContractCallDto,
+  ): Promise<ContractCallResult> {
+    const method = this.methods.find(
+      (candidate) => candidate.method === request.method,
+    );
+
+    return this.sorobanClient.invokeContract({
+      contractId: metadata.contractId,
+      contractType: this.contractType,
+      network: metadata.network,
+      method: method?.chainMethod || request.method,
+      args: request.args,
+      signAndSend:
+        request.mode === ContractInvocationMode.SIGNED || !method?.readOnly,
+      simulateOnly: request.simulateOnly,
+      signerSecretKey: request.signerSecretKey,
+      sourcePublicKey: request.sourcePublicKey,
+      timeoutInSeconds: request.timeoutInSeconds,
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/deployer/deployer.service.ts.html b/coverage/lcov-report/src/contracts/deployer/deployer.service.ts.html new file mode 100644 index 0000000..24bf5d9 --- /dev/null +++ b/coverage/lcov-report/src/contracts/deployer/deployer.service.ts.html @@ -0,0 +1,568 @@ + + + + + + Code coverage report for src/contracts/deployer/deployer.service.ts + + + + + + + + + +
+
+

All files / src/contracts/deployer deployer.service.ts

+
+ +
+ 0% + Statements + 0/161 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/161 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { BadRequestException, Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  ContractDeploymentDto,
+  ContractUpgradeDto,
+} from '../dto/contract-call.dto';
+import {
+  ContractEntity,
+  ContractNetwork,
+  ContractStatus,
+} from '../entities/contract.entity';
+import {
+  ContractDeployer,
+  ContractDeploymentResult,
+} from '../contracts/contract.types';
+import { SorobanClientService } from '../soroban-client.service';
+
+@Injectable()
+export class DeployerService implements ContractDeployer {
+  private readonly logger = new Logger(DeployerService.name);
+
+  constructor(
+    @InjectRepository(ContractEntity)
+    private readonly contractRepository: Repository<ContractEntity>,
+    private readonly sorobanClient: SorobanClientService,
+  ) {}
+
+  async deployContract(
+    request: ContractDeploymentDto,
+  ): Promise<ContractDeploymentResult> {
+    const network = request.network || ContractNetwork.TESTNET;
+
+    if (!request.contractId && !request.prebuiltTransactionXdr) {
+      throw new BadRequestException(
+        'Deployment requires either a contractId or a prebuiltTransactionXdr.',
+      );
+    }
+
+    const gas = request.prebuiltTransactionXdr
+      ? await this.sorobanClient.estimatePreparedTransaction(
+          request.prebuiltTransactionXdr,
+          network,
+        )
+      : undefined;
+
+    const submission = request.prebuiltTransactionXdr
+      ? await this.sorobanClient.submitPreparedTransaction(
+          request.prebuiltTransactionXdr,
+          network,
+        )
+      : undefined;
+
+    const contractId =
+      request.contractId ||
+      submission?.contractId ||
+      submission?.result?.contractId;
+    if (!contractId) {
+      throw new BadRequestException(
+        'Unable to determine deployed contractId from deployment request.',
+      );
+    }
+
+    const version = request.version || new Date().toISOString();
+    const activeContract = await this.contractRepository.findOne({
+      where: {
+        contractType: request.contractType,
+        network,
+        isActive: true,
+      },
+    });
+
+    if (activeContract) {
+      activeContract.isActive = false;
+      activeContract.status = ContractStatus.INACTIVE;
+      await this.contractRepository.save(activeContract);
+    }
+
+    const entity = this.contractRepository.create({
+      contractType: request.contractType,
+      network,
+      contractId,
+      alias: request.alias,
+      version,
+      abi: request.abi,
+      metadata: request.metadata,
+      deploymentMetadata: {
+        ...request.deploymentMetadata,
+        submission,
+      },
+      deploymentTxHash:
+        request.deploymentTxHash || submission?.hash || submission?.id,
+      previousContractId: activeContract?.contractId,
+      deployedBy: request.signerSecretKey
+        ? 'runtime-signer'
+        : 'external-pipeline',
+      metadataCacheKey: `${request.contractType}:${network}:${version}`,
+      status: ContractStatus.ACTIVE,
+      isActive: true,
+    });
+
+    await this.contractRepository.save(entity);
+    this.logger.log(
+      `Registered ${request.contractType} contract ${contractId} on ${network} version ${version}`,
+    );
+
+    return {
+      success: true,
+      contractId,
+      contractType: request.contractType,
+      network,
+      version,
+      alias: request.alias,
+      transactionHash: entity.deploymentTxHash,
+      gas,
+      metadata: entity.metadata,
+    };
+  }
+
+  async upgradeContract(
+    request: ContractUpgradeDto,
+  ): Promise<ContractDeploymentResult> {
+    const existing = await this.contractRepository.findOne({
+      where: {
+        contractId: request.previousContractId,
+        network: request.network || ContractNetwork.TESTNET,
+      },
+    });
+
+    if (!existing) {
+      throw new BadRequestException(
+        `Cannot upgrade missing contract ${request.previousContractId}.`,
+      );
+    }
+
+    const result = await this.deployContract(request);
+    await this.contractRepository.update(
+      { id: existing.id },
+      {
+        isActive: request.activate === false,
+        status:
+          request.activate === false
+            ? ContractStatus.INACTIVE
+            : ContractStatus.DEPRECATED,
+        upgradeTxHash: result.transactionHash,
+      },
+    );
+
+    await this.contractRepository.update(
+      {
+        contractId: result.contractId,
+        network: result.network,
+      },
+      {
+        previousContractId: existing.contractId,
+      },
+    );
+
+    return result;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/deployer/index.html b/coverage/lcov-report/src/contracts/deployer/index.html new file mode 100644 index 0000000..46c17b8 --- /dev/null +++ b/coverage/lcov-report/src/contracts/deployer/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/contracts/deployer + + + + + + + + + +
+
+

All files src/contracts/deployer

+
+ +
+ 0% + Statements + 0/161 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/161 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
deployer.service.ts +
+
0%0/1610%0/10%0/10%0/161
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/dto/contract-call.dto.ts.html b/coverage/lcov-report/src/contracts/dto/contract-call.dto.ts.html new file mode 100644 index 0000000..363e337 --- /dev/null +++ b/coverage/lcov-report/src/contracts/dto/contract-call.dto.ts.html @@ -0,0 +1,484 @@ + + + + + + Code coverage report for src/contracts/dto/contract-call.dto.ts + + + + + + + + + +
+
+

All files / src/contracts/dto contract-call.dto.ts

+
+ +
+ 0% + Statements + 0/133 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/133 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsArray,
+  IsBoolean,
+  IsEnum,
+  IsNumber,
+  IsObject,
+  IsOptional,
+  IsString,
+  Min,
+} from 'class-validator';
+import { ContractNetwork, ContractType } from '../entities/contract.entity';
+
+export enum ContractInvocationMode {
+  READ_ONLY = 'read_only',
+  SIGNED = 'signed',
+}
+
+export class ContractCallDto {
+  @IsEnum(ContractType)
+  contractType: ContractType;
+
+  @IsString()
+  method: string;
+
+  @IsArray()
+  @IsOptional()
+  args?: unknown[];
+
+  @IsEnum(ContractInvocationMode)
+  @IsOptional()
+  mode?: ContractInvocationMode;
+
+  @IsEnum(ContractNetwork)
+  @IsOptional()
+  network?: ContractNetwork;
+
+  @IsBoolean()
+  @IsOptional()
+  simulateOnly?: boolean;
+
+  @IsString()
+  @IsOptional()
+  signerSecretKey?: string;
+
+  @IsString()
+  @IsOptional()
+  sourcePublicKey?: string;
+
+  @IsString()
+  @IsOptional()
+  correlationId?: string;
+
+  @IsString()
+  @IsOptional()
+  idempotencyKey?: string;
+
+  @IsBoolean()
+  @IsOptional()
+  useCache?: boolean;
+
+  @IsNumber()
+  @Min(1)
+  @IsOptional()
+  timeoutInSeconds?: number;
+}
+
+export class ContractEventListenerDto {
+  @IsEnum(ContractType)
+  contractType: ContractType;
+
+  @IsEnum(ContractNetwork)
+  @IsOptional()
+  network?: ContractNetwork;
+
+  @IsNumber()
+  @Min(0)
+  @IsOptional()
+  startLedger?: number;
+}
+
+export class ContractDeploymentDto {
+  @IsEnum(ContractType)
+  contractType: ContractType;
+
+  @IsEnum(ContractNetwork)
+  @IsOptional()
+  network?: ContractNetwork;
+
+  @IsString()
+  @IsOptional()
+  alias?: string;
+
+  @IsString()
+  @IsOptional()
+  version?: string;
+
+  @IsString()
+  @IsOptional()
+  contractId?: string;
+
+  @IsString()
+  @IsOptional()
+  prebuiltTransactionXdr?: string;
+
+  @IsString()
+  @IsOptional()
+  deploymentTxHash?: string;
+
+  @IsString()
+  @IsOptional()
+  signerSecretKey?: string;
+
+  @IsObject()
+  @IsOptional()
+  abi?: Record<string, any>;
+
+  @IsObject()
+  @IsOptional()
+  metadata?: Record<string, any>;
+
+  @IsObject()
+  @IsOptional()
+  deploymentMetadata?: Record<string, any>;
+}
+
+export class ContractUpgradeDto extends ContractDeploymentDto {
+  @IsString()
+  previousContractId: string;
+
+  @IsBoolean()
+  @IsOptional()
+  activate?: boolean;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/dto/index.html b/coverage/lcov-report/src/contracts/dto/index.html new file mode 100644 index 0000000..4377eca --- /dev/null +++ b/coverage/lcov-report/src/contracts/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/contracts/dto + + + + + + + + + +
+
+

All files src/contracts/dto

+
+ +
+ 0% + Statements + 0/133 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/133 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
contract-call.dto.ts +
+
0%0/1330%0/10%0/10%0/133
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/entities/contract.entity.ts.html b/coverage/lcov-report/src/contracts/entities/contract.entity.ts.html new file mode 100644 index 0000000..e48d8aa --- /dev/null +++ b/coverage/lcov-report/src/contracts/entities/contract.entity.ts.html @@ -0,0 +1,382 @@ + + + + + + Code coverage report for src/contracts/entities/contract.entity.ts + + + + + + + + + +
+
+

All files / src/contracts/entities contract.entity.ts

+
+ +
+ 0% + Statements + 0/99 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/99 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Column,
+  CreateDateColumn,
+  Entity,
+  Index,
+  PrimaryGeneratedColumn,
+  UpdateDateColumn,
+} from 'typeorm';
+
+export enum ContractType {
+  TOKEN = 'token',
+  ESCROW = 'escrow',
+  GOVERNANCE = 'governance',
+}
+
+export enum ContractNetwork {
+  TESTNET = 'testnet',
+  MAINNET = 'mainnet',
+}
+
+export enum ContractStatus {
+  ACTIVE = 'active',
+  INACTIVE = 'inactive',
+  DEPLOYING = 'deploying',
+  FAILED = 'failed',
+  DEPRECATED = 'deprecated',
+}
+
+@Entity('contracts')
+@Index(['contractType', 'network', 'isActive'])
+@Index(['contractId', 'network'])
+export class ContractEntity {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'enum', enum: ContractType })
+  contractType: ContractType;
+
+  @Column({ type: 'enum', enum: ContractNetwork })
+  network: ContractNetwork;
+
+  @Column()
+  contractId: string;
+
+  @Column({ nullable: true })
+  alias?: string;
+
+  @Column({ nullable: true })
+  version?: string;
+
+  @Column({ nullable: true })
+  specHash?: string;
+
+  @Column({ nullable: true })
+  metadataCacheKey?: string;
+
+  @Column({ nullable: true })
+  deploymentTxHash?: string;
+
+  @Column({ nullable: true })
+  upgradeTxHash?: string;
+
+  @Column({ nullable: true })
+  previousContractId?: string;
+
+  @Column({ nullable: true })
+  deployedBy?: string;
+
+  @Column({
+    type: 'enum',
+    enum: ContractStatus,
+    default: ContractStatus.ACTIVE,
+  })
+  status: ContractStatus;
+
+  @Column({ default: true })
+  isActive: boolean;
+
+  @Column({ type: 'json', nullable: true })
+  abi?: Record<string, any>;
+
+  @Column({ type: 'json', nullable: true })
+  metadata?: Record<string, any>;
+
+  @Column({ type: 'json', nullable: true })
+  deploymentMetadata?: Record<string, any>;
+
+  @Column({ type: 'bigint', nullable: true })
+  lastProcessedLedger?: string;
+
+  @Column({ type: 'timestamp', nullable: true })
+  lastEventAt?: Date;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/entities/index.html b/coverage/lcov-report/src/contracts/entities/index.html new file mode 100644 index 0000000..c06226b --- /dev/null +++ b/coverage/lcov-report/src/contracts/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/contracts/entities + + + + + + + + + +
+
+

All files src/contracts/entities

+
+ +
+ 0% + Statements + 0/99 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/99 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
contract.entity.ts +
+
0%0/990%0/10%0/10%0/99
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/index.html b/coverage/lcov-report/src/contracts/index.html new file mode 100644 index 0000000..aa05564 --- /dev/null +++ b/coverage/lcov-report/src/contracts/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/contracts + + + + + + + + + +
+
+

All files src/contracts

+
+ +
+ 0% + Statements + 0/795 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/795 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
contract.service.ts +
+
0%0/3870%0/10%0/10%0/387
contracts.module.ts +
+
0%0/300%0/10%0/10%0/30
soroban-client.service.ts +
+
0%0/3780%0/10%0/10%0/378
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/contracts/soroban-client.service.ts.html b/coverage/lcov-report/src/contracts/soroban-client.service.ts.html new file mode 100644 index 0000000..c6d6d79 --- /dev/null +++ b/coverage/lcov-report/src/contracts/soroban-client.service.ts.html @@ -0,0 +1,1219 @@ + + + + + + Code coverage report for src/contracts/soroban-client.service.ts + + + + + + + + + +
+
+

All files / src/contracts soroban-client.service.ts

+
+ +
+ 0% + Statements + 0/378 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/378 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  BadRequestException,
+  Inject,
+  Injectable,
+  Logger,
+  ServiceUnavailableException,
+} from '@nestjs/common';
+import { HttpService } from '@nestjs/axios';
+import type { ConfigType } from '@nestjs/config';
+import {
+  Contract,
+  Keypair,
+  TransactionBuilder,
+  nativeToScVal,
+  rpc,
+  scValToNative,
+} from '@stellar/stellar-sdk';
+import stellarConfig from '../config/stellar.config';
+import { CustomInstrumentation } from '../tracing/instrumentation/custom-instrumentation';
+import { ContractNetwork, ContractType } from './entities/contract.entity';
+import {
+  ContractCallResult,
+  ContractEventRecord,
+  GasEstimation,
+  InvokeContractRequest,
+} from './contracts/contract.types';
+
+type RpcMethod =
+  | 'getEvents'
+  | 'getHealth'
+  | 'getTransaction'
+  | 'sendTransaction'
+  | 'simulateTransaction';
+
+@Injectable()
+export class SorobanClientService {
+  private readonly logger = new Logger(SorobanClientService.name);
+  private readonly rpcServers = new Map<ContractNetwork, any>();
+
+  constructor(
+    private readonly httpService: HttpService,
+    @Inject(stellarConfig.KEY)
+    private readonly config: ConfigType<typeof stellarConfig>,
+    private readonly instrumentation: CustomInstrumentation,
+  ) {}
+
+  async invokeContract(
+    request: InvokeContractRequest,
+  ): Promise<ContractCallResult> {
+    return this.instrumentation.instrument(
+      'contracts.soroban.invoke',
+      async () => {
+        const startedAt = Date.now();
+        const { transaction, simulation } =
+          await this.prepareInvocation(request);
+        const gas = this.mapSimulationToGasEstimation(simulation);
+
+        if (request.simulateOnly || !request.signAndSend) {
+          return {
+            success: true,
+            contractId: request.contractId,
+            contractType: request.contractType,
+            network: request.network,
+            method: request.method,
+            simulated: true,
+            cached: false,
+            durationMs: Date.now() - startedAt,
+            result: this.normalizeSimulationResult(simulation),
+            gas,
+            raw: simulation,
+          };
+        }
+
+        const signerSecretKey =
+          request.signerSecretKey || this.config.sourceSecretKey;
+        if (!signerSecretKey) {
+          throw new BadRequestException(
+            'A signer secret key is required for signed Soroban invocations.',
+          );
+        }
+
+        const assembled = (rpc as any)
+          .assembleTransaction(transaction, simulation)
+          .build();
+        assembled.sign(Keypair.fromSecret(signerSecretKey));
+
+        const submission = await this.submitPreparedTransaction(
+          assembled.toXDR(),
+          request.network,
+        );
+        const transactionHash = submission.hash || submission.id;
+        const confirmation = transactionHash
+          ? await this.pollTransaction(request.network, transactionHash)
+          : undefined;
+
+        return {
+          success: true,
+          contractId: request.contractId,
+          contractType: request.contractType,
+          network: request.network,
+          method: request.method,
+          simulated: false,
+          cached: false,
+          durationMs: Date.now() - startedAt,
+          result:
+            confirmation?.resultXdr ||
+            this.normalizeSimulationResult(simulation),
+          gas,
+          transactionHash,
+          ledger: confirmation?.ledger,
+          raw: confirmation || submission,
+        };
+      },
+    );
+  }
+
+  async estimateGas(request: InvokeContractRequest): Promise<GasEstimation> {
+    const { simulation } = await this.prepareInvocation({
+      ...request,
+      signAndSend: false,
+      simulateOnly: true,
+    });
+
+    return this.mapSimulationToGasEstimation(simulation);
+  }
+
+  async estimatePreparedTransaction(
+    transactionXdr: string,
+    network: ContractNetwork,
+  ): Promise<GasEstimation> {
+    const simulation = await this.rpcRequest(network, 'simulateTransaction', {
+      transaction: transactionXdr,
+    });
+
+    return this.mapSimulationToGasEstimation(simulation);
+  }
+
+  async getContractEvents(
+    contractId: string,
+    contractType: ContractType,
+    network: ContractNetwork,
+    startLedger?: number,
+  ): Promise<ContractEventRecord[]> {
+    const response = await this.rpcRequest(network, 'getEvents', {
+      startLedger,
+      filters: [
+        {
+          type: 'contract',
+          contractIds: [contractId],
+        },
+      ],
+      pagination: {
+        limit: 100,
+      },
+    });
+
+    const events = response.events || response.records || [];
+
+    return events.map((event: Record<string, any>, index: number) => ({
+      id: `${event.ledger || event.ledgerSequence || 0}:${event.txHash || event.tx_hash || index}`,
+      contractId,
+      contractType,
+      network,
+      ledger: Number(event.ledger || event.ledgerSequence || 0),
+      transactionHash: event.txHash || event.tx_hash,
+      topic: (event.topic || event.topics || []).map((item: unknown) =>
+        String(item),
+      ),
+      payload: event.value || event.data || event,
+      timestamp: event.timestamp || new Date().toISOString(),
+      raw: event,
+    }));
+  }
+
+  async submitPreparedTransaction(
+    transactionXdr: string,
+    network: ContractNetwork,
+  ): Promise<Record<string, any>> {
+    return this.rpcRequest(network, 'sendTransaction', {
+      transaction: transactionXdr,
+    });
+  }
+
+  async getRpcHealth(network: ContractNetwork): Promise<Record<string, any>> {
+    try {
+      return await this.rpcRequest(network, 'getHealth', {});
+    } catch (error) {
+      this.logger.warn(
+        `Soroban RPC health check failed for ${network}: ${error.message}`,
+      );
+      throw new ServiceUnavailableException(
+        `Soroban RPC health check failed for ${network}`,
+      );
+    }
+  }
+
+  private async prepareInvocation(
+    request: InvokeContractRequest,
+  ): Promise<{ transaction: any; simulation: Record<string, any> }> {
+    const account = await this.getRpcServer(request.network).getAccount(
+      this.resolveSourcePublicKey(
+        request.sourcePublicKey,
+        request.signerSecretKey,
+      ),
+    );
+
+    const contract = new Contract(request.contractId);
+    const timeout = request.timeoutInSeconds || 30;
+    const transaction = new TransactionBuilder(account, {
+      fee: '100',
+      networkPassphrase: this.getNetworkConfig(request.network)
+        .networkPassphrase,
+    })
+      .addOperation(
+        contract.call(
+          request.method,
+          ...(request.args || []).map((arg) => this.toScVal(arg)),
+        ),
+      )
+      .setTimeout(timeout)
+      .build();
+
+    const simulation = await this.getRpcServer(
+      request.network,
+    ).simulateTransaction(transaction);
+    if ((simulation as Record<string, any>).error) {
+      throw new ServiceUnavailableException(
+        (simulation as Record<string, any>).error,
+      );
+    }
+
+    return { transaction, simulation };
+  }
+
+  private getRpcServer(network: ContractNetwork): any {
+    if (!this.rpcServers.has(network)) {
+      const sorobanRpcUrl = this.getNetworkConfig(network).sorobanRpcUrl;
+      this.rpcServers.set(
+        network,
+        new (rpc as any).Server(sorobanRpcUrl, {
+          allowHttp: sorobanRpcUrl.startsWith('http://'),
+        }),
+      );
+    }
+
+    return this.rpcServers.get(network);
+  }
+
+  private getNetworkConfig(network: ContractNetwork) {
+    return this.config.networks[network];
+  }
+
+  private resolveSourcePublicKey(
+    sourcePublicKey?: string,
+    signerSecretKey?: string,
+  ): string {
+    if (sourcePublicKey) {
+      return sourcePublicKey;
+    }
+
+    if (signerSecretKey) {
+      return Keypair.fromSecret(signerSecretKey).publicKey();
+    }
+
+    if (this.config.sourceSecretKey) {
+      return Keypair.fromSecret(this.config.sourceSecretKey).publicKey();
+    }
+
+    if (this.config.sourcePublicKey) {
+      return this.config.sourcePublicKey;
+    }
+
+    throw new BadRequestException(
+      'STELLAR_SOURCE_PUBLIC_KEY or STELLAR_SOURCE_SECRET_KEY must be configured.',
+    );
+  }
+
+  private toScVal(value: unknown) {
+    if (value === undefined) {
+      return nativeToScVal(null);
+    }
+
+    if (typeof value === 'bigint') {
+      return nativeToScVal(value.toString());
+    }
+
+    return nativeToScVal(value as any);
+  }
+
+  private normalizeSimulationResult(simulation: Record<string, any>): unknown {
+    try {
+      if (simulation.result?.retval) {
+        return scValToNative(simulation.result.retval);
+      }
+
+      if (simulation.results?.[0]?.xdr) {
+        return simulation.results[0].xdr;
+      }
+    } catch (error) {
+      this.logger.debug(
+        `Falling back to raw simulation result: ${error.message}`,
+      );
+    }
+
+    return simulation.result || simulation.results || simulation;
+  }
+
+  private mapSimulationToGasEstimation(
+    simulation: Record<string, any>,
+  ): GasEstimation {
+    const cost = simulation.cost || simulation.transactionData?.resources || {};
+    const minResourceFee =
+      simulation.minResourceFee || simulation.min_resource_fee;
+
+    return {
+      cpuInstructions: Number(cost.cpuInsns || cost.cpuInstructions || 0),
+      readBytes: Number(cost.memBytes || cost.readBytes || 0),
+      writeBytes: Number(cost.writeBytes || 0),
+      minResourceFee: minResourceFee ? String(minResourceFee) : undefined,
+      recommendedFee: minResourceFee
+        ? String(Math.ceil(Number(minResourceFee) * 1.1))
+        : undefined,
+    };
+  }
+
+  private async rpcRequest(
+    network: ContractNetwork,
+    method: RpcMethod,
+    params: Record<string, any>,
+  ): Promise<Record<string, any>> {
+    const endpoint = this.getNetworkConfig(network).sorobanRpcUrl;
+    const response = await this.httpService.axiosRef.post(
+      endpoint,
+      {
+        jsonrpc: '2.0',
+        id: `${method}-${Date.now()}`,
+        method,
+        params,
+      },
+      {
+        timeout: this.config.rpcTimeoutMs,
+      },
+    );
+
+    if (response.data?.error) {
+      throw new ServiceUnavailableException(
+        response.data.error.message || `Soroban RPC method ${method} failed.`,
+      );
+    }
+
+    return response.data?.result || response.data;
+  }
+
+  private async pollTransaction(
+    network: ContractNetwork,
+    transactionHash: string,
+  ): Promise<Record<string, any> | undefined> {
+    const deadline = Date.now() + this.config.submissionTimeoutMs;
+
+    while (Date.now() < deadline) {
+      const transaction = await this.rpcRequest(network, 'getTransaction', {
+        hash: transactionHash,
+      });
+
+      if (
+        transaction.status &&
+        transaction.status !== 'NOT_FOUND' &&
+        transaction.status !== 'PENDING'
+      ) {
+        return transaction;
+      }
+
+      await new Promise((resolve) => setTimeout(resolve, 1000));
+    }
+
+    return undefined;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/compliance/index.html b/coverage/lcov-report/src/cross-border/compliance/index.html new file mode 100644 index 0000000..64fe546 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/compliance/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border/compliance + + + + + + + + + +
+
+

All files src/cross-border/compliance

+
+ +
+ 96.86% + Statements + 432/446 +
+ + +
+ 90.19% + Branches + 46/51 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 96.86% + Lines + 432/446 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
regulation-service.ts +
+
96.86%432/44690.19%46/51100%11/1196.86%432/446
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/compliance/regulation-service.ts.html b/coverage/lcov-report/src/cross-border/compliance/regulation-service.ts.html new file mode 100644 index 0000000..6606179 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/compliance/regulation-service.ts.html @@ -0,0 +1,1423 @@ + + + + + + Code coverage report for src/cross-border/compliance/regulation-service.ts + + + + + + + + + +
+
+

All files / src/cross-border/compliance regulation-service.ts

+
+ +
+ 96.86% + Statements + 432/446 +
+ + +
+ 90.19% + Branches + 46/51 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 96.86% + Lines + 432/446 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +4471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +18x +18x +1x +1x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +180x +18x +18x +18x +18x +18x +18x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +78x +78x +78x +78x +78x +78x +78x +78x +78x +78x +78x +78x +13x +13x +78x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +1x +1x +14x +14x +14x +14x +14x +14x +14x +140x +140x +140x +140x +140x +140x +140x +140x +140x +140x +78x +78x +140x +14x +14x +14x +1x +1x +78x +78x +78x +78x +78x +78x +6x +6x +6x +6x +6x +6x +6x +72x +78x +  +  +  +  +  +  +72x +78x +  +  +  +  +  +  +  +72x +72x +72x +72x +72x +78x +8x +8x +78x +7x +7x +7x +72x +72x +72x +72x +72x +72x +72x +72x +1x +1x +14x +14x +14x +14x +14x +14x +7x +7x +5x +7x +2x +2x +14x +1x +1x +14x +14x +78x +78x +30x +78x +3x +78x +29x +78x +14x +78x +2x +78x +  +78x +14x +14x +14x +14x +1x +1x +78x +78x +78x +30x +78x +3x +78x +29x +78x +16x +78x +78x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +3x +3x +30x +3x +3x +3x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+ 
+export interface RegulationRule {
+  code: string;
+  name: string;
+  description: string;
+  applicableCountries: string[];
+  requiredDocuments: string[];
+  complianceChecks: string[];
+  energyTypes: string[];
+  minAmount?: number;
+  maxAmount?: number;
+  frequency: 'once' | 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'annual';
+}
+ 
+export interface ComplianceCheck {
+  ruleCode: string;
+  status: 'pass' | 'fail' | 'warning';
+  details: string;
+  requiredAction?: string;
+  deadline?: Date;
+}
+ 
+export interface ComplianceResult {
+  overallStatus: 'compliant' | 'non_compliant' | 'pending_review';
+  checks: ComplianceCheck[];
+  requiredDocuments: string[];
+  warnings: string[];
+  nextReviewDate?: Date;
+}
+ 
+@Injectable()
+export class RegulationService {
+  private readonly logger = new Logger(RegulationService.name);
+  private readonly regulations: Map<string, RegulationRule> = new Map();
+ 
+  constructor(private configService: ConfigService) {
+    this.initializeRegulations();
+  }
+ 
+  private initializeRegulations(): void {
+    const regulations: RegulationRule[] = [
+      {
+        code: 'EU_RENEWABLE_ENERGY_DIRECTIVE',
+        name: 'EU Renewable Energy Directive',
+        description: 'Compliance for renewable energy trading within EU',
+        applicableCountries: [
+          'DE',
+          'FR',
+          'IT',
+          'ES',
+          'NL',
+          'BE',
+          'AT',
+          'PT',
+          'FI',
+          'GR',
+        ],
+        requiredDocuments: [
+          'renewable_certificate',
+          'origin_certificate',
+          'quality_certificate',
+        ],
+        complianceChecks: [
+          'renewable_percentage',
+          'carbon_footprint',
+          'sustainability_criteria',
+        ],
+        energyTypes: ['solar', 'wind', 'hydro', 'biomass'],
+        frequency: 'daily',
+      },
+      {
+        code: 'US_FERC_REGULATIONS',
+        name: 'US FERC Energy Trading Regulations',
+        description:
+          'Federal Energy Regulatory Commission compliance for US energy trading',
+        applicableCountries: ['US'],
+        requiredDocuments: [
+          'ferc_license',
+          'market_participant_agreement',
+          'compliance_certificate',
+        ],
+        complianceChecks: [
+          'market_manipulation',
+          'reporting_requirements',
+          'transmission_access',
+        ],
+        energyTypes: ['electricity', 'natural_gas', 'oil'],
+        frequency: 'daily',
+      },
+      {
+        code: 'ISO_50001_ENERGY_MANAGEMENT',
+        name: 'ISO 50001 Energy Management Standard',
+        description: 'International standard for energy management systems',
+        applicableCountries: ['*'],
+        requiredDocuments: [
+          'energy_policy',
+          'energy_audit',
+          'management_review',
+        ],
+        complianceChecks: [
+          'energy_baseline',
+          'performance_indicators',
+          'continuous_improvement',
+        ],
+        energyTypes: ['*'],
+        frequency: 'monthly',
+      },
+      {
+        code: 'IEA_REPORTING_STANDARDS',
+        name: 'IEA Energy Reporting Standards',
+        description: 'International Energy Agency reporting requirements',
+        applicableCountries: ['*'],
+        requiredDocuments: [
+          'production_report',
+          'consumption_report',
+          'trade_statistics',
+        ],
+        complianceChecks: ['data_accuracy', 'timeliness', 'completeness'],
+        energyTypes: ['*'],
+        frequency: 'monthly',
+      },
+      {
+        code: 'CROSS_BORDER_EU_DIRECTIVE',
+        name: 'EU Cross-Border Electricity Trading Directive',
+        description: 'EU directive for cross-border electricity trading',
+        applicableCountries: [
+          'DE',
+          'FR',
+          'IT',
+          'ES',
+          'NL',
+          'BE',
+          'AT',
+          'PT',
+          'FI',
+          'GR',
+        ],
+        requiredDocuments: [
+          'cross_border_license',
+          'capacity_allocation',
+          'congestion_management',
+        ],
+        complianceChecks: [
+          'capacity_allocation',
+          'market_coupling',
+          'price_convergence',
+        ],
+        energyTypes: ['electricity'],
+        frequency: 'daily',
+      },
+      {
+        code: 'WORLD_BANK_CLIMATE',
+        name: 'World Bank Climate Standards',
+        description: 'Climate-related financial disclosure standards',
+        applicableCountries: ['*'],
+        requiredDocuments: [
+          'climate_risk_assessment',
+          'carbon_footprint',
+          'adaptation_strategy',
+        ],
+        complianceChecks: [
+          'climate_risk',
+          'carbon_accounting',
+          'transition_plan',
+        ],
+        energyTypes: ['*'],
+        frequency: 'quarterly',
+      },
+      {
+        code: 'OIL_AND_GAS_PROTOCOL',
+        name: 'Oil and Gas Industry Protocol',
+        description: 'International standards for oil and gas trading',
+        applicableCountries: ['*'],
+        requiredDocuments: [
+          'quality_specification',
+          'safety_certificate',
+          'environmental_impact',
+        ],
+        complianceChecks: [
+          'quality_standards',
+          'safety_protocols',
+          'environmental_compliance',
+        ],
+        energyTypes: ['oil', 'natural_gas'],
+        frequency: 'weekly',
+      },
+      {
+        code: 'RENEWABLE_PORTFOLIO_STANDARD',
+        name: 'Renewable Portfolio Standard',
+        description: 'Requirements for renewable energy portfolio composition',
+        applicableCountries: ['US', 'CA', 'AU'],
+        requiredDocuments: [
+          'portfolio_composition',
+          'renewable_credits',
+          'compliance_report',
+        ],
+        complianceChecks: [
+          'renewable_percentage',
+          'credit_tracking',
+          'annual_compliance',
+        ],
+        energyTypes: ['solar', 'wind', 'hydro', 'biomass', 'geothermal'],
+        frequency: 'annual',
+      },
+      {
+        code: 'CARBON_PRICING_MECHANISM',
+        name: 'Carbon Pricing Mechanism Compliance',
+        description: 'Compliance with carbon pricing and emissions trading',
+        applicableCountries: ['EU', 'CA', 'JP', 'KR', 'NZ'],
+        requiredDocuments: [
+          'emissions_report',
+          'carbon_credits',
+          'allowance_allocation',
+        ],
+        complianceChecks: [
+          'emissions_calculation',
+          'credit_validity',
+          'price_compliance',
+        ],
+        energyTypes: ['*'],
+        frequency: 'monthly',
+      },
+      {
+        code: 'INTERNATIONAL_SANCTIONS',
+        name: 'International Trade Sanctions Compliance',
+        description: 'Compliance with international trade sanctions',
+        applicableCountries: ['*'],
+        requiredDocuments: [
+          'sanctions_screening',
+          'license_verification',
+          'end_user_certificate',
+        ],
+        complianceChecks: [
+          'sanctioned_entities',
+          'restricted_countries',
+          'license_validity',
+        ],
+        energyTypes: ['*'],
+        frequency: 'daily',
+      },
+    ];
+ 
+    regulations.forEach((regulation) => {
+      this.regulations.set(regulation.code, regulation);
+    });
+ 
+    this.logger.log(
+      `Initialized ${regulations.length} international energy regulations`,
+    );
+  }
+ 
+  async checkCompliance(
+    sourceCountry: string,
+    targetCountry: string,
+    energyType: string,
+    amount: number,
+    transactionType: string,
+  ): Promise<ComplianceResult> {
+    this.logger.log(
+      `Checking compliance for ${sourceCountry} -> ${targetCountry} transaction: ${energyType}, $${amount}`,
+    );
+ 
+    const applicableRegulations = this.getApplicableRegulations(
+      sourceCountry,
+      targetCountry,
+      energyType,
+    );
+    const checks: ComplianceCheck[] = [];
+    const requiredDocuments: string[] = [];
+    const warnings: string[] = [];
+ 
+    for (const regulation of applicableRegulations) {
+      const check = await this.performComplianceCheck(regulation, {
+        sourceCountry,
+        targetCountry,
+        energyType,
+        amount,
+        transactionType,
+      });
+ 
+      checks.push(check);
+      requiredDocuments.push(...regulation.requiredDocuments);
+ 
+      if (check.status === 'warning') {
+        warnings.push(`Warning for ${regulation.code}: ${check.details}`);
+      }
+    }
+ 
+    const overallStatus = this.determineOverallStatus(checks);
+    const nextReviewDate = this.calculateNextReviewDate(applicableRegulations);
+ 
+    return {
+      overallStatus,
+      checks,
+      requiredDocuments: [...new Set(requiredDocuments)],
+      warnings,
+      nextReviewDate,
+    };
+  }
+ 
+  private getApplicableRegulations(
+    sourceCountry: string,
+    targetCountry: string,
+    energyType: string,
+  ): RegulationRule[] {
+    const applicable: RegulationRule[] = [];
+ 
+    for (const regulation of this.regulations.values()) {
+      const isCountryApplicable =
+        regulation.applicableCountries.includes('*') ||
+        regulation.applicableCountries.includes(sourceCountry) ||
+        regulation.applicableCountries.includes(targetCountry);
+ 
+      const isEnergyTypeApplicable =
+        regulation.energyTypes.includes('*') ||
+        regulation.energyTypes.includes(energyType);
+ 
+      if (isCountryApplicable && isEnergyTypeApplicable) {
+        applicable.push(regulation);
+      }
+    }
+ 
+    return applicable;
+  }
+ 
+  private async performComplianceCheck(
+    regulation: RegulationRule,
+    transactionData: any,
+  ): Promise<ComplianceCheck> {
+    const { amount } = transactionData;
+ 
+    if (amount < 1000) {
+      return {
+        ruleCode: regulation.code,
+        status: 'warning',
+        details: `Transaction amount $${amount} is below minimum threshold $1000`,
+        deadline: this.calculateDeadline(regulation.frequency),
+      };
+    }
+ 
+    if (regulation.minAmount && amount < regulation.minAmount) {
+      return {
+        ruleCode: regulation.code,
+        status: 'pass',
+        details: `Transaction amount $${amount} is below minimum threshold $${regulation.minAmount}`,
+      };
+    }
+ 
+    if (regulation.maxAmount && amount > regulation.maxAmount) {
+      return {
+        ruleCode: regulation.code,
+        status: 'fail',
+        details: `Transaction amount $${amount} exceeds maximum threshold $${regulation.maxAmount}`,
+        requiredAction: 'Reduce transaction amount or obtain special approval',
+      };
+    }
+ 
+    const randomCheck = Math.random();
+    let status: 'pass' | 'fail' | 'warning' = 'pass';
+    let details = `Compliance check passed for ${regulation.name}`;
+ 
+    if (randomCheck < 0.1) {
+      status = 'fail';
+      details = `Compliance check failed for ${regulation.name}`;
+    } else if (randomCheck < 0.2) {
+      status = 'warning';
+      details = `Warning issued for ${regulation.name} - additional review recommended`;
+    }
+ 
+    return {
+      ruleCode: regulation.code,
+      status,
+      details,
+      deadline: this.calculateDeadline(regulation.frequency),
+    };
+  }
+ 
+  private determineOverallStatus(
+    checks: ComplianceCheck[],
+  ): 'compliant' | 'non_compliant' | 'pending_review' {
+    const hasFailures = checks.some((check) => check.status === 'fail');
+    const hasWarnings = checks.some((check) => check.status === 'warning');
+ 
+    if (hasFailures) {
+      return 'non_compliant';
+    } else if (hasWarnings) {
+      return 'pending_review';
+    } else {
+      return 'compliant';
+    }
+  }
+ 
+  private calculateNextReviewDate(regulations: RegulationRule[]): Date {
+    const now = new Date();
+    const reviewDates = regulations.map((regulation) => {
+      switch (regulation.frequency) {
+        case 'daily':
+          return new Date(now.getTime() + 24 * 60 * 60 * 1000);
+        case 'weekly':
+          return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
+        case 'monthly':
+          return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);
+        case 'quarterly':
+          return new Date(now.getTime() + 90 * 24 * 60 * 60 * 1000);
+        case 'annual':
+          return new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000);
+        default:
+          return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);
+      }
+    });
+ 
+    return new Date(Math.min(...reviewDates.map((date) => date.getTime())));
+  }
+ 
+  private calculateDeadline(frequency: string): Date {
+    const now = new Date();
+    switch (frequency) {
+      case 'daily':
+        return new Date(now.getTime() + 24 * 60 * 60 * 1000);
+      case 'weekly':
+        return new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
+      case 'monthly':
+        return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);
+      default:
+        return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);
+    }
+  }
+ 
+  getRegulationByCode(code: string): RegulationRule | undefined {
+    return this.regulations.get(code);
+  }
+ 
+  getAllRegulations(): RegulationRule[] {
+    return Array.from(this.regulations.values());
+  }
+ 
+  getRegulationsByCountry(country: string): RegulationRule[] {
+    return Array.from(this.regulations.values()).filter(
+      (regulation) =>
+        regulation.applicableCountries.includes('*') ||
+        regulation.applicableCountries.includes(country),
+    );
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/controller/cross-border.controller.ts.html b/coverage/lcov-report/src/cross-border/controller/cross-border.controller.ts.html new file mode 100644 index 0000000..287878d --- /dev/null +++ b/coverage/lcov-report/src/cross-border/controller/cross-border.controller.ts.html @@ -0,0 +1,1123 @@ + + + + + + Code coverage report for src/cross-border/controller/cross-border.controller.ts + + + + + + + + + +
+
+

All files / src/cross-border/controller cross-border.controller.ts

+
+ +
+ 0% + Statements + 0/346 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/346 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Controller,
+  Post,
+  Get,
+  Put,
+  Delete,
+  Body,
+  Param,
+  Query,
+  HttpCode,
+  HttpStatus,
+  ValidationPipe,
+} from '@nestjs/common';
+import {
+  ApiTags,
+  ApiOperation,
+  ApiResponse,
+  ApiParam,
+  ApiQuery,
+} from '@nestjs/swagger';
+import {
+  TransactionProcessorService,
+  ProcessingResult,
+} from '../transactions/transaction-processor.service';
+import { RegulationService } from '../compliance/regulation-service';
+import { CurrencyService } from '../currency/currency-service';
+import { CustomsService } from '../tariffs/customs-service';
+import { RegulatoryReportService } from '../reporting/regulatory-report.service';
+import {
+  CreateInternationalTradeDto,
+  UpdateInternationalTradeDto,
+  FilterInternationalTradeDto,
+} from '../dto/international-trade.dto';
+
+@ApiTags('Cross-Border Energy Trading')
+@Controller('cross-border')
+export class CrossBorderController {
+  constructor(
+    private readonly transactionProcessor: TransactionProcessorService,
+    private readonly regulationService: RegulationService,
+    private readonly currencyService: CurrencyService,
+    private readonly customsService: CustomsService,
+    private readonly reportService: RegulatoryReportService,
+  ) {}
+
+  @Post('transactions')
+  @HttpCode(HttpStatus.CREATED)
+  @ApiOperation({ summary: 'Create a new cross-border energy transaction' })
+  @ApiResponse({ status: 201, description: 'Transaction created successfully' })
+  @ApiResponse({ status: 400, description: 'Invalid transaction data' })
+  @ApiResponse({ status: 500, description: 'Internal server error' })
+  async createTransaction(
+    @Body(ValidationPipe) transactionData: CreateInternationalTradeDto,
+  ): Promise<ProcessingResult> {
+    return this.transactionProcessor.processTransaction(transactionData);
+  }
+
+  @Post('transactions/batch')
+  @HttpCode(HttpStatus.CREATED)
+  @ApiOperation({ summary: 'Process multiple transactions in batch' })
+  @ApiResponse({ status: 201, description: 'Batch processed successfully' })
+  async processBatchTransactions(
+    @Body(ValidationPipe) transactions: CreateInternationalTradeDto[],
+  ): Promise<ProcessingResult[]> {
+    return this.transactionProcessor.processBatchTransactions(transactions);
+  }
+
+  @Get('transactions/:transactionId')
+  @ApiOperation({ summary: 'Get transaction by ID' })
+  @ApiParam({ name: 'transactionId', description: 'Transaction ID' })
+  @ApiResponse({ status: 200, description: 'Transaction found' })
+  @ApiResponse({ status: 404, description: 'Transaction not found' })
+  async getTransaction(@Param('transactionId') transactionId: string) {
+    return this.transactionProcessor.getTransactionById(transactionId);
+  }
+
+  @Get('transactions')
+  @ApiOperation({ summary: 'Get transactions with filters' })
+  @ApiQuery({ name: 'sourceCountry', required: false })
+  @ApiQuery({ name: 'targetCountry', required: false })
+  @ApiQuery({ name: 'status', required: false })
+  @ApiQuery({ name: 'energyType', required: false })
+  @ApiResponse({
+    status: 200,
+    description: 'Transactions retrieved successfully',
+  })
+  async getTransactions(@Query() filters: FilterInternationalTradeDto) {
+    if (filters.sourceCountry && filters.targetCountry) {
+      return this.transactionProcessor.getTransactionsByCountries(
+        filters.sourceCountry,
+        filters.targetCountry,
+      );
+    }
+
+    return this.transactionProcessor.getTransactionsByStatus(
+      filters.status as any,
+    );
+  }
+
+  @Put('transactions/:transactionId')
+  @ApiOperation({ summary: 'Update transaction' })
+  @ApiParam({ name: 'transactionId', description: 'Transaction ID' })
+  @ApiResponse({ status: 200, description: 'Transaction updated successfully' })
+  async updateTransaction(
+    @Param('transactionId') transactionId: string,
+    @Body(ValidationPipe) updateData: UpdateInternationalTradeDto,
+  ) {
+    // Implementation would update the transaction
+    return { message: 'Transaction updated successfully', transactionId };
+  }
+
+  @Post('transactions/:transactionId/retry')
+  @ApiOperation({ summary: 'Retry failed transaction' })
+  @ApiParam({ name: 'transactionId', description: 'Transaction ID' })
+  @ApiResponse({ status: 200, description: 'Transaction retry initiated' })
+  async retryTransaction(
+    @Param('transactionId') transactionId: string,
+  ): Promise<ProcessingResult> {
+    return this.transactionProcessor.retryFailedTransaction(transactionId);
+  }
+
+  @Post('transactions/:transactionId/cancel')
+  @ApiOperation({ summary: 'Cancel transaction' })
+  @ApiParam({ name: 'transactionId', description: 'Transaction ID' })
+  @ApiResponse({
+    status: 200,
+    description: 'Transaction cancelled successfully',
+  })
+  async cancelTransaction(
+    @Param('transactionId') transactionId: string,
+    @Body('reason') reason?: string,
+  ) {
+    return this.transactionProcessor.cancelTransaction(transactionId, reason);
+  }
+
+  @Get('compliance/check')
+  @ApiOperation({ summary: 'Check compliance for a potential transaction' })
+  @ApiQuery({ name: 'sourceCountry', description: 'Source country code' })
+  @ApiQuery({ name: 'targetCountry', description: 'Target country code' })
+  @ApiQuery({ name: 'energyType', description: 'Type of energy' })
+  @ApiQuery({ name: 'amount', description: 'Transaction amount' })
+  @ApiQuery({ name: 'transactionType', description: 'Type of transaction' })
+  @ApiResponse({ status: 200, description: 'Compliance check completed' })
+  async checkCompliance(
+    @Query('sourceCountry') sourceCountry: string,
+    @Query('targetCountry') targetCountry: string,
+    @Query('energyType') energyType: string,
+    @Query('amount') amount: number,
+    @Query('transactionType') transactionType: string,
+  ) {
+    return this.regulationService.checkCompliance(
+      sourceCountry,
+      targetCountry,
+      energyType,
+      amount,
+      transactionType,
+    );
+  }
+
+  @Get('compliance/regulations')
+  @ApiOperation({ summary: 'Get all available regulations' })
+  @ApiResponse({
+    status: 200,
+    description: 'Regulations retrieved successfully',
+  })
+  async getRegulations() {
+    return this.regulationService.getAllRegulations();
+  }
+
+  @Get('compliance/regulations/:country')
+  @ApiOperation({ summary: 'Get regulations by country' })
+  @ApiParam({ name: 'country', description: 'Country code' })
+  @ApiResponse({
+    status: 200,
+    description: 'Country regulations retrieved successfully',
+  })
+  async getRegulationsByCountry(@Param('country') country: string) {
+    return this.regulationService.getRegulationsByCountry(country);
+  }
+
+  @Post('currency/convert')
+  @ApiOperation({ summary: 'Convert currency' })
+  @ApiResponse({ status: 200, description: 'Currency converted successfully' })
+  async convertCurrency(
+    @Body('amount') amount: number,
+    @Body('fromCurrency') fromCurrency: string,
+    @Body('toCurrency') toCurrency: string,
+  ) {
+    return this.currencyService.convertCurrency(
+      amount,
+      fromCurrency,
+      toCurrency,
+    );
+  }
+
+  @Get('currency/supported')
+  @ApiOperation({ summary: 'Get supported currencies' })
+  @ApiResponse({
+    status: 200,
+    description: 'Supported currencies retrieved successfully',
+  })
+  async getSupportedCurrencies() {
+    return this.currencyService.getSupportedCurrencies();
+  }
+
+  @Get('currency/rates/:fromCurrency/:toCurrency')
+  @ApiOperation({ summary: 'Get exchange rate history' })
+  @ApiParam({ name: 'fromCurrency', description: 'Source currency' })
+  @ApiParam({ name: 'toCurrency', description: 'Target currency' })
+  @ApiResponse({
+    status: 200,
+    description: 'Exchange rate history retrieved successfully',
+  })
+  async getExchangeRateHistory(
+    @Param('fromCurrency') fromCurrency: string,
+    @Param('toCurrency') toCurrency: string,
+  ) {
+    return this.currencyService.getExchangeRateHistory(
+      fromCurrency,
+      toCurrency,
+    );
+  }
+
+  @Post('customs/calculate')
+  @ApiOperation({ summary: 'Calculate customs and tariffs' })
+  @ApiResponse({ status: 200, description: 'Customs calculation completed' })
+  async calculateCustoms(
+    @Body('sourceCountry') sourceCountry: string,
+    @Body('targetCountry') targetCountry: string,
+    @Body('amount') amount: number,
+    @Body('currency') currency: string,
+    @Body('energyType') energyType: string,
+    @Body('customsData') customsData?: any,
+  ) {
+    return this.customsService.calculateCustomsAndTariffs(
+      sourceCountry,
+      targetCountry,
+      amount,
+      currency,
+      energyType,
+      customsData,
+    );
+  }
+
+  @Get('customs/tariffs/:energyType')
+  @ApiOperation({ summary: 'Get tariff rates by energy type' })
+  @ApiParam({ name: 'energyType', description: 'Energy type' })
+  @ApiResponse({
+    status: 200,
+    description: 'Tariff rates retrieved successfully',
+  })
+  async getTariffRates(@Param('energyType') energyType: string) {
+    return this.customsService.getTariffRatesByEnergyType(energyType);
+  }
+
+  @Get('customs/rules/:sourceCountry/:targetCountry')
+  @ApiOperation({ summary: 'Get customs rules for country pair' })
+  @ApiParam({ name: 'sourceCountry', description: 'Source country' })
+  @ApiParam({ name: 'targetCountry', description: 'Target country' })
+  @ApiResponse({
+    status: 200,
+    description: 'Customs rules retrieved successfully',
+  })
+  async getCustomsRules(
+    @Param('sourceCountry') sourceCountry: string,
+    @Param('targetCountry') targetCountry: string,
+  ) {
+    return this.customsService.getCustomsRulesByCountryPair(
+      sourceCountry,
+      targetCountry,
+    );
+  }
+
+  @Post('reports/generate')
+  @ApiOperation({ summary: 'Generate regulatory report' })
+  @ApiResponse({ status: 201, description: 'Report generated successfully' })
+  async generateReport(
+    @Body('reportType') reportType: string,
+    @Body('startDate') startDate: string,
+    @Body('endDate') endDate: string,
+    @Body('jurisdiction') jurisdiction?: string,
+  ) {
+    const start = new Date(startDate);
+    const end = new Date(endDate);
+    return this.reportService.generateReport(
+      reportType,
+      start,
+      end,
+      jurisdiction,
+    );
+  }
+
+  @Post('reports/:reportId/submit')
+  @ApiOperation({ summary: 'Submit regulatory report' })
+  @ApiParam({ name: 'reportId', description: 'Report ID' })
+  @ApiResponse({ status: 200, description: 'Report submitted successfully' })
+  async submitReport(@Param('reportId') reportId: string) {
+    return this.reportService.submitReport(reportId);
+  }
+
+  @Get('reports')
+  @ApiOperation({ summary: 'Get reports by status' })
+  @ApiQuery({ name: 'status', required: false })
+  @ApiResponse({ status: 200, description: 'Reports retrieved successfully' })
+  async getReports(@Query('status') status?: string) {
+    if (status) {
+      return this.reportService.getReportsByStatus(status as any);
+    }
+    return this.reportService.getReportTemplates();
+  }
+
+  @Get('reports/submissions/:submissionId')
+  @ApiOperation({ summary: 'Get submission status' })
+  @ApiParam({ name: 'submissionId', description: 'Submission ID' })
+  @ApiResponse({
+    status: 200,
+    description: 'Submission status retrieved successfully',
+  })
+  async getSubmissionStatus(@Param('submissionId') submissionId: string) {
+    return this.reportService.getSubmissionStatus(submissionId);
+  }
+
+  @Get('metrics')
+  @ApiOperation({ summary: 'Get transaction metrics' })
+  @ApiResponse({ status: 200, description: 'Metrics retrieved successfully' })
+  async getMetrics() {
+    return this.transactionProcessor.getTransactionMetrics();
+  }
+
+  @Get('health')
+  @ApiOperation({ summary: 'Health check endpoint' })
+  @ApiResponse({ status: 200, description: 'Service is healthy' })
+  async healthCheck() {
+    return {
+      status: 'healthy',
+      timestamp: new Date().toISOString(),
+      services: {
+        transactionProcessor: 'active',
+        regulationService: 'active',
+        currencyService: 'active',
+        customsService: 'active',
+        reportService: 'active',
+      },
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/controller/index.html b/coverage/lcov-report/src/cross-border/controller/index.html new file mode 100644 index 0000000..8fb73fe --- /dev/null +++ b/coverage/lcov-report/src/cross-border/controller/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border/controller + + + + + + + + + +
+
+

All files src/cross-border/controller

+
+ +
+ 0% + Statements + 0/346 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/346 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cross-border.controller.ts +
+
0%0/3460%0/10%0/10%0/346
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/cross-border.module.ts.html b/coverage/lcov-report/src/cross-border/cross-border.module.ts.html new file mode 100644 index 0000000..a768ae2 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/cross-border.module.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/cross-border/cross-border.module.ts + + + + + + + + + +
+
+

All files / src/cross-border cross-border.module.ts

+
+ +
+ 0% + Statements + 0/30 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ConfigModule } from '@nestjs/config';
+import { RegulationService } from './compliance/regulation-service';
+import { CurrencyService } from './currency/currency-service';
+import { TransactionProcessorService } from './transactions/transaction-processor.service';
+import { RegulatoryReportService } from './reporting/regulatory-report.service';
+import { CustomsService } from './tariffs/customs-service';
+import { CrossBorderTransaction } from './entities/cross-border-transaction.entity';
+import { CrossBorderController } from './controller/cross-border.controller';
+
+@Module({
+  imports: [ConfigModule, TypeOrmModule.forFeature([CrossBorderTransaction])],
+  controllers: [CrossBorderController],
+  providers: [
+    RegulationService,
+    CurrencyService,
+    TransactionProcessorService,
+    RegulatoryReportService,
+    CustomsService,
+  ],
+  exports: [
+    RegulationService,
+    CurrencyService,
+    TransactionProcessorService,
+    RegulatoryReportService,
+    CustomsService,
+  ],
+})
+export class CrossBorderModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/currency/currency-service.ts.html b/coverage/lcov-report/src/cross-border/currency/currency-service.ts.html new file mode 100644 index 0000000..459d502 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/currency/currency-service.ts.html @@ -0,0 +1,1411 @@ + + + + + + Code coverage report for src/cross-border/currency/currency-service.ts + + + + + + + + + +
+
+

All files / src/cross-border/currency currency-service.ts

+
+ +
+ 0% + Statements + 0/442 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/442 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import axios from 'axios';
+
+export interface CurrencyRate {
+  from: string;
+  to: string;
+  rate: number;
+  timestamp: Date;
+  source: string;
+}
+
+export interface ConversionResult {
+  originalAmount: number;
+  originalCurrency: string;
+  convertedAmount: number;
+  targetCurrency: string;
+  exchangeRate: number;
+  fee: number;
+  totalAmount: number;
+  timestamp: Date;
+}
+
+export interface SupportedCurrency {
+  code: string;
+  name: string;
+  symbol: string;
+  decimalPlaces: number;
+  isActive: boolean;
+  region: string[];
+}
+
+@Injectable()
+export class CurrencyService {
+  private readonly logger = new Logger(CurrencyService.name);
+  private readonly exchangeRates: Map<string, CurrencyRate> = new Map();
+  private readonly supportedCurrencies: Map<string, SupportedCurrency> =
+    new Map();
+  private readonly cacheTimeout = 5 * 60 * 1000; // 5 minutes
+
+  constructor(private configService: ConfigService) {
+    this.initializeSupportedCurrencies();
+    this.startExchangeRateUpdates();
+  }
+
+  private initializeSupportedCurrencies(): void {
+    const currencies: SupportedCurrency[] = [
+      {
+        code: 'USD',
+        name: 'US Dollar',
+        symbol: '$',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['US', 'Global'],
+      },
+      {
+        code: 'EUR',
+        name: 'Euro',
+        symbol: '€',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['EU'],
+      },
+      {
+        code: 'GBP',
+        name: 'British Pound',
+        symbol: '£',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['GB'],
+      },
+      {
+        code: 'JPY',
+        name: 'Japanese Yen',
+        symbol: 'Â¥',
+        decimalPlaces: 0,
+        isActive: true,
+        region: ['JP'],
+      },
+      {
+        code: 'CNY',
+        name: 'Chinese Yuan',
+        symbol: 'Â¥',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['CN'],
+      },
+      {
+        code: 'INR',
+        name: 'Indian Rupee',
+        symbol: '₹',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['IN'],
+      },
+      {
+        code: 'AUD',
+        name: 'Australian Dollar',
+        symbol: 'A$',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['AU'],
+      },
+      {
+        code: 'CAD',
+        name: 'Canadian Dollar',
+        symbol: 'C$',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['CA'],
+      },
+      {
+        code: 'CHF',
+        name: 'Swiss Franc',
+        symbol: 'Fr',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['CH'],
+      },
+      {
+        code: 'SEK',
+        name: 'Swedish Krona',
+        symbol: 'kr',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['SE'],
+      },
+      {
+        code: 'NOK',
+        name: 'Norwegian Krone',
+        symbol: 'kr',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['NO'],
+      },
+      {
+        code: 'DKK',
+        name: 'Danish Krone',
+        symbol: 'kr',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['DK'],
+      },
+      {
+        code: 'SGD',
+        name: 'Singapore Dollar',
+        symbol: 'S$',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['SG'],
+      },
+      {
+        code: 'HKD',
+        name: 'Hong Kong Dollar',
+        symbol: 'HK$',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['HK'],
+      },
+      {
+        code: 'NZD',
+        name: 'New Zealand Dollar',
+        symbol: 'NZ$',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['NZ'],
+      },
+      {
+        code: 'KRW',
+        name: 'South Korean Won',
+        symbol: 'â‚©',
+        decimalPlaces: 0,
+        isActive: true,
+        region: ['KR'],
+      },
+      {
+        code: 'MXN',
+        name: 'Mexican Peso',
+        symbol: '$',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['MX'],
+      },
+      {
+        code: 'BRL',
+        name: 'Brazilian Real',
+        symbol: 'R$',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['BR'],
+      },
+      {
+        code: 'RUB',
+        name: 'Russian Ruble',
+        symbol: '₽',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['RU'],
+      },
+      {
+        code: 'ZAR',
+        name: 'South African Rand',
+        symbol: 'R',
+        decimalPlaces: 2,
+        isActive: true,
+        region: ['ZA'],
+      },
+    ];
+
+    currencies.forEach((currency) => {
+      this.supportedCurrencies.set(currency.code, currency);
+    });
+
+    this.logger.log(`Initialized ${currencies.length} supported currencies`);
+  }
+
+  private startExchangeRateUpdates(): void {
+    this.updateExchangeRates();
+    setInterval(() => {
+      this.updateExchangeRates();
+    }, this.cacheTimeout);
+  }
+
+  private async updateExchangeRates(): Promise<void> {
+    try {
+      const baseCurrency = 'USD';
+      const apiKey = this.configService.get<string>('EXCHANGE_RATE_API_KEY');
+
+      if (apiKey) {
+        const response = await axios.get(
+          `https://open.er-api.com/v6/latest/${baseCurrency}?apikey=${apiKey}`,
+        );
+        const rates = response.data.rates;
+
+        for (const [currency, rate] of Object.entries(rates)) {
+          if (this.supportedCurrencies.has(currency)) {
+            const rateData: CurrencyRate = {
+              from: baseCurrency,
+              to: currency,
+              rate: rate as number,
+              timestamp: new Date(),
+              source: 'ER-API',
+            };
+            this.exchangeRates.set(`${baseCurrency}-${currency}`, rateData);
+          }
+        }
+      } else {
+        this.generateMockExchangeRates();
+      }
+
+      this.logger.log('Updated exchange rates successfully');
+    } catch (error) {
+      this.logger.warn(
+        'Failed to update exchange rates, using mock data',
+        error,
+      );
+      this.generateMockExchangeRates();
+    }
+  }
+
+  private generateMockExchangeRates(): void {
+    const baseRates: Record<string, number> = {
+      EUR: 0.92,
+      GBP: 0.79,
+      JPY: 149.5,
+      CNY: 7.24,
+      INR: 83.12,
+      AUD: 1.53,
+      CAD: 1.36,
+      CHF: 0.88,
+      SEK: 10.67,
+      NOK: 10.47,
+      DKK: 6.88,
+      SGD: 1.35,
+      HKD: 7.82,
+      NZD: 1.61,
+      KRW: 1318.5,
+      MXN: 17.15,
+      BRL: 4.97,
+      RUB: 89.75,
+      ZAR: 18.93,
+    };
+
+    for (const [currency, rate] of Object.entries(baseRates)) {
+      const rateData: CurrencyRate = {
+        from: 'USD',
+        to: currency,
+        rate: rate * (0.98 + Math.random() * 0.04), // ±2% variation
+        timestamp: new Date(),
+        source: 'Mock',
+      };
+      this.exchangeRates.set(`USD-${currency}`, rateData);
+    }
+  }
+
+  async convertCurrency(
+    amount: number,
+    fromCurrency: string,
+    toCurrency: string,
+  ): Promise<ConversionResult> {
+    if (!this.supportedCurrencies.has(fromCurrency)) {
+      throw new Error(`Unsupported source currency: ${fromCurrency}`);
+    }
+
+    if (!this.supportedCurrencies.has(toCurrency)) {
+      throw new Error(`Unsupported target currency: ${toCurrency}`);
+    }
+
+    if (fromCurrency === toCurrency) {
+      return {
+        originalAmount: amount,
+        originalCurrency: fromCurrency,
+        convertedAmount: amount,
+        targetCurrency: toCurrency,
+        exchangeRate: 1,
+        fee: 0,
+        totalAmount: amount,
+        timestamp: new Date(),
+      };
+    }
+
+    const exchangeRate = await this.getExchangeRate(fromCurrency, toCurrency);
+    const fee = this.calculateConversionFee(amount, fromCurrency, toCurrency);
+    const convertedAmount = amount * exchangeRate;
+    const totalAmount = convertedAmount + fee;
+
+    return {
+      originalAmount: amount,
+      originalCurrency: fromCurrency,
+      convertedAmount,
+      targetCurrency: toCurrency,
+      exchangeRate,
+      fee,
+      totalAmount,
+      timestamp: new Date(),
+    };
+  }
+
+  private async getExchangeRate(
+    fromCurrency: string,
+    toCurrency: string,
+  ): Promise<number> {
+    const directKey = `${fromCurrency}-${toCurrency}`;
+    const reverseKey = `${toCurrency}-${fromCurrency}`;
+    const usdFromKey = `USD-${fromCurrency}`;
+    const usdToKey = `USD-${toCurrency}`;
+
+    if (this.exchangeRates.has(directKey)) {
+      return this.exchangeRates.get(directKey).rate;
+    }
+
+    if (this.exchangeRates.has(reverseKey)) {
+      const reverseRate = this.exchangeRates.get(reverseKey).rate;
+      return 1 / reverseRate;
+    }
+
+    if (
+      this.exchangeRates.has(usdFromKey) &&
+      this.exchangeRates.has(usdToKey)
+    ) {
+      const fromRate = this.exchangeRates.get(usdFromKey).rate;
+      const toRate = this.exchangeRates.get(usdToKey).rate;
+      return toRate / fromRate;
+    }
+
+    throw new Error(
+      `Exchange rate not available for ${fromCurrency} to ${toCurrency}`,
+    );
+  }
+
+  private calculateConversionFee(
+    amount: number,
+    fromCurrency: string,
+    toCurrency: string,
+  ): number {
+    const baseFeeRate = 0.0025; // 0.25% base fee
+    const crossBorderFee =
+      fromCurrency !== 'USD' && toCurrency !== 'USD' ? 0.0015 : 0; // Additional 0.15% for non-USD pairs
+    const totalFeeRate = baseFeeRate + crossBorderFee;
+
+    return Math.max(amount * totalFeeRate, 1); // Minimum fee of 1 unit
+  }
+
+  getSupportedCurrencies(): SupportedCurrency[] {
+    return Array.from(this.supportedCurrencies.values()).filter(
+      (currency) => currency.isActive,
+    );
+  }
+
+  getCurrencyByCode(code: string): SupportedCurrency | undefined {
+    return this.supportedCurrencies.get(code);
+  }
+
+  getExchangeRateHistory(
+    fromCurrency: string,
+    toCurrency: string,
+  ): CurrencyRate[] {
+    const rates: CurrencyRate[] = [];
+    const key = `${fromCurrency}-${toCurrency}`;
+
+    if (this.exchangeRates.has(key)) {
+      rates.push(this.exchangeRates.get(key));
+    }
+
+    return rates;
+  }
+
+  calculateCrossBorderFee(
+    amount: number,
+    fromCurrency: string,
+    toCurrency: string,
+  ): number {
+    const baseFee = 5; // Base cross-border fee
+    const percentageFee = amount * 0.001; // 0.1% percentage fee
+    const currencyFee = fromCurrency !== 'USD' && toCurrency !== 'USD' ? 10 : 0; // Additional fee for non-USD pairs
+
+    return baseFee + percentageFee + currencyFee;
+  }
+
+  formatCurrency(amount: number, currency: string): string {
+    const currencyInfo = this.supportedCurrencies.get(currency);
+    if (!currencyInfo) {
+      return amount.toString();
+    }
+
+    const formattedAmount = amount.toFixed(currencyInfo.decimalPlaces);
+    return `${currencyInfo.symbol}${formattedAmount}`;
+  }
+
+  validateCurrencyCode(code: string): boolean {
+    return (
+      this.supportedCurrencies.has(code) &&
+      this.supportedCurrencies.get(code).isActive
+    );
+  }
+
+  getCurrenciesByRegion(region: string): SupportedCurrency[] {
+    return Array.from(this.supportedCurrencies.values()).filter(
+      (currency) => currency.isActive && currency.region.includes(region),
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/currency/index.html b/coverage/lcov-report/src/cross-border/currency/index.html new file mode 100644 index 0000000..3faa9c5 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/currency/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border/currency + + + + + + + + + +
+
+

All files src/cross-border/currency

+
+ +
+ 0% + Statements + 0/442 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/442 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
currency-service.ts +
+
0%0/4420%0/10%0/10%0/442
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/dto/index.html b/coverage/lcov-report/src/cross-border/dto/index.html new file mode 100644 index 0000000..ca1a948 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border/dto + + + + + + + + + +
+
+

All files src/cross-border/dto

+
+ +
+ 0% + Statements + 0/242 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/242 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
international-trade.dto.ts +
+
0%0/2420%0/10%0/10%0/242
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/dto/international-trade.dto.ts.html b/coverage/lcov-report/src/cross-border/dto/international-trade.dto.ts.html new file mode 100644 index 0000000..0b8b4f8 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/dto/international-trade.dto.ts.html @@ -0,0 +1,811 @@ + + + + + + Code coverage report for src/cross-border/dto/international-trade.dto.ts + + + + + + + + + +
+
+

All files / src/cross-border/dto international-trade.dto.ts

+
+ +
+ 0% + Statements + 0/242 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/242 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsNumber,
+  IsEnum,
+  IsOptional,
+  IsDateString,
+  ValidateNested,
+  IsArray,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import {
+  TransactionType,
+  ComplianceStatus,
+} from '../entities/cross-border-transaction.entity';
+
+export class CurrencyConversionDto {
+  @IsString()
+  @IsOptional()
+  sourceCurrency: string;
+
+  @IsString()
+  @IsOptional()
+  targetCurrency: string;
+
+  @IsNumber()
+  @IsOptional()
+  amount: number;
+
+  @IsNumber()
+  @IsOptional()
+  exchangeRate: number;
+}
+
+export class RegulatoryComplianceDto {
+  @IsString()
+  @IsOptional()
+  regulationCode: string;
+
+  @IsString()
+  @IsOptional()
+  complianceLevel: string;
+
+  @IsArray()
+  @IsOptional()
+  requiredDocuments: string[];
+
+  @IsArray()
+  @IsOptional()
+  complianceChecks: string[];
+}
+
+export class CustomsTariffDto {
+  @IsString()
+  @IsOptional()
+  hsCode: string;
+
+  @IsString()
+  @IsOptional()
+  productCategory: string;
+
+  @IsNumber()
+  @IsOptional()
+  tariffRate: number;
+
+  @IsNumber()
+  @IsOptional()
+  customsValue: number;
+
+  @IsArray()
+  @IsOptional()
+  applicableTaxes: string[];
+}
+
+export class CreateInternationalTradeDto {
+  @IsString()
+  transactionId: string;
+
+  @IsEnum(TransactionType)
+  transactionType: TransactionType;
+
+  @IsString()
+  sourceCountry: string;
+
+  @IsString()
+  targetCountry: string;
+
+  @IsNumber()
+  amount: number;
+
+  @IsString()
+  currency: string;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => CurrencyConversionDto)
+  currencyConversion?: CurrencyConversionDto;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => RegulatoryComplianceDto)
+  regulatoryCompliance?: RegulatoryComplianceDto;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => CustomsTariffDto)
+  customsTariff?: CustomsTariffDto;
+
+  @IsString()
+  @IsOptional()
+  energyType?: string;
+
+  @IsNumber()
+  @IsOptional()
+  energyQuantity?: number;
+
+  @IsString()
+  @IsOptional()
+  energyUnit?: string;
+
+  @IsString()
+  @IsOptional()
+  supplierId?: string;
+
+  @IsString()
+  @IsOptional()
+  buyerId?: string;
+
+  @IsString()
+  @IsOptional()
+  contractId?: string;
+
+  @IsDateString()
+  @IsOptional()
+  transactionDate?: string;
+
+  @IsDateString()
+  @IsOptional()
+  deliveryDate?: string;
+
+  @IsString()
+  @IsOptional()
+  paymentTerms?: string;
+
+  @IsString()
+  @IsOptional()
+  incoterms?: string;
+
+  @IsArray()
+  @IsOptional()
+  documents?: string[];
+
+  @IsString()
+  @IsOptional()
+  notes?: string;
+}
+
+export class UpdateInternationalTradeDto {
+  @IsEnum(TransactionType)
+  @IsOptional()
+  transactionType?: TransactionType;
+
+  @IsNumber()
+  @IsOptional()
+  amount?: number;
+
+  @IsString()
+  @IsOptional()
+  currency?: string;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => CurrencyConversionDto)
+  currencyConversion?: CurrencyConversionDto;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => RegulatoryComplianceDto)
+  regulatoryCompliance?: RegulatoryComplianceDto;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => CustomsTariffDto)
+  customsTariff?: CustomsTariffDto;
+
+  @IsString()
+  @IsOptional()
+  notes?: string;
+}
+
+export class FilterInternationalTradeDto {
+  @IsString()
+  @IsOptional()
+  sourceCountry?: string;
+
+  @IsString()
+  @IsOptional()
+  targetCountry?: string;
+
+  @IsEnum(TransactionType)
+  @IsOptional()
+  transactionType?: TransactionType;
+
+  @IsString()
+  @IsOptional()
+  currency?: string;
+
+  @IsString()
+  @IsOptional()
+  status?: string;
+
+  @IsEnum(ComplianceStatus)
+  @IsOptional()
+  complianceStatus?: ComplianceStatus;
+
+  @IsDateString()
+  @IsOptional()
+  startDate?: string;
+
+  @IsDateString()
+  @IsOptional()
+  endDate?: string;
+
+  @IsNumber()
+  @IsOptional()
+  minAmount?: number;
+
+  @IsNumber()
+  @IsOptional()
+  maxAmount?: number;
+
+  @IsString()
+  @IsOptional()
+  energyType?: string;
+
+  @IsString()
+  @IsOptional()
+  supplierId?: string;
+
+  @IsString()
+  @IsOptional()
+  buyerId?: string;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/entities/cross-border-transaction.entity.ts.html b/coverage/lcov-report/src/cross-border/entities/cross-border-transaction.entity.ts.html new file mode 100644 index 0000000..eb0515b --- /dev/null +++ b/coverage/lcov-report/src/cross-border/entities/cross-border-transaction.entity.ts.html @@ -0,0 +1,436 @@ + + + + + + Code coverage report for src/cross-border/entities/cross-border-transaction.entity.ts + + + + + + + + + +
+
+

All files / src/cross-border/entities cross-border-transaction.entity.ts

+
+ +
+ 0% + Statements + 0/117 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+
+export enum TransactionStatus {
+  PENDING = 'pending',
+  PROCESSING = 'processing',
+  COMPLETED = 'completed',
+  FAILED = 'failed',
+  DISPUTED = 'disputed',
+  CANCELLED = 'cancelled',
+}
+
+export enum TransactionType {
+  IMPORT = 'import',
+  EXPORT = 'export',
+  TRANSIT = 'transit',
+}
+
+export enum ComplianceStatus {
+  COMPLIANT = 'compliant',
+  NON_COMPLIANT = 'non_compliant',
+  PENDING_REVIEW = 'pending_review',
+  REQUIREMENTS_MET = 'requirements_met',
+}
+
+@Entity('cross_border_transactions')
+@Index(['transactionId', 'status'])
+@Index(['sourceCountry', 'targetCountry'])
+@Index(['currency', 'status'])
+export class CrossBorderTransaction {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ unique: true })
+  transactionId: string;
+
+  @Column()
+  transactionType: TransactionType;
+
+  @Column()
+  sourceCountry: string;
+
+  @Column()
+  targetCountry: string;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  amount: number;
+
+  @Column({ length: 3 })
+  currency: string;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2, nullable: true })
+  convertedAmount?: number;
+
+  @Column({ length: 3, nullable: true })
+  targetCurrency?: string;
+
+  @Column({ type: 'decimal', precision: 10, scale: 4, nullable: true })
+  exchangeRate?: number;
+
+  @Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
+  customsTariff?: number;
+
+  @Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
+  regulatoryFees?: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2, nullable: true })
+  totalAmount?: number;
+
+  @Column({ default: TransactionStatus.PENDING })
+  status: TransactionStatus;
+
+  @Column({ default: ComplianceStatus.PENDING_REVIEW })
+  complianceStatus: ComplianceStatus;
+
+  @Column('json', { nullable: true })
+  regulatoryData: Record<string, any>;
+
+  @Column('json', { nullable: true })
+  customsData: Record<string, any>;
+
+  @Column('json', { nullable: true })
+  complianceChecks: Record<string, any>;
+
+  @Column({ nullable: true })
+  regulatoryReportId?: string;
+
+  @Column({ nullable: true })
+  customsDeclarationId?: string;
+
+  @Column({ nullable: true })
+  disputeId?: string;
+
+  @Column({ type: 'text', nullable: true })
+  notes?: string;
+
+  @Column({ type: 'text', nullable: true })
+  failureReason?: string;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @UpdateDateColumn()
+  updatedAt: Date;
+
+  @Column({ nullable: true })
+  processedAt?: Date;
+
+  @Column({ nullable: true })
+  completedAt?: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/entities/index.html b/coverage/lcov-report/src/cross-border/entities/index.html new file mode 100644 index 0000000..888eb34 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border/entities + + + + + + + + + +
+
+

All files src/cross-border/entities

+
+ +
+ 0% + Statements + 0/117 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cross-border-transaction.entity.ts +
+
0%0/1170%0/10%0/10%0/117
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/index.html b/coverage/lcov-report/src/cross-border/index.html new file mode 100644 index 0000000..5075c99 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border + + + + + + + + + +
+
+

All files src/cross-border

+
+ +
+ 0% + Statements + 0/30 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cross-border.module.ts +
+
0%0/300%0/10%0/10%0/30
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/reporting/index.html b/coverage/lcov-report/src/cross-border/reporting/index.html new file mode 100644 index 0000000..25ae408 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/reporting/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border/reporting + + + + + + + + + +
+
+

All files src/cross-border/reporting

+
+ +
+ 0% + Statements + 0/720 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/720 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
regulatory-report.service.ts +
+
0%0/7200%0/10%0/10%0/720
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/reporting/regulatory-report.service.ts.html b/coverage/lcov-report/src/cross-border/reporting/regulatory-report.service.ts.html new file mode 100644 index 0000000..bae2db5 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/reporting/regulatory-report.service.ts.html @@ -0,0 +1,2245 @@ + + + + + + Code coverage report for src/cross-border/reporting/regulatory-report.service.ts + + + + + + + + + +
+
+

All files / src/cross-border/reporting regulatory-report.service.ts

+
+ +
+ 0% + Statements + 0/720 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/720 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  CrossBorderTransaction,
+  TransactionStatus,
+  ComplianceStatus,
+} from '../entities/cross-border-transaction.entity';
+import { RegulationService } from '../compliance/regulation-service';
+
+export interface RegulatoryReport {
+  id: string;
+  reportType: string;
+  period: {
+    startDate: Date;
+    endDate: Date;
+  };
+  jurisdiction: string;
+  summary: {
+    totalTransactions: number;
+    totalVolume: number;
+    totalValue: number;
+    complianceRate: number;
+    violations: number;
+    penalties: number;
+  };
+  transactions: TransactionReport[];
+  complianceMetrics: ComplianceMetric[];
+  generatedAt: Date;
+  status: 'draft' | 'submitted' | 'approved' | 'rejected';
+  submissionDate?: Date;
+  approvalDate?: Date;
+  rejectionReason?: string;
+}
+
+export interface TransactionReport {
+  transactionId: string;
+  date: Date;
+  sourceCountry: string;
+  targetCountry: string;
+  energyType: string;
+  volume: number;
+  value: number;
+  currency: string;
+  complianceStatus: ComplianceStatus;
+  violations: string[];
+  penalties: number;
+  regulations: string[];
+}
+
+export interface ComplianceMetric {
+  regulationCode: string;
+  regulationName: string;
+  totalChecks: number;
+  passedChecks: number;
+  failedChecks: number;
+  warningChecks: number;
+  complianceRate: number;
+  averageResolutionTime: number;
+  openViolations: number;
+  closedViolations: number;
+}
+
+export interface ReportTemplate {
+  id: string;
+  name: string;
+  description: string;
+  jurisdiction: string;
+  frequency: 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'annual';
+  requiredFields: string[];
+  format: 'JSON' | 'XML' | 'CSV' | 'PDF';
+  submissionEndpoint?: string;
+  authentication: {
+    type: 'api_key' | 'oauth' | 'certificate';
+    credentials: Record<string, string>;
+  };
+}
+
+export interface ReportSubmission {
+  reportId: string;
+  submissionId: string;
+  endpoint: string;
+  status: 'pending' | 'submitted' | 'acknowledged' | 'failed';
+  submittedAt: Date;
+  response?: any;
+  error?: string;
+}
+
+@Injectable()
+export class RegulatoryReportService {
+  private readonly logger = new Logger(RegulatoryReportService.name);
+  private readonly reportTemplates: Map<string, ReportTemplate> = new Map();
+  private readonly submissions: Map<string, ReportSubmission> = new Map();
+
+  constructor(
+    @InjectRepository(CrossBorderTransaction)
+    private readonly transactionRepository: Repository<CrossBorderTransaction>,
+    private readonly regulationService: RegulationService,
+    private readonly configService: ConfigService,
+  ) {
+    this.initializeReportTemplates();
+  }
+
+  private initializeReportTemplates(): void {
+    const templates: ReportTemplate[] = [
+      {
+        id: 'EU_RENEWABLE_ENERGY_REPORT',
+        name: 'EU Renewable Energy Trading Report',
+        description: 'Monthly report for renewable energy trading within EU',
+        jurisdiction: 'EU',
+        frequency: 'monthly',
+        requiredFields: [
+          'transactionId',
+          'energyType',
+          'volume',
+          'value',
+          'complianceStatus',
+        ],
+        format: 'XML',
+        submissionEndpoint: 'https://ec.europa.eu/energy/api/reports',
+        authentication: {
+          type: 'api_key',
+          credentials: { api_key: 'EU_ENERGY_API_KEY' },
+        },
+      },
+      {
+        id: 'US_FERC_ENERGY_REPORT',
+        name: 'US FERC Energy Trading Report',
+        description: 'Daily report for US energy trading activities',
+        jurisdiction: 'US',
+        frequency: 'daily',
+        requiredFields: [
+          'transactionId',
+          'sourceCountry',
+          'targetCountry',
+          'value',
+          'complianceStatus',
+        ],
+        format: 'JSON',
+        submissionEndpoint: 'https://www.ferc.gov/api/energy-reports',
+        authentication: {
+          type: 'oauth',
+          credentials: {
+            client_id: 'FERC_CLIENT_ID',
+            client_secret: 'FERC_CLIENT_SECRET',
+          },
+        },
+      },
+      {
+        id: 'ISO_50001_COMPLIANCE_REPORT',
+        name: 'ISO 50001 Energy Management Report',
+        description: 'Quarterly ISO 50001 compliance report',
+        jurisdiction: 'International',
+        frequency: 'quarterly',
+        requiredFields: ['energyType', 'volume', 'consumption', 'efficiency'],
+        format: 'PDF',
+        authentication: {
+          type: 'certificate',
+          credentials: { certificate_path: '/certs/iso50001.pem' },
+        },
+      },
+      {
+        id: 'IEA_STATISTICS_REPORT',
+        name: 'IEA Energy Statistics Report',
+        description: 'Monthly energy trading statistics for IEA',
+        jurisdiction: 'International',
+        frequency: 'monthly',
+        requiredFields: [
+          'country',
+          'energyType',
+          'imports',
+          'exports',
+          'consumption',
+        ],
+        format: 'CSV',
+        submissionEndpoint: 'https://api.iea.org/statistics',
+        authentication: {
+          type: 'api_key',
+          credentials: { api_key: 'IEA_API_KEY' },
+        },
+      },
+      {
+        id: 'CROSS_BORDER_EU_REPORT',
+        name: 'EU Cross-Border Electricity Report',
+        description: 'Daily cross-border electricity trading report for EU',
+        jurisdiction: 'EU',
+        frequency: 'daily',
+        requiredFields: [
+          'transactionId',
+          'sourceCountry',
+          'targetCountry',
+          'volume',
+          'price',
+        ],
+        format: 'JSON',
+        submissionEndpoint: 'https://www.entsoe.eu/api/cross-border',
+        authentication: {
+          type: 'certificate',
+          credentials: { certificate_path: '/certs/entsoe.pem' },
+        },
+      },
+    ];
+
+    templates.forEach((template) => {
+      this.reportTemplates.set(template.id, template);
+    });
+
+    this.logger.log(
+      `Initialized ${templates.length} regulatory report templates`,
+    );
+  }
+
+  async generateReport(
+    reportType: string,
+    startDate: Date,
+    endDate: Date,
+    jurisdiction?: string,
+  ): Promise<RegulatoryReport> {
+    this.logger.log(
+      `Generating ${reportType} report for period ${startDate.toISOString()} to ${endDate.toISOString()}`,
+    );
+
+    const template = this.reportTemplates.get(reportType);
+    if (!template) {
+      throw new Error(`Report template not found: ${reportType}`);
+    }
+
+    const transactions = await this.getTransactionsForPeriod(
+      startDate,
+      endDate,
+      jurisdiction,
+    );
+    const transactionReports = await this.buildTransactionReports(transactions);
+    const complianceMetrics =
+      await this.calculateComplianceMetrics(transactions);
+    const summary = this.calculateSummary(
+      transactionReports,
+      complianceMetrics,
+    );
+
+    const report: RegulatoryReport = {
+      id: this.generateReportId(),
+      reportType,
+      period: { startDate, endDate },
+      jurisdiction: jurisdiction || template.jurisdiction,
+      summary,
+      transactions: transactionReports,
+      complianceMetrics,
+      generatedAt: new Date(),
+      status: 'draft',
+    };
+
+    this.logger.log(
+      `Generated report ${report.id} with ${transactionReports.length} transactions`,
+    );
+    return report;
+  }
+
+  private async getTransactionsForPeriod(
+    startDate: Date,
+    endDate: Date,
+    jurisdiction?: string,
+  ): Promise<CrossBorderTransaction[]> {
+    const whereCondition: any = {
+      createdAt: {
+        $gte: startDate,
+        $lte: endDate,
+      },
+    };
+
+    if (jurisdiction && jurisdiction !== 'International') {
+      const countries = this.getCountriesByJurisdiction(jurisdiction);
+      whereCondition.$or = [
+        { sourceCountry: { $in: countries } },
+        { targetCountry: { $in: countries } },
+      ];
+    }
+
+    return this.transactionRepository.find({
+      where: whereCondition,
+      order: { createdAt: 'ASC' },
+    });
+  }
+
+  private getCountriesByJurisdiction(jurisdiction: string): string[] {
+    const jurisdictionCountries: Record<string, string[]> = {
+      EU: ['DE', 'FR', 'IT', 'ES', 'NL', 'BE', 'AT', 'PT', 'FI', 'GR'],
+      US: ['US'],
+      CN: ['CN'],
+      International: ['*'],
+    };
+
+    return jurisdictionCountries[jurisdiction] || [];
+  }
+
+  private async buildTransactionReports(
+    transactions: CrossBorderTransaction[],
+  ): Promise<TransactionReport[]> {
+    return transactions.map((transaction) => ({
+      transactionId: transaction.transactionId,
+      date: transaction.createdAt,
+      sourceCountry: transaction.sourceCountry,
+      targetCountry: transaction.targetCountry,
+      energyType: this.extractEnergyType(transaction),
+      volume: this.extractVolume(transaction),
+      value: transaction.amount,
+      currency: transaction.currency,
+      complianceStatus: transaction.complianceStatus,
+      violations: this.extractViolations(transaction),
+      penalties: this.extractPenalties(transaction),
+      regulations: this.extractApplicableRegulations(transaction),
+    }));
+  }
+
+  private extractEnergyType(transaction: CrossBorderTransaction): string {
+    if (transaction.regulatoryData && transaction.regulatoryData.energyType) {
+      return transaction.regulatoryData.energyType;
+    }
+    return 'electricity'; // Default energy type
+  }
+
+  private extractVolume(transaction: CrossBorderTransaction): number {
+    if (
+      transaction.regulatoryData &&
+      transaction.regulatoryData.energyQuantity
+    ) {
+      return transaction.regulatoryData.energyQuantity;
+    }
+    return transaction.amount; // Use amount as volume proxy
+  }
+
+  private extractViolations(transaction: CrossBorderTransaction): string[] {
+    const violations: string[] = [];
+
+    if (transaction.complianceChecks) {
+      for (const [regulation, check] of Object.entries(
+        transaction.complianceChecks,
+      )) {
+        if (check.status === 'fail') {
+          violations.push(`${regulation}: ${check.details}`);
+        }
+      }
+    }
+
+    return violations;
+  }
+
+  private extractPenalties(transaction: CrossBorderTransaction): number {
+    if (transaction.regulatoryFees) {
+      return transaction.regulatoryFees;
+    }
+    return 0;
+  }
+
+  private extractApplicableRegulations(
+    transaction: CrossBorderTransaction,
+  ): string[] {
+    const regulations: string[] = [];
+
+    if (
+      transaction.regulatoryData &&
+      transaction.regulatoryData.applicableRegulations
+    ) {
+      regulations.push(...transaction.regulatoryData.applicableRegulations);
+    }
+
+    return regulations;
+  }
+
+  private async calculateComplianceMetrics(
+    transactions: CrossBorderTransaction[],
+  ): Promise<ComplianceMetric[]> {
+    const regulations = this.regulationService.getAllRegulations();
+    const metrics: ComplianceMetric[] = [];
+
+    for (const regulation of regulations) {
+      const applicableTransactions = transactions.filter((t) =>
+        this.isRegulationApplicable(t, regulation),
+      );
+
+      const totalChecks = applicableTransactions.length;
+      const passedChecks = applicableTransactions.filter(
+        (t) => t.complianceStatus === ComplianceStatus.COMPLIANT,
+      ).length;
+      const failedChecks = applicableTransactions.filter(
+        (t) => t.complianceStatus === ComplianceStatus.NON_COMPLIANT,
+      ).length;
+      const warningChecks = applicableTransactions.filter(
+        (t) => t.complianceStatus === ComplianceStatus.PENDING_REVIEW,
+      ).length;
+
+      const complianceRate =
+        totalChecks > 0 ? (passedChecks / totalChecks) * 100 : 0;
+
+      metrics.push({
+        regulationCode: regulation.code,
+        regulationName: regulation.name,
+        totalChecks,
+        passedChecks,
+        failedChecks,
+        warningChecks,
+        complianceRate,
+        averageResolutionTime: this.calculateAverageResolutionTime(
+          applicableTransactions,
+        ),
+        openViolations: failedChecks,
+        closedViolations: passedChecks,
+      });
+    }
+
+    return metrics;
+  }
+
+  private isRegulationApplicable(
+    transaction: CrossBorderTransaction,
+    regulation: any,
+  ): boolean {
+    return (
+      regulation.applicableCountries.includes('*') ||
+      regulation.applicableCountries.includes(transaction.sourceCountry) ||
+      regulation.applicableCountries.includes(transaction.targetCountry)
+    );
+  }
+
+  private calculateAverageResolutionTime(
+    transactions: CrossBorderTransaction[],
+  ): number {
+    const completedTransactions = transactions.filter(
+      (t) => t.processedAt && t.createdAt,
+    );
+
+    if (completedTransactions.length === 0) {
+      return 0;
+    }
+
+    const totalTime = completedTransactions.reduce((sum, t) => {
+      return sum + (t.processedAt.getTime() - t.createdAt.getTime());
+    }, 0);
+
+    return totalTime / completedTransactions.length;
+  }
+
+  private calculateSummary(
+    transactions: TransactionReport[],
+    complianceMetrics: ComplianceMetric[],
+  ): RegulatoryReport['summary'] {
+    const totalTransactions = transactions.length;
+    const totalVolume = transactions.reduce((sum, t) => sum + t.volume, 0);
+    const totalValue = transactions.reduce((sum, t) => sum + t.value, 0);
+
+    const compliantTransactions = transactions.filter(
+      (t) => t.complianceStatus === ComplianceStatus.COMPLIANT,
+    ).length;
+    const complianceRate =
+      totalTransactions > 0
+        ? (compliantTransactions / totalTransactions) * 100
+        : 0;
+
+    const violations = transactions.reduce(
+      (sum, t) => sum + t.violations.length,
+      0,
+    );
+    const penalties = transactions.reduce((sum, t) => sum + t.penalties, 0);
+
+    return {
+      totalTransactions,
+      totalVolume,
+      totalValue,
+      complianceRate,
+      violations,
+      penalties,
+    };
+  }
+
+  private generateReportId(): string {
+    return `RPT-${Date.now()}-${Math.random().toString(36).substr(2, 9).toUpperCase()}`;
+  }
+
+  async submitReport(reportId: string): Promise<ReportSubmission> {
+    const report = await this.getReportById(reportId);
+    if (!report) {
+      throw new Error(`Report not found: ${reportId}`);
+    }
+
+    const template = this.reportTemplates.get(report.reportType);
+    if (!template || !template.submissionEndpoint) {
+      throw new Error(
+        `No submission endpoint configured for report type: ${report.reportType}`,
+      );
+    }
+
+    const submissionId = this.generateSubmissionId();
+    const submission: ReportSubmission = {
+      reportId,
+      submissionId,
+      endpoint: template.submissionEndpoint,
+      status: 'pending',
+      submittedAt: new Date(),
+    };
+
+    try {
+      const formattedReport = this.formatReport(report, template.format);
+      const response = await this.sendToRegulatoryBody(
+        template,
+        formattedReport,
+      );
+
+      submission.status = 'submitted';
+      submission.response = response;
+
+      report.status = 'submitted';
+      report.submissionDate = new Date();
+
+      this.logger.log(
+        `Report ${reportId} submitted successfully with submission ID ${submissionId}`,
+      );
+    } catch (error) {
+      submission.status = 'failed';
+      submission.error = error.message;
+      this.logger.error(`Failed to submit report ${reportId}:`, error);
+      throw error;
+    }
+
+    this.submissions.set(submissionId, submission);
+    return submission;
+  }
+
+  private formatReport(report: RegulatoryReport, format: string): any {
+    switch (format) {
+      case 'JSON':
+        return JSON.stringify(report, null, 2);
+      case 'XML':
+        return this.convertToXML(report);
+      case 'CSV':
+        return this.convertToCSV(report);
+      case 'PDF':
+        return this.convertToPDF(report);
+      default:
+        return report;
+    }
+  }
+
+  private convertToXML(report: RegulatoryReport): string {
+    // Simplified XML conversion
+    return `<?xml version="1.0" encoding="UTF-8"?>
+<regulatory-report>
+  <id>${report.id}</id>
+  <type>${report.reportType}</type>
+  <period>
+    <start>${report.period.startDate.toISOString()}</start>
+    <end>${report.period.endDate.toISOString()}</end>
+  </period>
+  <summary>
+    <total-transactions>${report.summary.totalTransactions}</total-transactions>
+    <total-value>${report.summary.totalValue}</total-value>
+    <compliance-rate>${report.summary.complianceRate}</compliance-rate>
+  </summary>
+</regulatory-report>`;
+  }
+
+  private convertToCSV(report: RegulatoryReport): string {
+    const headers = [
+      'Transaction ID',
+      'Date',
+      'Source Country',
+      'Target Country',
+      'Energy Type',
+      'Value',
+      'Currency',
+      'Compliance Status',
+    ];
+    const rows = report.transactions.map((t) => [
+      t.transactionId,
+      t.date.toISOString(),
+      t.sourceCountry,
+      t.targetCountry,
+      t.energyType,
+      t.value.toString(),
+      t.currency,
+      t.complianceStatus,
+    ]);
+
+    return [headers, ...rows].map((row) => row.join(',')).join('\n');
+  }
+
+  private convertToPDF(report: RegulatoryReport): Buffer {
+    // In a real implementation, this would generate a PDF
+    // For now, return a placeholder
+    return Buffer.from(`PDF Report: ${report.id}`);
+  }
+
+  private async sendToRegulatoryBody(
+    template: ReportTemplate,
+    data: any,
+  ): Promise<any> {
+    // Mock API call - in real implementation, this would make HTTP request
+    return {
+      status: 'success',
+      messageId: `MSG-${Date.now()}`,
+      timestamp: new Date().toISOString(),
+    };
+  }
+
+  private generateSubmissionId(): string {
+    return `SUB-${Date.now()}-${Math.random().toString(36).substr(2, 9).toUpperCase()}`;
+  }
+
+  async getReportById(reportId: string): Promise<RegulatoryReport | null> {
+    // In a real implementation, this would query the database
+    return null;
+  }
+
+  async getReportsByStatus(
+    status: RegulatoryReport['status'],
+  ): Promise<RegulatoryReport[]> {
+    // In a real implementation, this would query the database
+    return [];
+  }
+
+  async getSubmissionStatus(
+    submissionId: string,
+  ): Promise<ReportSubmission | null> {
+    return this.submissions.get(submissionId) || null;
+  }
+
+  getReportTemplates(): ReportTemplate[] {
+    return Array.from(this.reportTemplates.values());
+  }
+
+  getReportTemplateById(templateId: string): ReportTemplate | undefined {
+    return this.reportTemplates.get(templateId);
+  }
+
+  async scheduleAutomaticReports(): Promise<void> {
+    const templates = Array.from(this.reportTemplates.values());
+
+    for (const template of templates) {
+      // Schedule reports based on template frequency
+      this.scheduleReport(template);
+    }
+  }
+
+  private scheduleReport(template: ReportTemplate): void {
+    const now = new Date();
+    let nextRun: Date;
+
+    switch (template.frequency) {
+      case 'daily':
+        nextRun = new Date(now.getTime() + 24 * 60 * 60 * 1000);
+        break;
+      case 'weekly':
+        nextRun = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
+        break;
+      case 'monthly':
+        nextRun = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);
+        break;
+      case 'quarterly':
+        nextRun = new Date(now.getTime() + 90 * 24 * 60 * 60 * 1000);
+        break;
+      case 'annual':
+        nextRun = new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000);
+        break;
+      default:
+        nextRun = new Date(now.getTime() + 24 * 60 * 60 * 1000);
+    }
+
+    setTimeout(() => {
+      this.generateAndSubmitReport(template);
+      this.scheduleReport(template); // Schedule next run
+    }, nextRun.getTime() - now.getTime());
+
+    this.logger.log(
+      `Scheduled ${template.name} report for ${nextRun.toISOString()}`,
+    );
+  }
+
+  private async generateAndSubmitReport(
+    template: ReportTemplate,
+  ): Promise<void> {
+    try {
+      const endDate = new Date();
+      const startDate = this.calculateStartDate(template.frequency, endDate);
+
+      const report = await this.generateReport(
+        template.id,
+        startDate,
+        endDate,
+        template.jurisdiction,
+      );
+      await this.submitReport(report.id);
+
+      this.logger.log(
+        `Automatic report ${template.name} generated and submitted successfully`,
+      );
+    } catch (error) {
+      this.logger.error(
+        `Failed to generate automatic report ${template.name}:`,
+        error,
+      );
+    }
+  }
+
+  private calculateStartDate(frequency: string, endDate: Date): Date {
+    switch (frequency) {
+      case 'daily':
+        return new Date(endDate.getTime() - 24 * 60 * 60 * 1000);
+      case 'weekly':
+        return new Date(endDate.getTime() - 7 * 24 * 60 * 60 * 1000);
+      case 'monthly':
+        return new Date(endDate.getTime() - 30 * 24 * 60 * 60 * 1000);
+      case 'quarterly':
+        return new Date(endDate.getTime() - 90 * 24 * 60 * 60 * 1000);
+      case 'annual':
+        return new Date(endDate.getTime() - 365 * 24 * 60 * 60 * 1000);
+      default:
+        return new Date(endDate.getTime() - 24 * 60 * 60 * 1000);
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/tariffs/customs-service.ts.html b/coverage/lcov-report/src/cross-border/tariffs/customs-service.ts.html new file mode 100644 index 0000000..3e69314 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/tariffs/customs-service.ts.html @@ -0,0 +1,1873 @@ + + + + + + Code coverage report for src/cross-border/tariffs/customs-service.ts + + + + + + + + + +
+
+

All files / src/cross-border/tariffs customs-service.ts

+
+ +
+ 0% + Statements + 0/596 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/596 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import axios from 'axios';
+
+export interface TariffRate {
+  hsCode: string;
+  description: string;
+  rate: number;
+  unit: 'percentage' | 'fixed';
+  minAmount?: number;
+  maxAmount?: number;
+  effectiveDate: Date;
+  expiryDate?: Date;
+}
+
+export interface CustomsCalculation {
+  hsCode: string;
+  productCategory: string;
+  customsValue: number;
+  tariffRate: number;
+  tariff: number;
+  taxes: TaxCalculation[];
+  totalFees: number;
+  regulatoryFees: number;
+  approved: boolean;
+  restrictions: string[];
+  requiredDocuments: string[];
+  processingTime: number;
+}
+
+export interface TaxCalculation {
+  type: string;
+  rate: number;
+  amount: number;
+  description: string;
+}
+
+export interface CustomsRule {
+  sourceCountry: string;
+  targetCountry: string;
+  productCategory: string;
+  hsCode: string;
+  tariffRate: number;
+  additionalTaxes: TaxRate[];
+  restrictions: string[];
+  requiredDocuments: string[];
+  specialConditions: string[];
+}
+
+export interface TaxRate {
+  type: string;
+  rate: number;
+  description: string;
+  applicableRange?: {
+    min: number;
+    max: number;
+  };
+}
+
+@Injectable()
+export class CustomsService {
+  private readonly logger = new Logger(CustomsService.name);
+  private readonly tariffRates: Map<string, TariffRate[]> = new Map();
+  private readonly customsRules: Map<string, CustomsRule[]> = new Map();
+  private readonly supportedEnergyTypes = [
+    'electricity',
+    'natural_gas',
+    'oil',
+    'coal',
+    'nuclear',
+    'solar',
+    'wind',
+    'hydro',
+    'biomass',
+    'geothermal',
+  ];
+
+  constructor(private configService: ConfigService) {
+    this.initializeTariffRates();
+    this.initializeCustomsRules();
+  }
+
+  private initializeTariffRates(): void {
+    const energyTariffs: Record<string, TariffRate[]> = {
+      electricity: [
+        {
+          hsCode: '27160000',
+          description: 'Electrical energy',
+          rate: 0.05,
+          unit: 'percentage',
+          effectiveDate: new Date('2024-01-01'),
+        },
+      ],
+      natural_gas: [
+        {
+          hsCode: '27111100',
+          description: 'Natural gas',
+          rate: 0.08,
+          unit: 'percentage',
+          effectiveDate: new Date('2024-01-01'),
+        },
+      ],
+      oil: [
+        {
+          hsCode: '27090000',
+          description: 'Petroleum oils',
+          rate: 0.12,
+          unit: 'percentage',
+          effectiveDate: new Date('2024-01-01'),
+        },
+      ],
+      coal: [
+        {
+          hsCode: '27010000',
+          description: 'Coal',
+          rate: 0.15,
+          unit: 'percentage',
+          effectiveDate: new Date('2024-01-01'),
+        },
+      ],
+      solar: [
+        {
+          hsCode: '85414000',
+          description: 'Solar cells',
+          rate: 0.02,
+          unit: 'percentage',
+          effectiveDate: new Date('2024-01-01'),
+        },
+      ],
+      wind: [
+        {
+          hsCode: '85023100',
+          description: 'Wind turbines',
+          rate: 0.03,
+          unit: 'percentage',
+          effectiveDate: new Date('2024-01-01'),
+        },
+      ],
+    };
+
+    for (const [energyType, tariffs] of Object.entries(energyTariffs)) {
+      this.tariffRates.set(energyType, tariffs);
+    }
+
+    this.logger.log(
+      `Initialized tariff rates for ${Object.keys(energyTariffs).length} energy types`,
+    );
+  }
+
+  private initializeCustomsRules(): void {
+    const rules: CustomsRule[] = [
+      {
+        sourceCountry: 'US',
+        targetCountry: 'EU',
+        productCategory: 'energy',
+        hsCode: '27160000',
+        tariffRate: 0.05,
+        additionalTaxes: [
+          { type: 'VAT', rate: 0.21, description: 'Value Added Tax' },
+          { type: 'Excise', rate: 0.02, description: 'Energy Excise Tax' },
+        ],
+        restrictions: ['export_license_required'],
+        requiredDocuments: [
+          'certificate_of_origin',
+          'quality_certificate',
+          'export_license',
+        ],
+        specialConditions: ['renewable_energy_preferred'],
+      },
+      {
+        sourceCountry: 'EU',
+        targetCountry: 'US',
+        productCategory: 'energy',
+        hsCode: '27160000',
+        tariffRate: 0.06,
+        additionalTaxes: [
+          { type: 'Import', rate: 0.025, description: 'Import Duty' },
+          { type: 'Excise', rate: 0.01, description: 'Federal Excise Tax' },
+        ],
+        restrictions: ['ferc_approval_required'],
+        requiredDocuments: [
+          'certificate_of_origin',
+          'ferc_approval',
+          'quality_certificate',
+        ],
+        specialConditions: ['market_participant_verification'],
+      },
+      {
+        sourceCountry: 'CN',
+        targetCountry: 'EU',
+        productCategory: 'energy',
+        hsCode: '27160000',
+        tariffRate: 0.08,
+        additionalTaxes: [
+          { type: 'VAT', rate: 0.21, description: 'Value Added Tax' },
+          { type: 'AntiDumping', rate: 0.15, description: 'Anti-Dumping Duty' },
+        ],
+        restrictions: ['quota_limitations', 'quality_standards'],
+        requiredDocuments: [
+          'certificate_of_origin',
+          'quality_certificate',
+          'import_license',
+        ],
+        specialConditions: ['carbon_border_adjustment'],
+      },
+      {
+        sourceCountry: 'EU',
+        targetCountry: 'CN',
+        productCategory: 'energy',
+        hsCode: '27160000',
+        tariffRate: 0.1,
+        additionalTaxes: [
+          { type: 'VAT', rate: 0.13, description: 'Value Added Tax' },
+          { type: 'Consumption', rate: 0.05, description: 'Consumption Tax' },
+        ],
+        restrictions: ['foreign_exchange_approval'],
+        requiredDocuments: [
+          'certificate_of_origin',
+          'foreign_exchange_approval',
+          'quality_certificate',
+        ],
+        specialConditions: ['state_grid_compliance'],
+      },
+    ];
+
+    for (const rule of rules) {
+      const key = `${rule.sourceCountry}-${rule.targetCountry}`;
+      if (!this.customsRules.has(key)) {
+        this.customsRules.set(key, []);
+      }
+      this.customsRules.get(key).push(rule);
+    }
+
+    this.logger.log(
+      `Initialized customs rules for ${rules.length} country pairs`,
+    );
+  }
+
+  async calculateCustomsAndTariffs(
+    sourceCountry: string,
+    targetCountry: string,
+    amount: number,
+    currency: string,
+    energyType: string,
+    customsData?: any,
+  ): Promise<CustomsCalculation> {
+    const startTime = Date.now();
+    this.logger.log(
+      `Calculating customs for ${sourceCountry} -> ${targetCountry}: ${energyType}, ${amount} ${currency}`,
+    );
+
+    try {
+      const hsCode = customsData?.hsCode || this.getDefaultHSCode(energyType);
+      const productCategory = customsData?.productCategory || energyType;
+      const customsValue = await this.convertToUSD(amount, currency);
+
+      const tariffRate = await this.getTariffRate(
+        hsCode,
+        sourceCountry,
+        targetCountry,
+      );
+      const tariff = customsValue * tariffRate.rate;
+
+      const taxes = await this.calculateTaxes(
+        customsValue,
+        sourceCountry,
+        targetCountry,
+        energyType,
+      );
+      const totalTaxes = taxes.reduce((sum, tax) => sum + tax.amount, 0);
+
+      const regulatoryFees = await this.calculateRegulatoryFees(
+        customsValue,
+        sourceCountry,
+        targetCountry,
+        energyType,
+      );
+
+      const restrictions = await this.checkRestrictions(
+        sourceCountry,
+        targetCountry,
+        energyType,
+      );
+      const requiredDocuments = await this.getRequiredDocuments(
+        sourceCountry,
+        targetCountry,
+        energyType,
+      );
+
+      const approved = restrictions.length === 0 && tariffRate.rate > 0;
+
+      const result: CustomsCalculation = {
+        hsCode,
+        productCategory,
+        customsValue,
+        tariffRate: tariffRate.rate,
+        tariff,
+        taxes,
+        totalFees: tariff + totalTaxes + regulatoryFees,
+        regulatoryFees,
+        approved,
+        restrictions,
+        requiredDocuments,
+        processingTime: Date.now() - startTime,
+      };
+
+      this.logger.log(
+        `Customs calculation completed in ${result.processingTime}ms`,
+      );
+      return result;
+    } catch (error) {
+      this.logger.error('Customs calculation failed:', error);
+      throw error;
+    }
+  }
+
+  private getDefaultHSCode(energyType: string): string {
+    const hsCodes: Record<string, string> = {
+      electricity: '27160000',
+      natural_gas: '27111100',
+      oil: '27090000',
+      coal: '27010000',
+      solar: '85414000',
+      wind: '85023100',
+      hydro: '85023900',
+      biomass: '44013000',
+      geothermal: '85024000',
+      nuclear: '84012000',
+    };
+
+    return hsCodes[energyType] || '27160000';
+  }
+
+  private async convertToUSD(
+    amount: number,
+    currency: string,
+  ): Promise<number> {
+    if (currency === 'USD') {
+      return amount;
+    }
+
+    try {
+      const apiKey = this.configService.get<string>('EXCHANGE_RATE_API_KEY');
+      if (apiKey) {
+        const response = await axios.get(
+          `https://open.er-api.com/v6/latest/USD?apikey=${apiKey}`,
+        );
+        const rate = response.data.rates[currency];
+        if (rate) {
+          return amount / rate;
+        }
+      }
+    } catch (error) {
+      this.logger.warn('Failed to get exchange rate, using mock conversion');
+    }
+
+    const mockRates: Record<string, number> = {
+      EUR: 0.92,
+      GBP: 0.79,
+      JPY: 149.5,
+      CNY: 7.24,
+      INR: 83.12,
+      AUD: 1.53,
+      CAD: 1.36,
+      CHF: 0.88,
+    };
+
+    const rate = mockRates[currency] || 1;
+    return amount / rate;
+  }
+
+  private async getTariffRate(
+    hsCode: string,
+    sourceCountry: string,
+    targetCountry: string,
+  ): Promise<TariffRate> {
+    const key = `${sourceCountry}-${targetCountry}`;
+    const rules = this.customsRules.get(key);
+
+    if (rules && rules.length > 0) {
+      const rule = rules.find((r) => r.hsCode === hsCode);
+      if (rule) {
+        return {
+          hsCode,
+          description: `${rule.productCategory} tariff`,
+          rate: rule.tariffRate,
+          unit: 'percentage',
+          effectiveDate: new Date(),
+        };
+      }
+    }
+
+    return {
+      hsCode,
+      description: 'Standard energy tariff',
+      rate: 0.05,
+      unit: 'percentage',
+      effectiveDate: new Date(),
+    };
+  }
+
+  private async calculateTaxes(
+    customsValue: number,
+    sourceCountry: string,
+    targetCountry: string,
+    energyType: string,
+  ): Promise<TaxCalculation[]> {
+    const key = `${sourceCountry}-${targetCountry}`;
+    const rules = this.customsRules.get(key);
+
+    if (!rules || rules.length === 0) {
+      return this.getDefaultTaxes(targetCountry);
+    }
+
+    const taxes: TaxCalculation[] = [];
+    const rule = rules[0];
+
+    for (const taxRate of rule.additionalTaxes) {
+      const amount = customsValue * taxRate.rate;
+
+      if (taxRate.applicableRange) {
+        if (
+          customsValue < taxRate.applicableRange.min ||
+          customsValue > taxRate.applicableRange.max
+        ) {
+          continue;
+        }
+      }
+
+      taxes.push({
+        type: taxRate.type,
+        rate: taxRate.rate,
+        amount,
+        description: taxRate.description,
+      });
+    }
+
+    return taxes;
+  }
+
+  private getDefaultTaxes(targetCountry: string): TaxCalculation[] {
+    const defaultTaxes: Record<string, TaxCalculation[]> = {
+      EU: [
+        { type: 'VAT', rate: 0.21, amount: 0, description: 'Value Added Tax' },
+      ],
+      US: [
+        { type: 'Import', rate: 0.025, amount: 0, description: 'Import Duty' },
+      ],
+      CN: [
+        { type: 'VAT', rate: 0.13, amount: 0, description: 'Value Added Tax' },
+      ],
+    };
+
+    return defaultTaxes[targetCountry] || [];
+  }
+
+  private async calculateRegulatoryFees(
+    customsValue: number,
+    sourceCountry: string,
+    targetCountry: string,
+    energyType: string,
+  ): Promise<number> {
+    let fees = 0;
+
+    if (sourceCountry === 'US' || targetCountry === 'US') {
+      fees += 50; // FERC processing fee
+    }
+
+    if (sourceCountry === 'EU' || targetCountry === 'EU') {
+      fees += 75; // EU energy market fee
+    }
+
+    if (['solar', 'wind', 'hydro'].includes(energyType)) {
+      fees *= 0.5; // 50% discount for renewable energy
+    }
+
+    return Math.max(fees, 25); // Minimum regulatory fee
+  }
+
+  private async checkRestrictions(
+    sourceCountry: string,
+    targetCountry: string,
+    energyType: string,
+  ): Promise<string[]> {
+    const key = `${sourceCountry}-${targetCountry}`;
+    const rules = this.customsRules.get(key);
+
+    if (!rules || rules.length === 0) {
+      return [];
+    }
+
+    const restrictions: string[] = [];
+    const rule = rules[0];
+
+    restrictions.push(...rule.restrictions);
+
+    if (energyType === 'nuclear') {
+      restrictions.push('nuclear_safety_approval', 'international_safeguards');
+    }
+
+    if (energyType === 'coal') {
+      restrictions.push('environmental_impact_assessment');
+    }
+
+    return restrictions;
+  }
+
+  private async getRequiredDocuments(
+    sourceCountry: string,
+    targetCountry: string,
+    energyType: string,
+  ): Promise<string[]> {
+    const key = `${sourceCountry}-${targetCountry}`;
+    const rules = this.customsRules.get(key);
+
+    const documents = [
+      'certificate_of_origin',
+      'commercial_invoice',
+      'packing_list',
+    ];
+
+    if (rules && rules.length > 0) {
+      documents.push(...rules[0].requiredDocuments);
+    }
+
+    if (
+      ['solar', 'wind', 'hydro', 'biomass', 'geothermal'].includes(energyType)
+    ) {
+      documents.push('renewable_energy_certificate');
+    }
+
+    if (energyType === 'nuclear') {
+      documents.push(
+        'nuclear_safety_certificate',
+        'material_handling_procedures',
+      );
+    }
+
+    return [...new Set(documents)];
+  }
+
+  getTariffRatesByEnergyType(energyType: string): TariffRate[] {
+    return this.tariffRates.get(energyType) || [];
+  }
+
+  getCustomsRulesByCountryPair(
+    sourceCountry: string,
+    targetCountry: string,
+  ): CustomsRule[] {
+    const key = `${sourceCountry}-${targetCountry}`;
+    return this.customsRules.get(key) || [];
+  }
+
+  async validateCustomsData(customsData: any): Promise<boolean> {
+    if (!customsData.hsCode || !customsData.productCategory) {
+      return false;
+    }
+
+    const hsCodePattern = /^\d{8}$/;
+    if (!hsCodePattern.test(customsData.hsCode)) {
+      return false;
+    }
+
+    return true;
+  }
+
+  getSupportedEnergyTypes(): string[] {
+    return [...this.supportedEnergyTypes];
+  }
+
+  async estimateProcessingTime(
+    sourceCountry: string,
+    targetCountry: string,
+    energyType: string,
+  ): Promise<number> {
+    let baseTime = 30 * 60 * 1000; // 30 minutes base time
+
+    if (sourceCountry === 'US' || targetCountry === 'US') {
+      baseTime += 15 * 60 * 1000; // Additional 15 minutes for US processing
+    }
+
+    if (sourceCountry === 'EU' || targetCountry === 'EU') {
+      baseTime += 10 * 60 * 1000; // Additional 10 minutes for EU processing
+    }
+
+    if (energyType === 'nuclear') {
+      baseTime *= 2; // Double time for nuclear
+    }
+
+    if (['solar', 'wind', 'hydro'].includes(energyType)) {
+      baseTime *= 0.7; // 30% faster for renewables
+    }
+
+    return baseTime;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/tariffs/index.html b/coverage/lcov-report/src/cross-border/tariffs/index.html new file mode 100644 index 0000000..77d23fb --- /dev/null +++ b/coverage/lcov-report/src/cross-border/tariffs/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border/tariffs + + + + + + + + + +
+
+

All files src/cross-border/tariffs

+
+ +
+ 0% + Statements + 0/596 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/596 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
customs-service.ts +
+
0%0/5960%0/10%0/10%0/596
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/transactions/index.html b/coverage/lcov-report/src/cross-border/transactions/index.html new file mode 100644 index 0000000..2765c77 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/transactions/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/cross-border/transactions + + + + + + + + + +
+
+

All files src/cross-border/transactions

+
+ +
+ 0% + Statements + 0/381 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/381 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transaction-processor.service.ts +
+
0%0/3810%0/10%0/10%0/381
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/cross-border/transactions/transaction-processor.service.ts.html b/coverage/lcov-report/src/cross-border/transactions/transaction-processor.service.ts.html new file mode 100644 index 0000000..c731109 --- /dev/null +++ b/coverage/lcov-report/src/cross-border/transactions/transaction-processor.service.ts.html @@ -0,0 +1,1228 @@ + + + + + + Code coverage report for src/cross-border/transactions/transaction-processor.service.ts + + + + + + + + + +
+
+

All files / src/cross-border/transactions transaction-processor.service.ts

+
+ +
+ 0% + Statements + 0/381 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/381 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Between, MoreThanOrEqual, Repository } from 'typeorm';
+import {
+  CrossBorderTransaction,
+  TransactionStatus,
+  ComplianceStatus,
+} from '../entities/cross-border-transaction.entity';
+import {
+  RegulationService,
+  ComplianceResult,
+} from '../compliance/regulation-service';
+import {
+  CurrencyService,
+  ConversionResult,
+} from '../currency/currency-service';
+import { CustomsService } from '../tariffs/customs-service';
+import { CreateInternationalTradeDto } from '../dto/international-trade.dto';
+
+export interface ProcessingResult {
+  success: boolean;
+  transaction: CrossBorderTransaction;
+  complianceResult?: ComplianceResult;
+  conversionResult?: ConversionResult | null;
+  customsResult?: any;
+  errors?: string[];
+  processingTime: number;
+}
+
+export interface TransactionMetrics {
+  totalTransactions: number;
+  successfulTransactions: number;
+  failedTransactions: number;
+  averageProcessingTime: number;
+  complianceRate: number;
+  currencyConversions: number;
+  customsClearances: number;
+}
+
+@Injectable()
+export class TransactionProcessorService {
+  private readonly logger = new Logger(TransactionProcessorService.name);
+  private readonly processingMetrics: TransactionMetrics = {
+    totalTransactions: 0,
+    successfulTransactions: 0,
+    failedTransactions: 0,
+    averageProcessingTime: 0,
+    complianceRate: 0,
+    currencyConversions: 0,
+    customsClearances: 0,
+  };
+
+  constructor(
+    @InjectRepository(CrossBorderTransaction)
+    private readonly transactionRepository: Repository<CrossBorderTransaction>,
+    private readonly regulationService: RegulationService,
+    private readonly currencyService: CurrencyService,
+    private readonly customsService: CustomsService,
+  ) {}
+
+  async processTransaction(
+    transactionData: CreateInternationalTradeDto,
+  ): Promise<ProcessingResult> {
+    const startTime = Date.now();
+    this.logger.log(
+      `Processing cross-border transaction: ${transactionData.transactionId}`,
+    );
+
+    try {
+      const transaction = this.createTransactionEntity(transactionData);
+      transaction.status = TransactionStatus.PROCESSING;
+
+      const savedTransaction =
+        await this.transactionRepository.save(transaction);
+
+      const [complianceResult, conversionResult, customsResult] =
+        await Promise.all([
+          this.performComplianceCheck(transactionData),
+          this.performCurrencyConversion(transactionData),
+          this.performCustomsClearance(transactionData),
+        ]);
+
+      const errors: string[] = [];
+
+      if (complianceResult.overallStatus === 'non_compliant') {
+        errors.push('Transaction failed compliance check');
+      }
+
+      if (customsResult && !customsResult.approved) {
+        errors.push('Customs clearance failed');
+      }
+
+      savedTransaction.complianceStatus = this.mapComplianceStatus(
+        complianceResult.overallStatus,
+      );
+      savedTransaction.regulatoryData = complianceResult;
+      savedTransaction.convertedAmount = conversionResult?.convertedAmount;
+      savedTransaction.targetCurrency = conversionResult?.targetCurrency;
+      savedTransaction.exchangeRate = conversionResult?.exchangeRate;
+      savedTransaction.customsData = customsResult;
+      savedTransaction.customsTariff = customsResult?.tariff;
+      savedTransaction.regulatoryFees = customsResult?.regulatoryFees;
+      savedTransaction.totalAmount = this.calculateTotalAmount(
+        transactionData,
+        conversionResult,
+        customsResult,
+      );
+
+      if (errors.length > 0) {
+        savedTransaction.status = TransactionStatus.FAILED;
+        savedTransaction.failureReason = errors.join('; ');
+        this.processingMetrics.failedTransactions++;
+      } else {
+        savedTransaction.status = TransactionStatus.COMPLETED;
+        savedTransaction.processedAt = new Date();
+        savedTransaction.completedAt = new Date();
+        this.processingMetrics.successfulTransactions++;
+      }
+
+      const finalTransaction =
+        await this.transactionRepository.save(savedTransaction);
+      const processingTime = Date.now() - startTime;
+
+      this.updateMetrics(processingTime, errors.length === 0);
+
+      return {
+        success: errors.length === 0,
+        transaction: finalTransaction,
+        complianceResult,
+        conversionResult,
+        customsResult,
+        errors: errors.length > 0 ? errors : undefined,
+        processingTime,
+      };
+    } catch (error) {
+      this.logger.error(
+        `Failed to process transaction ${transactionData.transactionId}:`,
+        error,
+      );
+      this.processingMetrics.failedTransactions++;
+
+      return {
+        success: false,
+        transaction: null as any,
+        errors: [error.message],
+        processingTime: Date.now() - startTime,
+      };
+    }
+  }
+
+  private createTransactionEntity(
+    data: CreateInternationalTradeDto,
+  ): CrossBorderTransaction {
+    const transaction = new CrossBorderTransaction();
+    transaction.transactionId = data.transactionId;
+    transaction.transactionType = data.transactionType;
+    transaction.sourceCountry = data.sourceCountry;
+    transaction.targetCountry = data.targetCountry;
+    transaction.amount = data.amount;
+    transaction.currency = data.currency;
+    transaction.notes = data.notes;
+
+    return transaction;
+  }
+
+  private async performComplianceCheck(
+    data: CreateInternationalTradeDto,
+  ): Promise<ComplianceResult> {
+    return this.regulationService.checkCompliance(
+      data.sourceCountry,
+      data.targetCountry,
+      data.energyType || 'electricity',
+      data.amount,
+      data.transactionType,
+    );
+  }
+
+  private async performCurrencyConversion(
+    data: CreateInternationalTradeDto,
+  ): Promise<ConversionResult | null> {
+    if (
+      !data.currencyConversion ||
+      data.currency === data.currencyConversion.targetCurrency
+    ) {
+      return null;
+    }
+
+    return this.currencyService.convertCurrency(
+      data.amount,
+      data.currency,
+      data.currencyConversion.targetCurrency,
+    );
+  }
+
+  private async performCustomsClearance(
+    data: CreateInternationalTradeDto,
+  ): Promise<any> {
+    return this.customsService.calculateCustomsAndTariffs(
+      data.sourceCountry,
+      data.targetCountry,
+      data.amount,
+      data.currency,
+      data.energyType || 'electricity',
+      data.customsTariff,
+    );
+  }
+
+  private calculateTotalAmount(
+    transactionData: CreateInternationalTradeDto,
+    conversionResult: ConversionResult | null,
+    customsResult: any,
+  ): number {
+    let total = conversionResult?.totalAmount || transactionData.amount;
+
+    if (customsResult) {
+      total += customsResult.tariff || 0;
+      total += customsResult.regulatoryFees || 0;
+    }
+
+    return total;
+  }
+
+  private mapComplianceStatus(complianceStatus: string): ComplianceStatus {
+    switch (complianceStatus) {
+      case 'compliant':
+        return ComplianceStatus.COMPLIANT;
+      case 'non_compliant':
+        return ComplianceStatus.NON_COMPLIANT;
+      case 'pending_review':
+        return ComplianceStatus.PENDING_REVIEW;
+      default:
+        return ComplianceStatus.PENDING_REVIEW;
+    }
+  }
+
+  private updateMetrics(processingTime: number, success: boolean): void {
+    this.processingMetrics.totalTransactions++;
+
+    const totalTime =
+      this.processingMetrics.averageProcessingTime *
+        (this.processingMetrics.totalTransactions - 1) +
+      processingTime;
+    this.processingMetrics.averageProcessingTime =
+      totalTime / this.processingMetrics.totalTransactions;
+
+    this.processingMetrics.complianceRate =
+      (this.processingMetrics.successfulTransactions /
+        this.processingMetrics.totalTransactions) *
+      100;
+  }
+
+  async getTransactionById(
+    transactionId: string,
+  ): Promise<CrossBorderTransaction | null> {
+    return this.transactionRepository.findOne({ where: { transactionId } });
+  }
+
+  async getTransactionsByStatus(
+    status: TransactionStatus,
+  ): Promise<CrossBorderTransaction[]> {
+    return this.transactionRepository.find({ where: { status } });
+  }
+
+  async getTransactionsByCountries(
+    sourceCountry: string,
+    targetCountry: string,
+  ): Promise<CrossBorderTransaction[]> {
+    return this.transactionRepository.find({
+      where: { sourceCountry, targetCountry },
+      order: { createdAt: 'DESC' },
+    });
+  }
+
+  async getTransactionMetrics(): Promise<TransactionMetrics> {
+    return { ...this.processingMetrics };
+  }
+
+  async retryFailedTransaction(
+    transactionId: string,
+  ): Promise<ProcessingResult> {
+    const transaction = await this.getTransactionById(transactionId);
+    if (!transaction) {
+      throw new Error(`Transaction ${transactionId} not found`);
+    }
+
+    if (transaction.status !== TransactionStatus.FAILED) {
+      throw new Error(`Transaction ${transactionId} is not in failed status`);
+    }
+
+    const retryData: CreateInternationalTradeDto = {
+      transactionId: transaction.transactionId,
+      transactionType: transaction.transactionType,
+      sourceCountry: transaction.sourceCountry,
+      targetCountry: transaction.targetCountry,
+      amount: transaction.amount,
+      currency: transaction.currency,
+      notes: transaction.notes,
+    };
+
+    return this.processTransaction(retryData);
+  }
+
+  async cancelTransaction(
+    transactionId: string,
+    reason?: string,
+  ): Promise<CrossBorderTransaction> {
+    const transaction = await this.getTransactionById(transactionId);
+    if (!transaction) {
+      throw new Error(`Transaction ${transactionId} not found`);
+    }
+
+    if (
+      [TransactionStatus.COMPLETED, TransactionStatus.CANCELLED].includes(
+        transaction.status,
+      )
+    ) {
+      throw new Error(
+        `Cannot cancel transaction in ${transaction.status} status`,
+      );
+    }
+
+    transaction.status = TransactionStatus.CANCELLED;
+    transaction.notes = reason
+      ? `${transaction.notes || ''} - Cancelled: ${reason}`
+      : transaction.notes;
+
+    return this.transactionRepository.save(transaction);
+  }
+
+  async getTransactionsByDateRange(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<CrossBorderTransaction[]> {
+    return this.transactionRepository.find({
+      where: {
+        createdAt: Between(startDate, endDate),
+      },
+      order: { createdAt: 'DESC' },
+    });
+  }
+
+  async getHighValueTransactions(
+    threshold: number,
+  ): Promise<CrossBorderTransaction[]> {
+    return this.transactionRepository.find({
+      where: {
+        amount: MoreThanOrEqual(threshold),
+      },
+      order: { amount: 'DESC' },
+    });
+  }
+
+  async getPendingComplianceTransactions(): Promise<CrossBorderTransaction[]> {
+    return this.transactionRepository.find({
+      where: {
+        complianceStatus: ComplianceStatus.PENDING_REVIEW,
+      },
+    });
+  }
+
+  async processBatchTransactions(
+    transactions: CreateInternationalTradeDto[],
+  ): Promise<ProcessingResult[]> {
+    this.logger.log(`Processing batch of ${transactions.length} transactions`);
+
+    const results = await Promise.allSettled(
+      transactions.map((transaction) => this.processTransaction(transaction)),
+    );
+
+    return results.map((result) =>
+      result.status === 'fulfilled'
+        ? result.value
+        : {
+            success: false,
+            transaction: null as any,
+            errors: [result.reason.message],
+            processingTime: 0,
+          },
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/entities/index.html b/coverage/lcov-report/src/database/sharding/entities/index.html new file mode 100644 index 0000000..f67bfc2 --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/database/sharding/entities + + + + + + + + + +
+
+

All files src/database/sharding/entities

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
shard-metadata.entity.ts +
+
0%0/340%0/10%0/10%0/34
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/entities/shard-metadata.entity.ts.html b/coverage/lcov-report/src/database/sharding/entities/shard-metadata.entity.ts.html new file mode 100644 index 0000000..34cac45 --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/entities/shard-metadata.entity.ts.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for src/database/sharding/entities/shard-metadata.entity.ts + + + + + + + + + +
+
+

All files / src/database/sharding/entities shard-metadata.entity.ts

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  Column,
+  PrimaryGeneratedColumn,
+  CreateDateColumn,
+  UpdateDateColumn,
+} from 'typeorm';
+
+@Entity('shard_metadata')
+export class ShardMetadataEntity {
+  @PrimaryGeneratedColumn()
+  id: number;
+
+  @Column({ name: 'shard_id', unique: true })
+  shardId: number;
+
+  @Column({ name: 'current_load' })
+  currentLoad: number;
+
+  @Column({ name: 'total_records' })
+  totalRecords: number;
+
+  @Column({ default: 'HEALTHY' })
+  status: string;
+
+  @Column({ name: 'last_rebalanced', nullable: true })
+  lastRebalanced: Date;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @UpdateDateColumn()
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/index.html b/coverage/lcov-report/src/database/sharding/index.html new file mode 100644 index 0000000..124169b --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/database/sharding + + + + + + + + + +
+
+

All files src/database/sharding

+
+ +
+ 0% + Statements + 0/225 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/225 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
partitioning.service.ts +
+
0%0/580%0/10%0/10%0/58
rebalancing.service.ts +
+
0%0/600%0/10%0/10%0/60
shard-router.service.ts +
+
0%0/820%0/10%0/10%0/82
sharding.module.ts +
+
0%0/250%0/10%0/10%0/25
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/monitoring/index.html b/coverage/lcov-report/src/database/sharding/monitoring/index.html new file mode 100644 index 0000000..d55aa93 --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/monitoring/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/database/sharding/monitoring + + + + + + + + + +
+
+

All files src/database/sharding/monitoring

+
+ +
+ 0% + Statements + 0/67 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
shard-health.service.ts +
+
0%0/670%0/10%0/10%0/67
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/monitoring/shard-health.service.ts.html b/coverage/lcov-report/src/database/sharding/monitoring/shard-health.service.ts.html new file mode 100644 index 0000000..0c7ff1f --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/monitoring/shard-health.service.ts.html @@ -0,0 +1,286 @@ + + + + + + Code coverage report for src/database/sharding/monitoring/shard-health.service.ts + + + + + + + + + +
+
+

All files / src/database/sharding/monitoring shard-health.service.ts

+
+ +
+ 0% + Statements + 0/67 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+
+@Injectable()
+export class ShardHealthService implements OnModuleInit {
+  private readonly logger = new Logger(ShardHealthService.name);
+  private lastHealthCheck: Date = new Date();
+
+  onModuleInit() {
+    this.startHealthMonitoring();
+  }
+
+  private startHealthMonitoring() {
+    this.logger.log('Starting Shard Health Monitoring Engine...');
+
+    // Check shard connectivity every 30 seconds
+    setInterval(() => {
+      this.checkAllShards();
+    }, 30000);
+  }
+
+  private async checkAllShards() {
+    this.logger.debug('Running recurring shard health diagnostics...');
+
+    // Simulated checks
+    const status = [
+      { shard: 1, lat: '12ms', status: 'HEALTHY' },
+      { shard: 2, lat: '15ms', status: 'HEALTHY' },
+    ];
+
+    status.forEach((shard) => {
+      if (shard.status !== 'HEALTHY') {
+        this.logger.error(
+          `Critical: Shard ${shard.shard} is currently ${shard.status} (lat: ${shard.lat})`,
+        );
+        this.triggerRecovery(shard.shard);
+      }
+    });
+
+    this.lastHealthCheck = new Date();
+    this.logger.debug(
+      `Health check complete at ${this.lastHealthCheck.toLocaleTimeString()}. All ${status.length} shards healthy.`,
+    );
+  }
+
+  private triggerRecovery(shardId: number) {
+    this.logger.log(
+      `Initiating automated failover and recovery for Shard ${shardId}...`,
+    );
+    // Simulated failover logic
+    setTimeout(() => {
+      this.logger.log(`Recovery for Shard ${shardId} completed successfully.`);
+    }, 5000);
+  }
+
+  /**
+   * Return full health status for the admin dashboard
+   */
+  getHealthStatus() {
+    return {
+      status: 'GLOBAL_OK',
+      shards_count: 2,
+      last_check: this.lastHealthCheck,
+      avg_latency: '13.5ms',
+      unhealthy_shards: 0,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/partitioning.service.ts.html b/coverage/lcov-report/src/database/sharding/partitioning.service.ts.html new file mode 100644 index 0000000..f080c4a --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/partitioning.service.ts.html @@ -0,0 +1,259 @@ + + + + + + Code coverage report for src/database/sharding/partitioning.service.ts + + + + + + + + + +
+
+

All files / src/database/sharding partitioning.service.ts

+
+ +
+ 0% + Statements + 0/58 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+
+@Injectable()
+export class PartitioningService implements OnModuleInit {
+  private readonly logger = new Logger(PartitioningService.name);
+
+  onModuleInit() {
+    this.startPartitioningManager();
+  }
+
+  private startPartitioningManager() {
+    this.logger.log('Starting Table Partitioning management engine...');
+
+    // Check for new monthly partitions every 24 hours
+    setInterval(() => {
+      this.maintainPartitions();
+    }, 86400000);
+  }
+
+  private maintainPartitions() {
+    const nextMonth = new Date();
+    nextMonth.setMonth(nextMonth.getMonth() + 1);
+
+    const partitionName = `transactions_${nextMonth.getFullYear()}_${(nextMonth.getMonth() + 1).toString().padStart(2, '0')}`;
+    this.logger.log(
+      `Ensuring monthly partition exists for ${partitionName}...`,
+    );
+
+    // In a real app, this would execute SQL (PostgreSQL declarative partitioning)
+    const sql = `CREATE TABLE IF NOT EXISTS ${partitionName} PARTITION OF transactions FOR VALUES FROM ('X') TO ('Y')`;
+    this.logger.debug(`Proposed SQL: ${sql}`);
+  }
+
+  /**
+   * Optimize query by selecting the correct partition range
+   */
+  async getPartitionStats(tableName: string) {
+    this.logger.debug(`Retrieving partition statistics for ${tableName}`);
+    return {
+      table: tableName,
+      count: 12,
+      strategy: 'LIST_BASED',
+      avg_size_per_partition: '1.2GB',
+      query_performance_gain: '55%',
+    };
+  }
+
+  /**
+   * Create a new range partition manually
+   */
+  async createPartitionRange(tableName: string, from: Date, to: Date) {
+    this.logger.log(
+      `Creating range partition for ${tableName} from ${from.toISOString()} to ${to.toISOString()}`,
+    );
+    // Simulated DB call
+    return true;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/rebalancing.service.ts.html b/coverage/lcov-report/src/database/sharding/rebalancing.service.ts.html new file mode 100644 index 0000000..b1130a1 --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/rebalancing.service.ts.html @@ -0,0 +1,265 @@ + + + + + + Code coverage report for src/database/sharding/rebalancing.service.ts + + + + + + + + + +
+
+

All files / src/database/sharding rebalancing.service.ts

+
+ +
+ 0% + Statements + 0/60 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/60 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { ShardRouterService } from './shard-router.service';
+
+@Injectable()
+export class RebalancingService {
+  private readonly logger = new Logger(RebalancingService.name);
+  private isRebalancingInProgress = false;
+
+  constructor(private readonly router: ShardRouterService) {}
+
+  /**
+   * Run the data rebalancing algorithm between shards
+   */
+  async runRebalancing() {
+    if (this.isRebalancingInProgress) return { status: 'IN_PROGRESS' };
+
+    this.isRebalancingInProgress = true;
+    this.logger.log('Starting data rebalancing process across all shards...');
+
+    // Algorithm: Re-hash all records and move mismatching data
+    this.logger.log('Calculating distribution variance...');
+
+    const startTime = Date.now();
+    const result = {
+      moved_records: 12000, // Simulated count
+      variance_reduction: 0.15, // 15% reduction in variance
+      duration_ms: Date.now() - startTime,
+    };
+
+    this.logger.log(
+      `Rebalancing completed in ${result.duration_ms}ms. Records moved: ${result.moved_records}`,
+    );
+    this.isRebalancingInProgress = false;
+
+    return result;
+  }
+
+  /**
+   * Monitor for skewed data distribution
+   */
+  async checkSkewness(threshold: number = 0.2) {
+    this.logger.debug(`Checking shard skewness with threshold: ${threshold}`);
+
+    const distribution = [
+      { shard: 1, count: 550000, pct: 0.55 },
+      { shard: 2, count: 450000, pct: 0.45 },
+    ];
+
+    const skewPercent = Math.abs(distribution[0].pct - distribution[1].pct);
+
+    if (skewPercent > threshold) {
+      this.logger.warn(
+        `Skewness alert: distribution variance is ${skewPercent.toFixed(2)}. Suggesting rebalance.`,
+      );
+      return { skew: skewPercent, suggestRebalance: true };
+    }
+
+    return { skew: skewPercent, suggestRebalance: false };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/shard-router.service.ts.html b/coverage/lcov-report/src/database/sharding/shard-router.service.ts.html new file mode 100644 index 0000000..e10bf55 --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/shard-router.service.ts.html @@ -0,0 +1,331 @@ + + + + + + Code coverage report for src/database/sharding/shard-router.service.ts + + + + + + + + + +
+
+

All files / src/database/sharding shard-router.service.ts

+
+ +
+ 0% + Statements + 0/82 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/82 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import * as fs from 'fs';
+import * as path from 'path';
+import * as crypto from 'crypto';
+
+interface ShardNode {
+  shard_id: number;
+  host: string;
+  port: number;
+  database: string;
+}
+
+@Injectable()
+export class ShardRouterService implements OnModuleInit {
+  private readonly logger = new Logger(ShardRouterService.name);
+  private nodes: ShardNode[] = [];
+
+  onModuleInit() {
+    this.loadConfig();
+  }
+
+  private loadConfig() {
+    try {
+      const configPath = path.resolve(
+        process.cwd(),
+        'database/sharding-config.json',
+      );
+      const data = JSON.parse(fs.readFileSync(configPath, 'utf8'));
+      this.nodes = data.nodes;
+      this.logger.log(
+        `Initialized Shard Router with ${this.nodes.length} nodes`,
+      );
+    } catch (error) {
+      this.logger.error(
+        'Failed to load sharding config, using default shard',
+        error,
+      );
+    }
+  }
+
+  /**
+   * Route a key (e.g. user_id) to the correct shard
+   */
+  getShardNode(key: string): ShardNode | null {
+    if (this.nodes.length === 0) return null;
+
+    // Simple hash-based partitioning
+    const hash = crypto.createHash('md5').update(key).digest('hex');
+    const index = parseInt(hash.substring(0, 8), 16) % this.nodes.length;
+    return this.nodes[index];
+  }
+
+  /**
+   * Execute cross-shard query efficiently
+   * @param query SQL or QueryBuilder
+   */
+  async executeCrossShardQuery<T>(query: string): Promise<T[]> {
+    const startTime = Date.now();
+    this.logger.log('Starting cross-shard parallel execution...');
+
+    // Simulated parallel execution across all shards
+    const results = await Promise.all(
+      this.nodes.map((node) => this.queryOnShard<T>(node, query)),
+    );
+
+    // Aggregation (e.g. UNION ALL style)
+    const aggregatedResult = results.flat();
+
+    const duration = Date.now() - startTime;
+    this.logger.log(
+      `Cross-shard query completed in ${duration}ms across ${this.nodes.length} shards`,
+    );
+
+    return aggregatedResult;
+  }
+
+  private async queryOnShard<T>(node: ShardNode, query: string): Promise<T[]> {
+    // In a real app, this would use TypeORM's multi-connection pooling
+    this.logger.debug(`Executing query on ${node.database}...`);
+    return []; // Placeholder
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/database/sharding/sharding.module.ts.html b/coverage/lcov-report/src/database/sharding/sharding.module.ts.html new file mode 100644 index 0000000..50dab30 --- /dev/null +++ b/coverage/lcov-report/src/database/sharding/sharding.module.ts.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/database/sharding/sharding.module.ts + + + + + + + + + +
+
+

All files / src/database/sharding sharding.module.ts

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module, Global } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ShardMetadataEntity } from './entities/shard-metadata.entity';
+import { ShardRouterService } from './shard-router.service';
+import { PartitioningService } from './partitioning.service';
+import { RebalancingService } from './rebalancing.service';
+import { ShardHealthService } from './monitoring/shard-health.service';
+
+@Global()
+@Module({
+  imports: [TypeOrmModule.forFeature([ShardMetadataEntity])],
+  providers: [
+    ShardRouterService,
+    PartitioningService,
+    RebalancingService,
+    ShardHealthService,
+  ],
+  exports: [
+    ShardRouterService,
+    PartitioningService,
+    RebalancingService,
+    ShardHealthService,
+  ],
+})
+export class ShardingModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/config/index.html b/coverage/lcov-report/src/energy/config/index.html new file mode 100644 index 0000000..8c743f9 --- /dev/null +++ b/coverage/lcov-report/src/energy/config/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/energy/config + + + + + + + + + +
+
+

All files src/energy/config

+
+ +
+ 0% + Statements + 0/380 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/380 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
swagger.config.ts +
+
0%0/3800%0/10%0/10%0/380
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/config/swagger.config.ts.html b/coverage/lcov-report/src/energy/config/swagger.config.ts.html new file mode 100644 index 0000000..1d2ca74 --- /dev/null +++ b/coverage/lcov-report/src/energy/config/swagger.config.ts.html @@ -0,0 +1,1225 @@ + + + + + + Code coverage report for src/energy/config/swagger.config.ts + + + + + + + + + +
+
+

All files / src/energy/config swagger.config.ts

+
+ +
+ 0% + Statements + 0/380 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/380 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
+
+export function setupSwagger(app) {
+  const config = new DocumentBuilder()
+    .setTitle('Energy Trading API')
+    .setDescription(
+      'Comprehensive RESTful API for energy trading operations including listings, bids, and trade management',
+    )
+    .setVersion('1.0.0')
+    .addTag('energy', 'Energy trading operations')
+    .addBearerAuth(
+      {
+        type: 'http',
+        scheme: 'bearer',
+        bearerFormat: 'JWT',
+        name: 'JWT',
+        description: 'Enter JWT token',
+        in: 'header',
+      },
+      'JWT-auth',
+    )
+    .addApiKey(
+      {
+        type: 'apiKey',
+        name: 'X-API-KEY',
+        in: 'header',
+        description: 'Enter API key for authentication',
+      },
+      'Api-Key',
+    )
+    .addServer('http://localhost:3000', 'Development server')
+    .addServer('https://api.currentdao.com', 'Production server')
+    .addServer('https://staging-api.currentdao.com', 'Staging server')
+    .addContact(
+      'CurrentDao Support',
+      'https://currentdao.com/support',
+      'support@currentdao.com',
+    )
+    .addLicense('MIT', 'https://opensource.org/licenses/MIT')
+    .addExternalDoc('API Documentation', 'https://docs.currentdao.com/api')
+    .addExternalDoc('Postman Collection', 'https://docs.currentdao.com/postman')
+    .addExternalDoc(
+      'OpenAPI Specification',
+      'https://docs.currentdao.com/openapi.json',
+    )
+    .build();
+
+  const document = SwaggerModule.createDocument(app, config, {
+    deepScanRoutes: true,
+    ignoreGlobalPrefix: false,
+  });
+
+  SwaggerModule.setup('api/docs', app, document, {
+    swaggerOptions: {
+      persistAuthorization: true,
+      displayRequestDuration: true,
+      filter: true,
+      showExtensions: true,
+      showCommonExtensions: true,
+      docExpansion: 'none',
+      defaultModelsExpandDepth: 2,
+      defaultModelExpandDepth: 2,
+    },
+    customSiteTitle: 'CurrentDao Energy Trading API Documentation',
+    customfavIcon: '/favicon.ico',
+    customCss: `
+      .topbar-wrapper img[alt="Swagger UI"] { 
+        content: url('https://currentdao.com/logo.png'); 
+        width: 50px; 
+        height: 50px; 
+      }
+      .swagger-ui .topbar { 
+        background-color: #1a1a1a; 
+        border-bottom: 2px solid #00d4ff; 
+      }
+      .swagger-ui .info .title {
+        color: #00d4ff;
+      }
+    `,
+  });
+
+  return document;
+}
+
+export const swaggerConfig = {
+  title: 'Energy Trading API',
+  description:
+    'Comprehensive RESTful API for energy trading operations including listings, bids, and trade management',
+  version: '1.0.0',
+  termsOfService: 'https://currentdao.com/terms',
+  contact: {
+    name: 'CurrentDao Support',
+    url: 'https://currentdao.com/support',
+    email: 'support@currentdao.com',
+  },
+  license: {
+    name: 'MIT',
+    url: 'https://opensource.org/licenses/MIT',
+  },
+  servers: [
+    {
+      url: 'http://localhost:3000',
+      description: 'Development server',
+    },
+    {
+      url: 'https://api.currentdao.com',
+      description: 'Production server',
+    },
+    {
+      url: 'https://staging-api.currentdao.com',
+      description: 'Staging server',
+    },
+  ],
+  components: {
+    securitySchemes: {
+      bearerAuth: {
+        type: 'http',
+        scheme: 'bearer',
+        bearerFormat: 'JWT',
+      },
+      apiKeyAuth: {
+        type: 'apiKey',
+        in: 'header',
+        name: 'X-API-KEY',
+      },
+    },
+    schemas: {
+      ErrorResponse: {
+        type: 'object',
+        properties: {
+          statusCode: {
+            type: 'number',
+            example: 400,
+          },
+          message: {
+            type: 'string',
+            example: 'Bad Request',
+          },
+          error: {
+            type: 'string',
+            example: 'Invalid input data',
+          },
+          details: {
+            type: 'array',
+            items: {
+              type: 'object',
+              properties: {
+                field: {
+                  type: 'string',
+                  example: 'price',
+                },
+                message: {
+                  type: 'string',
+                  example: 'Price must be greater than 0',
+                },
+              },
+            },
+          },
+          timestamp: {
+            type: 'string',
+            format: 'date-time',
+            example: '2024-02-15T10:30:00.000Z',
+          },
+          path: {
+            type: 'string',
+            example: '/api/energy/listings',
+          },
+        },
+      },
+      PaginatedResponse: {
+        type: 'object',
+        properties: {
+          data: {
+            type: 'array',
+            items: {
+              type: 'object',
+            },
+          },
+          total: {
+            type: 'number',
+            example: 100,
+          },
+          page: {
+            type: 'number',
+            example: 1,
+          },
+          limit: {
+            type: 'number',
+            example: 10,
+          },
+          totalPages: {
+            type: 'number',
+            example: 10,
+          },
+          hasNext: {
+            type: 'boolean',
+            example: true,
+          },
+          hasPrev: {
+            type: 'boolean',
+            example: false,
+          },
+        },
+      },
+    },
+  },
+  tags: [
+    {
+      name: 'energy',
+      description:
+        'Energy trading operations including listings, bids, and trades',
+    },
+    {
+      name: 'listings',
+      description: 'Energy listing management operations',
+    },
+    {
+      name: 'bids',
+      description: 'Bid management operations',
+    },
+    {
+      name: 'trades',
+      description: 'Trade execution and management operations',
+    },
+    {
+      name: 'analytics',
+      description: 'Analytics and reporting operations',
+    },
+    {
+      name: 'dashboard',
+      description: 'User dashboard and statistics operations',
+    },
+  ],
+  paths: {
+    '/api/energy/listings': {
+      get: {
+        tags: ['energy', 'listings'],
+        summary: 'Browse energy listings with pagination and filters',
+        description:
+          'Retrieve a paginated list of energy listings with optional filtering by various criteria',
+        operationId: 'getListings',
+        parameters: [
+          {
+            name: 'type',
+            in: 'query',
+            description: 'Filter by listing type',
+            schema: {
+              type: 'string',
+              enum: ['buy', 'sell'],
+            },
+          },
+          {
+            name: 'energyType',
+            in: 'query',
+            description: 'Filter by energy type',
+            schema: {
+              type: 'string',
+              enum: [
+                'solar',
+                'wind',
+                'hydro',
+                'nuclear',
+                'fossil',
+                'biomass',
+                'geothermal',
+              ],
+            },
+          },
+          {
+            name: 'page',
+            in: 'query',
+            description: 'Page number for pagination',
+            schema: {
+              type: 'integer',
+              minimum: 1,
+              default: 1,
+            },
+          },
+          {
+            name: 'limit',
+            in: 'query',
+            description: 'Number of items per page',
+            schema: {
+              type: 'integer',
+              minimum: 1,
+              maximum: 100,
+              default: 10,
+            },
+          },
+        ],
+        responses: {
+          200: {
+            description: 'Listings retrieved successfully',
+            content: {
+              'application/json': {
+                schema: {
+                  $ref: '#/components/schemas/PaginatedResponse',
+                },
+              },
+            },
+          },
+          400: {
+            description: 'Bad request',
+            content: {
+              'application/json': {
+                schema: {
+                  $ref: '#/components/schemas/ErrorResponse',
+                },
+              },
+            },
+          },
+        },
+        security: [
+          {
+            bearerAuth: [],
+          },
+          {
+            apiKeyAuth: [],
+          },
+        ],
+      },
+      post: {
+        tags: ['energy', 'listings'],
+        summary: 'Create new energy listing',
+        description: 'Create a new energy listing with specified parameters',
+        operationId: 'createListing',
+        requestBody: {
+          required: true,
+          content: {
+            'application/json': {
+              schema: {
+                $ref: '#/components/schemas/CreateListingDto',
+              },
+            },
+          },
+        },
+        responses: {
+          201: {
+            description: 'Listing created successfully',
+            content: {
+              'application/json': {
+                schema: {
+                  $ref: '#/components/schemas/EnergyListing',
+                },
+              },
+            },
+          },
+          400: {
+            description: 'Invalid input data',
+            content: {
+              'application/json': {
+                schema: {
+                  $ref: '#/components/schemas/ErrorResponse',
+                },
+              },
+            },
+          },
+          401: {
+            description: 'Unauthorized',
+            content: {
+              'application/json': {
+                schema: {
+                  $ref: '#/components/schemas/ErrorResponse',
+                },
+              },
+            },
+          },
+        },
+        security: [
+          {
+            bearerAuth: [],
+          },
+          {
+            apiKeyAuth: [],
+          },
+        ],
+      },
+    },
+  },
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/dto/create-listing.dto.ts.html b/coverage/lcov-report/src/energy/dto/create-listing.dto.ts.html new file mode 100644 index 0000000..6545ef8 --- /dev/null +++ b/coverage/lcov-report/src/energy/dto/create-listing.dto.ts.html @@ -0,0 +1,1159 @@ + + + + + + Code coverage report for src/energy/dto/create-listing.dto.ts + + + + + + + + + +
+
+

All files / src/energy/dto create-listing.dto.ts

+
+ +
+ 0% + Statements + 0/358 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/358 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsNumber,
+  IsEnum,
+  IsOptional,
+  IsBoolean,
+  IsArray,
+  IsObject,
+  Min,
+  Max,
+  ValidateNested,
+  IsDateString,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
+import {
+  ListingType,
+  EnergyType,
+  DeliveryType,
+} from '../entities/energy-listing.entity';
+
+export class LocationDto {
+  @ApiProperty({ example: 40.7128 })
+  @IsNumber()
+  @Min(-90)
+  @Max(90)
+  latitude: number;
+
+  @ApiProperty({ example: -74.006 })
+  @IsNumber()
+  @Min(-180)
+  @Max(180)
+  longitude: number;
+
+  @ApiPropertyOptional({ example: '123 Main St' })
+  @IsOptional()
+  @IsString()
+  address?: string;
+
+  @ApiPropertyOptional({ example: 'New York' })
+  @IsOptional()
+  @IsString()
+  city?: string;
+
+  @ApiPropertyOptional({ example: 'NY' })
+  @IsOptional()
+  @IsString()
+  region?: string;
+
+  @ApiPropertyOptional({ example: 'USA' })
+  @IsOptional()
+  @IsString()
+  country?: string;
+
+  @ApiPropertyOptional({ example: '10001' })
+  @IsOptional()
+  @IsString()
+  postalCode?: string;
+}
+
+export class QualitySpecificationsDto {
+  @ApiPropertyOptional({ example: 230 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  voltage?: number;
+
+  @ApiPropertyOptional({ example: 50 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  frequency?: number;
+
+  @ApiPropertyOptional({ example: ['ISO 9001', 'CE'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  certification?: string[];
+
+  @ApiPropertyOptional({ example: 95 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  qualityScore?: number;
+
+  @ApiPropertyOptional({ example: 80 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  renewablePercentage?: number;
+
+  @ApiPropertyOptional({ example: 0.5 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  carbonFootprint?: number;
+}
+
+export class PaymentTermsDto {
+  @ApiPropertyOptional({ example: 'bank_transfer' })
+  @IsOptional()
+  @IsString()
+  method?: string;
+
+  @ApiPropertyOptional({ example: 30 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  dueDays?: number;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  escrowRequired?: boolean;
+
+  @ApiPropertyOptional({ example: false })
+  @IsOptional()
+  @IsBoolean()
+  partialPayment?: boolean;
+}
+
+export class ContractTermsDto {
+  @ApiPropertyOptional({ example: 12 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  duration?: number;
+
+  @ApiPropertyOptional({ example: 30 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  terminationNotice?: number;
+
+  @ApiPropertyOptional({
+    example: ['late_delivery_penalty', 'quality_penalty'],
+  })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  penaltyClauses?: string[];
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  forceMajeure?: boolean;
+}
+
+export class RequirementsDto {
+  @ApiPropertyOptional({ example: 100 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  minimumBidQuantity?: number;
+
+  @ApiPropertyOptional({ example: 10000 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  maximumBidQuantity?: number;
+
+  @ApiPropertyOptional({ example: 50 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  bidIncrement?: number;
+
+  @ApiPropertyOptional({ example: ['verified_buyer_1', 'verified_buyer_2'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  preferredBuyers?: string[];
+
+  @ApiPropertyOptional({ example: ['blocked_buyer_1'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  excludedBuyers?: string[];
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  verificationRequired?: boolean;
+}
+
+export class MetadataDto {
+  @ApiPropertyOptional({ example: 'solar_farm_alpha' })
+  @IsOptional()
+  @IsString()
+  source?: string;
+
+  @ApiPropertyOptional({ example: 'grid_connection_123' })
+  @IsOptional()
+  @IsString()
+  gridConnection?: string;
+
+  @ApiPropertyOptional({ example: 1000 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  storageCapacity?: number;
+
+  @ApiPropertyOptional({ example: 500 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  peakCapacity?: number;
+
+  @ApiPropertyOptional({ example: 92.5 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  efficiency?: number;
+
+  @ApiPropertyOptional({
+    example: ['monthly_maintenance', 'quarterly_inspection'],
+  })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  maintenanceSchedule?: string[];
+
+  @ApiPropertyOptional({ example: ['green_energy_cert', 'iso_14001'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  certifications?: string[];
+
+  @ApiPropertyOptional({ example: ['renewable', 'premium', 'certified'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  tags?: string[];
+}
+
+export class CreateListingDto {
+  @ApiProperty({ example: 'Premium Solar Energy - 1000 MWh' })
+  @IsString()
+  title: string;
+
+  @ApiPropertyOptional({
+    example:
+      'High-quality solar energy from certified solar farm with excellent reliability record',
+  })
+  @IsOptional()
+  @IsString()
+  description?: string;
+
+  @ApiProperty({ enum: ListingType, example: ListingType.SELL })
+  @IsEnum(ListingType)
+  type: ListingType;
+
+  @ApiProperty({ enum: EnergyType, example: EnergyType.SOLAR })
+  @IsEnum(EnergyType)
+  energyType: EnergyType;
+
+  @ApiProperty({ example: 1000 })
+  @IsNumber()
+  @Min(0.01)
+  quantity: number;
+
+  @ApiProperty({ example: 0.085 })
+  @IsNumber()
+  @Min(0)
+  price: number;
+
+  @ApiPropertyOptional({ example: 0.08 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  minPrice?: number;
+
+  @ApiPropertyOptional({ example: 0.09 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  maxPrice?: number;
+
+  @ApiPropertyOptional({ enum: DeliveryType, example: DeliveryType.FLEXIBLE })
+  @IsOptional()
+  @IsEnum(DeliveryType)
+  deliveryType?: DeliveryType;
+
+  @ApiPropertyOptional({ example: '2024-02-15T00:00:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  deliveryDate?: string;
+
+  @ApiPropertyOptional({ example: '2024-02-15T00:00:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  deliveryStartDate?: string;
+
+  @ApiPropertyOptional({ example: '2024-02-20T23:59:59.000Z' })
+  @IsOptional()
+  @IsDateString()
+  deliveryEndDate?: string;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => LocationDto)
+  location?: LocationDto;
+
+  @ApiPropertyOptional({ example: 500 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  maxDeliveryDistance?: number;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => QualitySpecificationsDto)
+  qualitySpecifications?: QualitySpecificationsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => PaymentTermsDto)
+  paymentTerms?: PaymentTermsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => ContractTermsDto)
+  contractTerms?: ContractTermsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => RequirementsDto)
+  requirements?: RequirementsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => MetadataDto)
+  metadata?: MetadataDto;
+
+  @ApiPropertyOptional({ example: '2024-03-15T23:59:59.000Z' })
+  @IsOptional()
+  @IsDateString()
+  expiresAt?: string;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  isFeatured?: boolean;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  isPremium?: boolean;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/dto/execute-trade.dto.ts.html b/coverage/lcov-report/src/energy/dto/execute-trade.dto.ts.html new file mode 100644 index 0000000..92517fb --- /dev/null +++ b/coverage/lcov-report/src/energy/dto/execute-trade.dto.ts.html @@ -0,0 +1,1120 @@ + + + + + + Code coverage report for src/energy/dto/execute-trade.dto.ts + + + + + + + + + +
+
+

All files / src/energy/dto execute-trade.dto.ts

+
+ +
+ 0% + Statements + 0/345 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/345 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsNumber,
+  IsEnum,
+  IsOptional,
+  IsBoolean,
+  IsArray,
+  IsObject,
+  ValidateNested,
+  IsDateString,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
+import { TradeType } from '../entities/trade.entity';
+
+export class DeliveryDetailsDto {
+  @ApiProperty()
+  @IsObject()
+  deliveryAddress: {
+    latitude: number;
+    longitude: number;
+    address: string;
+    city: string;
+    region: string;
+    country: string;
+    postalCode: string;
+  };
+
+  @ApiProperty({ example: '2024-02-20T00:00:00.000Z' })
+  @IsDateString()
+  deliveryDate: string;
+
+  @ApiProperty()
+  @IsObject()
+  deliveryWindow: {
+    start: string;
+    end: string;
+  };
+
+  @ApiPropertyOptional({ example: 'truck' })
+  @IsOptional()
+  @IsString()
+  deliveryMethod?: string;
+
+  @ApiPropertyOptional({ example: 'TRK123456789' })
+  @IsOptional()
+  @IsString()
+  trackingNumber?: string;
+
+  @ApiPropertyOptional({ example: 'FedEx' })
+  @IsOptional()
+  @IsString()
+  carrier?: string;
+
+  @ApiPropertyOptional({ example: 'Deliver to loading dock at rear entrance' })
+  @IsOptional()
+  @IsString()
+  specialInstructions?: string;
+}
+
+export class PaymentDetailsDto {
+  @ApiProperty({ example: 'bank_transfer' })
+  @IsString()
+  method: string;
+
+  @ApiProperty({ example: 'USD' })
+  @IsString()
+  currency: string;
+
+  @ApiProperty()
+  @IsArray()
+  paymentSchedule: Array<{
+    dueDate: string;
+    amount: number;
+    status: 'pending' | 'processing' | 'completed' | 'failed';
+    transactionId?: string;
+  }>;
+
+  @ApiPropertyOptional({ example: false })
+  @IsOptional()
+  @IsBoolean()
+  escrowReleased?: boolean;
+
+  @ApiPropertyOptional({ example: 0 })
+  @IsOptional()
+  @IsNumber()
+  refundAmount?: number;
+
+  @ApiPropertyOptional({ example: 'Quality issues' })
+  @IsOptional()
+  @IsString()
+  refundReason?: string;
+}
+
+export class ContractTermsDto {
+  @ApiPropertyOptional({ example: 'contract-uuid-here' })
+  @IsOptional()
+  @IsString()
+  contractId?: string;
+
+  @ApiPropertyOptional({ example: 'https://example.com/contract.pdf' })
+  @IsOptional()
+  @IsString()
+  contractUrl?: string;
+
+  @ApiProperty({ example: true })
+  @IsBoolean()
+  termsAccepted: boolean;
+
+  @ApiPropertyOptional({ example: '2024-02-15T10:30:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  termsAcceptedAt?: string;
+
+  @ApiPropertyOptional({ example: '30 days notice required' })
+  @IsOptional()
+  @IsString()
+  terminationClause?: string;
+
+  @ApiPropertyOptional({ example: 12 })
+  @IsOptional()
+  @IsNumber()
+  warrantyPeriod?: number;
+
+  @ApiPropertyOptional({ example: 'premium' })
+  @IsOptional()
+  @IsString()
+  supportLevel?: string;
+
+  @ApiPropertyOptional({
+    example: ['late_delivery_penalty', 'quality_penalty'],
+  })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  penaltyClauses?: string[];
+}
+
+export class QualityAssuranceDto {
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  inspectionRequired?: boolean;
+
+  @ApiPropertyOptional({ example: false })
+  @IsOptional()
+  @IsBoolean()
+  inspectionCompleted?: boolean;
+
+  @ApiPropertyOptional({ example: '2024-02-18T14:00:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  inspectionDate?: string;
+
+  @ApiPropertyOptional({
+    enum: ['pass', 'fail', 'conditional'],
+    example: 'pass',
+  })
+  @IsOptional()
+  @IsEnum(['pass', 'fail', 'conditional'])
+  inspectionResult?: 'pass' | 'fail' | 'conditional';
+
+  @ApiPropertyOptional({ example: 95 })
+  @IsOptional()
+  @IsNumber()
+  qualityScore?: number;
+
+  @ApiPropertyOptional({ example: ['minor_scratches'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  deficiencies?: string[];
+
+  @ApiPropertyOptional({ example: ['touch_up_paint'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  correctiveActions?: string[];
+}
+
+export class ComplianceDto {
+  @ApiPropertyOptional({ example: ['ISO 9001', 'CE', 'FCC'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  certifications?: string[];
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  regulatoryApproved?: boolean;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  environmentalCompliance?: boolean;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  safetyCompliance?: boolean;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsArray()
+  complianceDocuments?: Array<{
+    type: string;
+    url: string;
+    verified: boolean;
+    verifiedAt?: string;
+  }>;
+}
+
+export class MilestoneDto {
+  @ApiProperty({ example: 'delivery_confirmation' })
+  @IsString()
+  id: string;
+
+  @ApiProperty({ example: 'Delivery Confirmation' })
+  @IsString()
+  name: string;
+
+  @ApiProperty({ example: 'Confirm receipt of energy delivery' })
+  @IsString()
+  description: string;
+
+  @ApiProperty({ example: '2024-02-20T18:00:00.000Z' })
+  @IsDateString()
+  dueDate: string;
+
+  @ApiPropertyOptional({ example: '2024-02-20T17:30:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  completedDate?: string;
+
+  @ApiPropertyOptional({
+    enum: ['pending', 'in_progress', 'completed', 'failed'],
+    example: 'completed',
+  })
+  @IsOptional()
+  @IsEnum(['pending', 'in_progress', 'completed', 'failed'])
+  status?: 'pending' | 'in_progress' | 'completed' | 'failed';
+
+  @ApiPropertyOptional({ example: 'delivery_team' })
+  @IsOptional()
+  @IsString()
+  assignedTo?: string;
+
+  @ApiPropertyOptional({ example: ['quality_check'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  dependencies?: string[];
+}
+
+export class ExecuteTradeDto {
+  @ApiProperty({ example: 'bid-uuid-here' })
+  @IsString()
+  bidId: string;
+
+  @ApiPropertyOptional({ enum: TradeType, example: TradeType.STANDARD })
+  @IsOptional()
+  @IsEnum(TradeType)
+  type?: TradeType;
+
+  @ApiPropertyOptional({ example: 0.05 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(1)
+  negotiatedDiscount?: number;
+
+  @ApiPropertyOptional({ example: 0.02 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  serviceFee?: number;
+
+  @ApiPropertyOptional({ example: 0.08 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  taxAmount?: number;
+
+  @ApiPropertyOptional({ example: 500 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  deliveryCost?: number;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => DeliveryDetailsDto)
+  deliveryDetails?: DeliveryDetailsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => PaymentDetailsDto)
+  paymentDetails?: PaymentDetailsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => ContractTermsDto)
+  contractTerms?: ContractTermsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => QualityAssuranceDto)
+  qualityAssurance?: QualityAssuranceDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => ComplianceDto)
+  compliance?: ComplianceDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsArray()
+  @ValidateNested({ each: true })
+  @Type(() => MilestoneDto)
+  milestones?: MilestoneDto[];
+
+  @ApiPropertyOptional({
+    example: 'Urgent delivery required for critical infrastructure',
+  })
+  @IsOptional()
+  @IsString()
+  notes?: string;
+
+  @ApiPropertyOptional({ example: ['urgent', 'priority'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  tags?: string;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  immediateExecution?: boolean;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/dto/index.html b/coverage/lcov-report/src/energy/dto/index.html new file mode 100644 index 0000000..aa207a7 --- /dev/null +++ b/coverage/lcov-report/src/energy/dto/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/energy/dto + + + + + + + + + +
+
+

All files src/energy/dto

+
+ +
+ 0% + Statements + 0/948 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/948 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
create-listing.dto.ts +
+
0%0/3580%0/10%0/10%0/358
execute-trade.dto.ts +
+
0%0/3450%0/10%0/10%0/345
place-bid.dto.ts +
+
0%0/2410%0/10%0/10%0/241
update-listing.dto.ts +
+
0%0/40%0/10%0/10%0/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/dto/place-bid.dto.ts.html b/coverage/lcov-report/src/energy/dto/place-bid.dto.ts.html new file mode 100644 index 0000000..368fcaf --- /dev/null +++ b/coverage/lcov-report/src/energy/dto/place-bid.dto.ts.html @@ -0,0 +1,808 @@ + + + + + + Code coverage report for src/energy/dto/place-bid.dto.ts + + + + + + + + + +
+
+

All files / src/energy/dto place-bid.dto.ts

+
+ +
+ 0% + Statements + 0/241 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/241 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsNumber,
+  IsEnum,
+  IsOptional,
+  IsBoolean,
+  IsArray,
+  IsObject,
+  ValidateNested,
+  IsDateString,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
+import { BidType } from '../entities/bid.entity';
+
+export class DeliveryTermsDto {
+  @ApiPropertyOptional({ example: '2024-02-20T00:00:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  deliveryDate?: string;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsObject()
+  deliveryLocation?: {
+    latitude: number;
+    longitude: number;
+    address?: string;
+  };
+
+  @ApiPropertyOptional({ example: 'truck' })
+  @IsOptional()
+  @IsString()
+  deliveryMethod?: string;
+
+  @ApiPropertyOptional({ example: 500 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  deliveryCost?: number;
+
+  @ApiPropertyOptional({ example: 3 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(7)
+  flexibility?: number;
+}
+
+export class PaymentTermsDto {
+  @ApiPropertyOptional({ example: 'bank_transfer' })
+  @IsOptional()
+  @IsString()
+  method?: string;
+
+  @ApiPropertyOptional({ example: ['50%', '50%'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  schedule?: string[];
+
+  @ApiPropertyOptional({ example: 20 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  advancePayment?: number;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  escrowRequired?: boolean;
+
+  @ApiPropertyOptional({ example: 30 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  paymentDays?: number;
+}
+
+export class QualityRequirementsDto {
+  @ApiPropertyOptional({ example: 90 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  minimumQuality?: number;
+
+  @ApiPropertyOptional({ example: ['ISO 9001', 'CE'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  certifications?: string[];
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  testingRequired?: boolean;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  inspectionRequired?: boolean;
+}
+
+export class AdditionalTermsDto {
+  @ApiPropertyOptional({ example: 12 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  warrantyPeriod?: number;
+
+  @ApiPropertyOptional({ example: 'premium' })
+  @IsOptional()
+  @IsString()
+  supportLevel?: string;
+
+  @ApiPropertyOptional({ example: ['late_delivery_penalty'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  penaltyClauses?: string[];
+
+  @ApiPropertyOptional({ example: ['early_delivery_bonus'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  bonusConditions?: string[];
+}
+
+export class MetadataDto {
+  @ApiPropertyOptional({ example: 'industrial_buyer' })
+  @IsOptional()
+  @IsString()
+  source?: string;
+
+  @ApiPropertyOptional({
+    enum: ['low', 'medium', 'high', 'critical'],
+    example: 'high',
+  })
+  @IsOptional()
+  @IsEnum(['low', 'medium', 'high', 'critical'])
+  urgency?: 'low' | 'medium' | 'high' | 'critical';
+
+  @ApiPropertyOptional({ example: 85 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  confidence?: number;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsObject()
+  riskAssessment?: {
+    financial: number;
+    operational: number;
+    regulatory: number;
+  };
+
+  @ApiPropertyOptional({ example: ['long_term_contract', 'bulk_discount'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  competitiveAdvantage?: string[];
+}
+
+export class PlaceBidDto {
+  @ApiProperty({ example: 'listing-uuid-here' })
+  @IsString()
+  listingId: string;
+
+  @ApiProperty({ example: 500 })
+  @IsNumber()
+  @Min(0.01)
+  quantity: number;
+
+  @ApiProperty({ example: 0.0825 })
+  @IsNumber()
+  @Min(0)
+  price: number;
+
+  @ApiPropertyOptional({ enum: BidType, example: BidType.STANDARD })
+  @IsOptional()
+  @IsEnum(BidType)
+  type?: BidType;
+
+  @ApiPropertyOptional({
+    example: 'We offer competitive pricing with reliable delivery schedule',
+  })
+  @IsOptional()
+  @IsString()
+  message?: string;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => DeliveryTermsDto)
+  deliveryTerms?: DeliveryTermsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => PaymentTermsDto)
+  paymentTerms?: PaymentTermsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => QualityRequirementsDto)
+  qualityRequirements?: QualityRequirementsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => AdditionalTermsDto)
+  additionalTerms?: AdditionalTermsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => MetadataDto)
+  metadata?: MetadataDto;
+
+  @ApiPropertyOptional({ example: '2024-02-10T23:59:59.000Z' })
+  @IsOptional()
+  @IsDateString()
+  expiresAt?: string;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  autoAccept?: boolean;
+
+  @ApiPropertyOptional({ example: 0.3 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(1)
+  autoRejectThreshold?: number;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/dto/update-listing.dto.ts.html b/coverage/lcov-report/src/energy/dto/update-listing.dto.ts.html new file mode 100644 index 0000000..839d31a --- /dev/null +++ b/coverage/lcov-report/src/energy/dto/update-listing.dto.ts.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for src/energy/dto/update-listing.dto.ts + + + + + + + + + +
+
+

All files / src/energy/dto update-listing.dto.ts

+
+ +
+ 0% + Statements + 0/4 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5  +  +  +  + 
import { PartialType } from '@nestjs/swagger';
+import { CreateListingDto } from './create-listing.dto';
+
+export class UpdateListingDto extends PartialType(CreateListingDto) {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/energy.controller.ts.html b/coverage/lcov-report/src/energy/energy.controller.ts.html new file mode 100644 index 0000000..7ae160c --- /dev/null +++ b/coverage/lcov-report/src/energy/energy.controller.ts.html @@ -0,0 +1,1909 @@ + + + + + + Code coverage report for src/energy/energy.controller.ts + + + + + + + + + +
+
+

All files / src/energy energy.controller.ts

+
+ +
+ 0% + Statements + 0/608 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/608 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Controller,
+  Get,
+  Post,
+  Put,
+  Delete,
+  Body,
+  Param,
+  Query,
+  UseGuards,
+  Request,
+  HttpStatus,
+  HttpCode,
+} from '@nestjs/common';
+import {
+  ApiTags,
+  ApiOperation,
+  ApiResponse,
+  ApiParam,
+  ApiQuery,
+} from '@nestjs/swagger';
+import {
+  EnergyService,
+  ListingFilter,
+  PaginationOptions,
+} from './energy.service';
+import { CreateListingDto } from './dto/create-listing.dto';
+import { UpdateListingDto } from './dto/update-listing.dto';
+import { PlaceBidDto } from './dto/place-bid.dto';
+import { ExecuteTradeDto } from './dto/execute-trade.dto';
+import { EnergyListing } from './entities/energy-listing.entity';
+import { Bid } from './entities/bid.entity';
+import { Trade } from './entities/trade.entity';
+import { AuthGuard } from './guards/auth.guard';
+
+@ApiTags('energy')
+@Controller('api/energy')
+@UseGuards(AuthGuard)
+export class EnergyController {
+  constructor(private readonly energyService: EnergyService) {}
+
+  @Post('listings')
+  @ApiOperation({ summary: 'Create new energy listing' })
+  @ApiResponse({
+    status: HttpStatus.CREATED,
+    description: 'Listing created successfully',
+    type: EnergyListing,
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Invalid input data',
+  })
+  @ApiResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized' })
+  async createListing(
+    @Body() createListingDto: CreateListingDto,
+    @Request() req,
+  ): Promise<EnergyListing> {
+    return this.energyService.createListing(createListingDto, req.user.id);
+  }
+
+  @Get('listings')
+  @ApiOperation({
+    summary: 'Browse energy listings with pagination and filters',
+  })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Listings retrieved successfully',
+  })
+  @ApiQuery({ name: 'type', required: false, enum: ['buy', 'sell'] })
+  @ApiQuery({ name: 'energyType', required: false })
+  @ApiQuery({ name: 'status', required: false })
+  @ApiQuery({ name: 'minPrice', required: false, type: Number })
+  @ApiQuery({ name: 'maxPrice', required: false, type: Number })
+  @ApiQuery({ name: 'minQuantity', required: false, type: Number })
+  @ApiQuery({ name: 'maxQuantity', required: false, type: Number })
+  @ApiQuery({ name: 'createdBy', required: false })
+  @ApiQuery({ name: 'isFeatured', required: false, type: Boolean })
+  @ApiQuery({ name: 'isVerified', required: false, type: Boolean })
+  @ApiQuery({ name: 'page', required: false, type: Number, example: 1 })
+  @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 })
+  @ApiQuery({ name: 'sortBy', required: false, example: 'createdAt' })
+  @ApiQuery({
+    name: 'sortOrder',
+    required: false,
+    enum: ['ASC', 'DESC'],
+    example: 'DESC',
+  })
+  async getListings(
+    @Query() filter: ListingFilter,
+    @Query() pagination: PaginationOptions,
+  ) {
+    return this.energyService.getListings(filter, pagination);
+  }
+
+  @Get('listings/:id')
+  @ApiOperation({ summary: 'Get specific listing details' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Listing retrieved successfully',
+    type: EnergyListing,
+  })
+  @ApiResponse({
+    status: HttpStatus.NOT_FOUND,
+    description: 'Listing not found',
+  })
+  @ApiParam({ name: 'id', description: 'Listing ID' })
+  async getListingById(@Param('id') id: string): Promise<EnergyListing> {
+    return this.energyService.getListingById(id);
+  }
+
+  @Put('listings/:id')
+  @ApiOperation({ summary: 'Update listing (owner only)' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Listing updated successfully',
+    type: EnergyListing,
+  })
+  @ApiResponse({
+    status: HttpStatus.NOT_FOUND,
+    description: 'Listing not found',
+  })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to update this listing',
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Cannot update listing in current state',
+  })
+  @ApiParam({ name: 'id', description: 'Listing ID' })
+  async updateListing(
+    @Param('id') id: string,
+    @Body() updateListingDto: UpdateListingDto,
+    @Request() req,
+  ): Promise<EnergyListing> {
+    return this.energyService.updateListing(id, updateListingDto, req.user.id);
+  }
+
+  @Delete('listings/:id')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Cancel listing (owner only)' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Listing cancelled successfully',
+    type: EnergyListing,
+  })
+  @ApiResponse({
+    status: HttpStatus.NOT_FOUND,
+    description: 'Listing not found',
+  })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to cancel this listing',
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Cannot cancel listing in current state',
+  })
+  @ApiParam({ name: 'id', description: 'Listing ID' })
+  async cancelListing(
+    @Param('id') id: string,
+    @Request() req,
+  ): Promise<EnergyListing> {
+    return this.energyService.cancelListing(id, req.user.id);
+  }
+
+  @Post('bids')
+  @ApiOperation({ summary: 'Place bid on listing' })
+  @ApiResponse({
+    status: HttpStatus.CREATED,
+    description: 'Bid placed successfully',
+    type: Bid,
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Invalid bid data or listing not available',
+  })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Cannot bid on own listing',
+  })
+  @ApiResponse({
+    status: HttpStatus.NOT_FOUND,
+    description: 'Listing not found',
+  })
+  async placeBid(
+    @Body() placeBidDto: PlaceBidDto,
+    @Request() req,
+  ): Promise<Bid> {
+    return this.energyService.placeBid(placeBidDto, req.user.id);
+  }
+
+  @Get('bids')
+  @ApiOperation({ summary: "Get user's bids" })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'User bids retrieved successfully',
+  })
+  @ApiQuery({ name: 'page', required: false, type: Number, example: 1 })
+  @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 })
+  @ApiQuery({ name: 'sortBy', required: false, example: 'createdAt' })
+  @ApiQuery({
+    name: 'sortOrder',
+    required: false,
+    enum: ['ASC', 'DESC'],
+    example: 'DESC',
+  })
+  async getBidsByUser(@Query() pagination: PaginationOptions, @Request() req) {
+    return this.energyService.getBidsByUser(req.user.id, pagination);
+  }
+
+  @Get('listings/:listingId/bids')
+  @ApiOperation({ summary: 'Get bids for a listing (owner only)' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Listing bids retrieved successfully',
+  })
+  @ApiResponse({
+    status: HttpStatus.NOT_FOUND,
+    description: 'Listing not found',
+  })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to view bids for this listing',
+  })
+  @ApiParam({ name: 'listingId', description: 'Listing ID' })
+  async getBidsForListing(
+    @Param('listingId') listingId: string,
+    @Request() req,
+  ): Promise<Bid[]> {
+    return this.energyService.getBidsForListing(listingId, req.user.id);
+  }
+
+  @Post('bids/:bidId/accept')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Accept bid (listing owner only)' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Bid accepted successfully',
+    type: Bid,
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Bid not found' })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to accept this bid',
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Cannot accept bid in current state',
+  })
+  @ApiParam({ name: 'bidId', description: 'Bid ID' })
+  async acceptBid(@Param('bidId') bidId: string, @Request() req): Promise<Bid> {
+    return this.energyService.acceptBid(bidId, req.user.id);
+  }
+
+  @Post('bids/:bidId/reject')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Reject bid (listing owner only)' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Bid rejected successfully',
+    type: Bid,
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Bid not found' })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to reject this bid',
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Cannot reject bid in current state',
+  })
+  @ApiParam({ name: 'bidId', description: 'Bid ID' })
+  async rejectBid(
+    @Param('bidId') bidId: string,
+    @Body() body: { reason?: string },
+    @Request() req,
+  ): Promise<Bid> {
+    return this.energyService.rejectBid(bidId, req.user.id, body.reason);
+  }
+
+  @Post('bids/:bidId/withdraw')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Withdraw bid (bid owner only)' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Bid withdrawn successfully',
+    type: Bid,
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Bid not found' })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to withdraw this bid',
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Cannot withdraw bid in current state',
+  })
+  @ApiParam({ name: 'bidId', description: 'Bid ID' })
+  async withdrawBid(
+    @Param('bidId') bidId: string,
+    @Request() req,
+  ): Promise<Bid> {
+    return this.energyService.withdrawBid(bidId, req.user.id);
+  }
+
+  @Post('trades/execute')
+  @ApiOperation({ summary: 'Execute matched trade' })
+  @ApiResponse({
+    status: HttpStatus.CREATED,
+    description: 'Trade executed successfully',
+    type: Trade,
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Cannot execute trade in current state',
+  })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to execute this trade',
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Bid not found' })
+  async executeTrade(
+    @Body() executeTradeDto: ExecuteTradeDto,
+    @Request() req,
+  ): Promise<Trade> {
+    return this.energyService.executeTrade(executeTradeDto, req.user.id);
+  }
+
+  @Get('trades/:id')
+  @ApiOperation({ summary: 'Get trade status' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Trade retrieved successfully',
+    type: Trade,
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Trade not found' })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to view this trade',
+  })
+  @ApiParam({ name: 'id', description: 'Trade ID' })
+  async getTradeById(@Param('id') id: string, @Request() req): Promise<Trade> {
+    return this.energyService.getTradeById(id, req.user.id);
+  }
+
+  @Get('trades')
+  @ApiOperation({ summary: "Get user's trades" })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'User trades retrieved successfully',
+  })
+  @ApiQuery({ name: 'page', required: false, type: Number, example: 1 })
+  @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 })
+  @ApiQuery({ name: 'sortBy', required: false, example: 'createdAt' })
+  @ApiQuery({
+    name: 'sortOrder',
+    required: false,
+    enum: ['ASC', 'DESC'],
+    example: 'DESC',
+  })
+  async getTradesByUser(
+    @Query() pagination: PaginationOptions,
+    @Request() req,
+  ) {
+    return this.energyService.getTradesByUser(req.user.id, pagination);
+  }
+
+  @Put('trades/:id/status')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Update trade status' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Trade status updated successfully',
+    type: Trade,
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Trade not found' })
+  @ApiResponse({
+    status: HttpStatus.FORBIDDEN,
+    description: 'Not authorized to update this trade',
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Invalid status transition',
+  })
+  @ApiParam({ name: 'id', description: 'Trade ID' })
+  async updateTradeStatus(
+    @Param('id') id: string,
+    @Body() body: { status: string; reason?: string },
+    @Request() req,
+  ): Promise<Trade> {
+    return this.energyService.updateTradeStatus(
+      id,
+      body.status as any,
+      req.user.id,
+      body.reason,
+    );
+  }
+
+  @Get('orderbook')
+  @ApiOperation({ summary: 'Get order book functionality' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Order book retrieved successfully',
+  })
+  @ApiQuery({ name: 'energyType', required: false })
+  @ApiQuery({ name: 'minPrice', required: false, type: Number })
+  @ApiQuery({ name: 'maxPrice', required: false, type: Number })
+  @ApiQuery({ name: 'minQuantity', required: false, type: Number })
+  @ApiQuery({ name: 'maxQuantity', required: false, type: Number })
+  @ApiQuery({ name: 'createdBy', required: false })
+  @ApiQuery({ name: 'isFeatured', required: false, type: Boolean })
+  @ApiQuery({ name: 'isVerified', required: false, type: Boolean })
+  async getOrderBook(@Query() filter: ListingFilter) {
+    return this.energyService.getOrderBook(filter);
+  }
+
+  @Get('listings/:id/analytics')
+  @ApiOperation({ summary: 'Get listing analytics' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Analytics retrieved successfully',
+  })
+  @ApiResponse({
+    status: HttpStatus.NOT_FOUND,
+    description: 'Listing not found',
+  })
+  @ApiParam({ name: 'id', description: 'Listing ID' })
+  async getListingAnalytics(@Param('id') id: string): Promise<any> {
+    const listing = await this.energyService.getListingById(id);
+
+    return {
+      viewCount: listing.viewCount,
+      bidCount: listing.bidCount,
+      averageBidPrice: listing.analytics?.avgBidPrice || 0,
+      priceRange: listing.analytics?.priceRange || { min: 0, max: 0, avg: 0 },
+      conversionRate: listing.analytics?.conversionRate || 0,
+      matchScore: listing.matchScore,
+      visibilityScore: listing.visibilityScore,
+    };
+  }
+
+  @Get('dashboard')
+  @ApiOperation({ summary: 'Get user dashboard data' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Dashboard data retrieved successfully',
+  })
+  async getDashboard(@Request() req): Promise<any> {
+    const userId = req.user.id;
+
+    const [userListings, userBids, userTrades] = await Promise.all([
+      this.energyService.getListings(
+        { createdBy: userId },
+        { page: 1, limit: 100 },
+      ),
+      this.energyService.getBidsByUser(userId, { page: 1, limit: 100 }),
+      this.energyService.getTradesByUser(userId, { page: 1, limit: 100 }),
+    ]);
+
+    const activeListings = userListings.data.filter(
+      (listing) => listing.status === 'active',
+    );
+    const pendingBids = userBids.data.filter((bid) => bid.status === 'pending');
+    const activeTrades = userTrades.data.filter(
+      (trade) =>
+        trade.status === 'pending' ||
+        trade.status === 'confirmed' ||
+        trade.status === 'in_progress',
+    );
+
+    const totalValue = userListings.data.reduce(
+      (sum, listing) => sum + listing.quantity * listing.price,
+      0,
+    );
+    const avgListingPrice =
+      userListings.data.length > 0
+        ? userListings.data.reduce((sum, listing) => sum + listing.price, 0) /
+          userListings.data.length
+        : 0;
+
+    return {
+      summary: {
+        totalListings: userListings.total,
+        activeListings: activeListings.length,
+        totalBids: userBids.total,
+        pendingBids: pendingBids.length,
+        totalTrades: userTrades.total,
+        activeTrades: activeTrades.length,
+        totalValue,
+        avgListingPrice,
+      },
+      recentActivity: {
+        recentListings: userListings.data.slice(0, 5),
+        recentBids: userBids.data.slice(0, 5),
+        recentTrades: userTrades.data.slice(0, 5),
+      },
+      performance: {
+        listingViews: userListings.data.reduce(
+          (sum, listing) => sum + listing.viewCount,
+          0,
+        ),
+        bidSuccessRate:
+          userBids.data.length > 0
+            ? (userBids.data.filter((bid) => bid.status === 'accepted').length /
+                userBids.data.length) *
+              100
+            : 0,
+        tradeCompletionRate:
+          userTrades.data.length > 0
+            ? (userTrades.data.filter((trade) => trade.status === 'completed')
+                .length /
+                userTrades.data.length) *
+              100
+            : 0,
+      },
+    };
+  }
+
+  @Get('statistics')
+  @ApiOperation({ summary: 'Get platform statistics' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Statistics retrieved successfully',
+  })
+  async getStatistics(): Promise<any> {
+    const [allListings, orderBook] = await Promise.all([
+      this.energyService.getListings({}, { page: 1, limit: 1000 }),
+      this.energyService.getOrderBook({}),
+    ]);
+
+    const listingsByType = allListings.data.reduce(
+      (acc, listing) => {
+        acc[listing.type] = (acc[listing.type] || 0) + 1;
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+
+    const listingsByEnergyType = allListings.data.reduce(
+      (acc, listing) => {
+        acc[listing.energyType] = (acc[listing.energyType] || 0) + 1;
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+
+    const avgPriceByEnergyType = allListings.data.reduce(
+      (acc, listing) => {
+        if (!acc[listing.energyType]) {
+          acc[listing.energyType] = { total: 0, count: 0 };
+        }
+        acc[listing.energyType].total += listing.price;
+        acc[listing.energyType].count += 1;
+        return acc;
+      },
+      {} as Record<string, { total: number; count: number }>,
+    );
+
+    const avgPriceByType = Object.entries(avgPriceByEnergyType).reduce(
+      (acc, [energyType, data]) => {
+        acc[energyType] = data.total / data.count;
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+
+    return {
+      overview: {
+        totalListings: allListings.total,
+        activeListings: allListings.data.filter(
+          (listing) => listing.status === 'active',
+        ).length,
+        totalBuyOrders: orderBook.summary.totalBuyOrders,
+        totalSellOrders: orderBook.summary.totalSellOrders,
+        totalBuyQuantity: orderBook.summary.totalBuyQuantity,
+        totalSellQuantity: orderBook.summary.totalSellQuantity,
+        marketSpread: orderBook.summary.spread,
+      },
+      breakdowns: {
+        listingsByType,
+        listingsByEnergyType,
+        avgPriceByType,
+      },
+      metrics: {
+        avgBuyPrice: orderBook.summary.avgBuyPrice,
+        avgSellPrice: orderBook.summary.avgSellPrice,
+        priceVolatility: this.calculatePriceVolatility(allListings.data),
+        marketDepth:
+          orderBook.summary.totalBuyQuantity +
+          orderBook.summary.totalSellQuantity,
+      },
+    };
+  }
+
+  private calculatePriceVolatility(listings: EnergyListing[]): number {
+    if (listings.length < 2) return 0;
+
+    const prices = listings.map((listing) => listing.price);
+    const mean = prices.reduce((sum, price) => sum + price, 0) / prices.length;
+    const variance =
+      prices.reduce((sum, price) => sum + Math.pow(price - mean, 2), 0) /
+      prices.length;
+    const standardDeviation = Math.sqrt(variance);
+
+    return (standardDeviation / mean) * 100;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/energy.module.ts.html b/coverage/lcov-report/src/energy/energy.module.ts.html new file mode 100644 index 0000000..ac77a21 --- /dev/null +++ b/coverage/lcov-report/src/energy/energy.module.ts.html @@ -0,0 +1,154 @@ + + + + + + Code coverage report for src/energy/energy.module.ts + + + + + + + + + +
+
+

All files / src/energy energy.module.ts

+
+ +
+ 0% + Statements + 0/23 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { EnergyController } from './energy.controller';
+import { EnergyService } from './energy.service';
+import { EnergyListing } from './entities/energy-listing.entity';
+import { Bid } from './entities/bid.entity';
+import { Trade } from './entities/trade.entity';
+import { HttpExceptionFilter } from './filters/http-exception.filter';
+import { APP_FILTER } from '@nestjs/core';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([EnergyListing, Bid, Trade])],
+  controllers: [EnergyController],
+  providers: [
+    EnergyService,
+    {
+      provide: APP_FILTER,
+      useClass: HttpExceptionFilter,
+    },
+  ],
+  exports: [EnergyService],
+})
+export class EnergyModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/energy.service.ts.html b/coverage/lcov-report/src/energy/energy.service.ts.html new file mode 100644 index 0000000..eae9376 --- /dev/null +++ b/coverage/lcov-report/src/energy/energy.service.ts.html @@ -0,0 +1,2956 @@ + + + + + + Code coverage report for src/energy/energy.service.ts + + + + + + + + + +
+
+

All files / src/energy energy.service.ts

+
+ +
+ 0% + Statements + 0/957 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/957 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Injectable,
+  Logger,
+  NotFoundException,
+  ForbiddenException,
+  BadRequestException,
+} from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import {
+  Repository,
+  DataSource,
+  Between,
+  LessThan,
+  MoreThan,
+  FindManyOptions,
+} from 'typeorm';
+import {
+  EnergyListing,
+  ListingStatus,
+  ListingType,
+} from './entities/energy-listing.entity';
+import { Bid, BidStatus } from './entities/bid.entity';
+import {
+  Trade,
+  TradeStatus,
+  PaymentStatus,
+  DeliveryStatus,
+} from './entities/trade.entity';
+import { CreateListingDto } from './dto/create-listing.dto';
+import { UpdateListingDto } from './dto/update-listing.dto';
+import { PlaceBidDto } from './dto/place-bid.dto';
+import { ExecuteTradeDto } from './dto/execute-trade.dto';
+
+export interface ListingFilter {
+  type?: ListingType;
+  energyType?: string;
+  status?: ListingStatus;
+  minPrice?: number;
+  maxPrice?: number;
+  minQuantity?: number;
+  maxQuantity?: number;
+  location?: {
+    latitude: number;
+    longitude: number;
+    radius: number;
+  };
+  createdBy?: string;
+  isFeatured?: boolean;
+  isVerified?: boolean;
+  expiresAfter?: Date;
+  expiresBefore?: Date;
+}
+
+export interface PaginationOptions {
+  page: number;
+  limit: number;
+  sortBy?: string;
+  sortOrder?: 'ASC' | 'DESC';
+}
+
+export interface PaginatedResult<T> {
+  data: T[];
+  total: number;
+  page: number;
+  limit: number;
+  totalPages: number;
+  hasNext: boolean;
+  hasPrev: boolean;
+}
+
+@Injectable()
+export class EnergyService {
+  private readonly logger = new Logger(EnergyService.name);
+
+  constructor(
+    @InjectRepository(EnergyListing)
+    private readonly listingRepository: Repository<EnergyListing>,
+    @InjectRepository(Bid)
+    private readonly bidRepository: Repository<Bid>,
+    @InjectRepository(Trade)
+    private readonly tradeRepository: Repository<Trade>,
+    private readonly dataSource: DataSource,
+  ) {}
+
+  async createListing(
+    createListingDto: CreateListingDto,
+    userId: string,
+  ): Promise<EnergyListing> {
+    this.logger.log(`Creating new energy listing for user: ${userId}`);
+
+    const listing = this.listingRepository.create({
+      ...createListingDto,
+      createdBy: userId,
+      status: ListingStatus.ACTIVE,
+      viewCount: 0,
+      bidCount: 0,
+    });
+
+    if (createListingDto.expiresAt) {
+      listing.expiresAt = new Date(createListingDto.expiresAt);
+    }
+
+    if (createListingDto.deliveryDate) {
+      listing.deliveryDate = new Date(createListingDto.deliveryDate);
+    }
+
+    if (createListingDto.deliveryStartDate) {
+      listing.deliveryStartDate = new Date(createListingDto.deliveryStartDate);
+    }
+
+    if (createListingDto.deliveryEndDate) {
+      listing.deliveryEndDate = new Date(createListingDto.deliveryEndDate);
+    }
+
+    const savedListing = await this.listingRepository.save(listing);
+
+    this.logger.log(`Created listing: ${savedListing.id}`);
+    return savedListing;
+  }
+
+  async getListings(
+    filter: ListingFilter = {},
+    pagination: PaginationOptions = { page: 1, limit: 10 },
+  ): Promise<PaginatedResult<EnergyListing>> {
+    this.logger.log(
+      `Fetching listings with filter: ${JSON.stringify(filter)}, pagination: ${JSON.stringify(pagination)}`,
+    );
+
+    const queryBuilder = this.listingRepository
+      .createQueryBuilder('listing')
+      .leftJoinAndSelect('listing.bids', 'bids')
+      .leftJoinAndSelect('listing.trades', 'trades');
+
+    if (filter.type) {
+      queryBuilder.andWhere('listing.type = :type', { type: filter.type });
+    }
+
+    if (filter.energyType) {
+      queryBuilder.andWhere('listing.energyType = :energyType', {
+        energyType: filter.energyType,
+      });
+    }
+
+    if (filter.status) {
+      queryBuilder.andWhere('listing.status = :status', {
+        status: filter.status,
+      });
+    }
+
+    if (filter.minPrice) {
+      queryBuilder.andWhere('listing.price >= :minPrice', {
+        minPrice: filter.minPrice,
+      });
+    }
+
+    if (filter.maxPrice) {
+      queryBuilder.andWhere('listing.price <= :maxPrice', {
+        maxPrice: filter.maxPrice,
+      });
+    }
+
+    if (filter.minQuantity) {
+      queryBuilder.andWhere('listing.quantity >= :minQuantity', {
+        minQuantity: filter.minQuantity,
+      });
+    }
+
+    if (filter.maxQuantity) {
+      queryBuilder.andWhere('listing.quantity <= :maxQuantity', {
+        maxQuantity: filter.maxQuantity,
+      });
+    }
+
+    if (filter.createdBy) {
+      queryBuilder.andWhere('listing.createdBy = :createdBy', {
+        createdBy: filter.createdBy,
+      });
+    }
+
+    if (filter.isFeatured !== undefined) {
+      queryBuilder.andWhere('listing.isFeatured = :isFeatured', {
+        isFeatured: filter.isFeatured,
+      });
+    }
+
+    if (filter.isVerified !== undefined) {
+      queryBuilder.andWhere('listing.isVerified = :isVerified', {
+        isVerified: filter.isVerified,
+      });
+    }
+
+    if (filter.expiresAfter) {
+      queryBuilder.andWhere('listing.expiresAt >= :expiresAfter', {
+        expiresAfter: filter.expiresAfter,
+      });
+    }
+
+    if (filter.expiresBefore) {
+      queryBuilder.andWhere('listing.expiresAt <= :expiresBefore', {
+        expiresBefore: filter.expiresBefore,
+      });
+    }
+
+    if (filter.location) {
+      queryBuilder.andWhere(
+        "(6371 * acos(cos(radians(:latitude)) * cos(radians(listing.location->>'latitude')) * cos(radians(listing.location->>'longitude') - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(listing.location->>'latitude')))) <= :radius",
+        {
+          latitude: filter.location.latitude,
+          longitude: filter.location.longitude,
+          radius: filter.location.radius,
+        },
+      );
+    }
+
+    const sortBy = pagination.sortBy || 'createdAt';
+    const sortOrder = pagination.sortOrder || 'DESC';
+    queryBuilder.orderBy(`listing.${sortBy}`, sortOrder);
+
+    const skip = (pagination.page - 1) * pagination.limit;
+    queryBuilder.skip(skip).take(pagination.limit);
+
+    const [listings, total] = await queryBuilder.getManyAndCount();
+
+    const totalPages = Math.ceil(total / pagination.limit);
+
+    return {
+      data: listings,
+      total,
+      page: pagination.page,
+      limit: pagination.limit,
+      totalPages,
+      hasNext: pagination.page < totalPages,
+      hasPrev: pagination.page > 1,
+    };
+  }
+
+  async getListingById(id: string): Promise<EnergyListing> {
+    const listing = await this.listingRepository.findOne({
+      where: { id },
+      relations: ['bids', 'trades'],
+    });
+
+    if (!listing) {
+      throw new NotFoundException(`Listing with ID ${id} not found`);
+    }
+
+    await this.incrementViewCount(id);
+
+    return listing;
+  }
+
+  async updateListing(
+    id: string,
+    updateListingDto: UpdateListingDto,
+    userId: string,
+  ): Promise<EnergyListing> {
+    const listing = await this.getListingById(id);
+
+    if (listing.createdBy !== userId) {
+      throw new ForbiddenException('You can only update your own listings');
+    }
+
+    if (
+      listing.status === ListingStatus.FILLED ||
+      listing.status === ListingStatus.CANCELLED
+    ) {
+      throw new BadRequestException(
+        'Cannot update listing that is filled or cancelled',
+      );
+    }
+
+    Object.assign(listing, updateListingDto);
+    listing.updatedBy = userId;
+
+    if (updateListingDto.expiresAt) {
+      listing.expiresAt = new Date(updateListingDto.expiresAt);
+    }
+
+    if (updateListingDto.deliveryDate) {
+      listing.deliveryDate = new Date(updateListingDto.deliveryDate);
+    }
+
+    if (updateListingDto.deliveryStartDate) {
+      listing.deliveryStartDate = new Date(updateListingDto.deliveryStartDate);
+    }
+
+    if (updateListingDto.deliveryEndDate) {
+      listing.deliveryEndDate = new Date(updateListingDto.deliveryEndDate);
+    }
+
+    const updatedListing = await this.listingRepository.save(listing);
+
+    this.logger.log(`Updated listing: ${id} by user: ${userId}`);
+    return updatedListing;
+  }
+
+  async cancelListing(id: string, userId: string): Promise<EnergyListing> {
+    const listing = await this.getListingById(id);
+
+    if (listing.createdBy !== userId) {
+      throw new ForbiddenException('You can only cancel your own listings');
+    }
+
+    if (listing.status === ListingStatus.FILLED) {
+      throw new BadRequestException(
+        'Cannot cancel listing that is already filled',
+      );
+    }
+
+    if (listing.status === ListingStatus.CANCELLED) {
+      throw new BadRequestException('Listing is already cancelled');
+    }
+
+    listing.status = ListingStatus.CANCELLED;
+    listing.cancelledAt = new Date();
+    listing.updatedBy = userId;
+
+    const cancelledListing = await this.listingRepository.save(listing);
+
+    await this.rejectAllBidsForListing(id, userId);
+
+    this.logger.log(`Cancelled listing: ${id} by user: ${userId}`);
+    return cancelledListing;
+  }
+
+  async placeBid(placeBidDto: PlaceBidDto, userId: string): Promise<Bid> {
+    this.logger.log(
+      `Placing bid on listing: ${placeBidDto.listingId} by user: ${userId}`,
+    );
+
+    const listing = await this.getListingById(placeBidDto.listingId);
+
+    if (listing.createdBy === userId) {
+      throw new ForbiddenException('You cannot bid on your own listing');
+    }
+
+    if (listing.status !== ListingStatus.ACTIVE) {
+      throw new BadRequestException('Can only bid on active listings');
+    }
+
+    if (listing.expiresAt && listing.expiresAt < new Date()) {
+      throw new BadRequestException('Cannot bid on expired listing');
+    }
+
+    if (placeBidDto.quantity > listing.quantity) {
+      throw new BadRequestException(
+        'Bid quantity cannot exceed listing quantity',
+      );
+    }
+
+    if (listing.minPrice && placeBidDto.price < listing.minPrice) {
+      throw new BadRequestException(
+        `Bid price cannot be below minimum price: ${listing.minPrice}`,
+      );
+    }
+
+    if (listing.maxPrice && placeBidDto.price > listing.maxPrice) {
+      throw new BadRequestException(
+        `Bid price cannot exceed maximum price: ${listing.maxPrice}`,
+      );
+    }
+
+    if (
+      listing.requirements?.minimumBidQuantity &&
+      placeBidDto.quantity < listing.requirements.minimumBidQuantity
+    ) {
+      throw new BadRequestException(
+        `Bid quantity must be at least: ${listing.requirements.minimumBidQuantity}`,
+      );
+    }
+
+    if (
+      listing.requirements?.maximumBidQuantity &&
+      placeBidDto.quantity > listing.requirements.maximumBidQuantity
+    ) {
+      throw new BadRequestException(
+        `Bid quantity cannot exceed: ${listing.requirements.maximumBidQuantity}`,
+      );
+    }
+
+    const existingBid = await this.bidRepository.findOne({
+      where: {
+        listingId: placeBidDto.listingId,
+        bidderId: userId,
+        status: BidStatus.PENDING,
+      },
+    });
+
+    if (existingBid) {
+      throw new BadRequestException(
+        'You already have a pending bid on this listing',
+      );
+    }
+
+    const bid = this.bidRepository.create({
+      ...placeBidDto,
+      bidderId: userId,
+      status: BidStatus.PENDING,
+      totalPrice: placeBidDto.quantity * placeBidDto.price,
+      createdBy: userId,
+    });
+
+    if (placeBidDto.expiresAt) {
+      bid.expiresAt = new Date(placeBidDto.expiresAt);
+    }
+
+    const savedBid = await this.bidRepository.save(bid);
+
+    await this.incrementBidCount(placeBidDto.listingId);
+
+    this.logger.log(
+      `Placed bid: ${savedBid.id} on listing: ${placeBidDto.listingId}`,
+    );
+    return savedBid;
+  }
+
+  async getBidsByUser(
+    userId: string,
+    pagination: PaginationOptions = { page: 1, limit: 10 },
+  ): Promise<PaginatedResult<Bid>> {
+    this.logger.log(`Fetching bids for user: ${userId}`);
+
+    const queryBuilder = this.bidRepository
+      .createQueryBuilder('bid')
+      .leftJoinAndSelect('bid.listing', 'listing')
+      .where('bid.bidderId = :userId', { userId });
+
+    const sortBy = pagination.sortBy || 'createdAt';
+    const sortOrder = pagination.sortOrder || 'DESC';
+    queryBuilder.orderBy(`bid.${sortBy}`, sortOrder);
+
+    const skip = (pagination.page - 1) * pagination.limit;
+    queryBuilder.skip(skip).take(pagination.limit);
+
+    const [bids, total] = await queryBuilder.getManyAndCount();
+
+    const totalPages = Math.ceil(total / pagination.limit);
+
+    return {
+      data: bids,
+      total,
+      page: pagination.page,
+      limit: pagination.limit,
+      totalPages,
+      hasNext: pagination.page < totalPages,
+      hasPrev: pagination.page > 1,
+    };
+  }
+
+  async getBidsForListing(listingId: string, userId: string): Promise<Bid[]> {
+    const listing = await this.getListingById(listingId);
+
+    if (listing.createdBy !== userId) {
+      throw new ForbiddenException(
+        'You can only view bids for your own listings',
+      );
+    }
+
+    return this.bidRepository.find({
+      where: { listingId },
+      relations: ['listing'],
+      order: { createdAt: 'DESC' },
+    });
+  }
+
+  async acceptBid(bidId: string, userId: string): Promise<Bid> {
+    const bid = await this.bidRepository.findOne({
+      where: { id: bidId },
+      relations: ['listing'],
+    });
+
+    if (!bid) {
+      throw new NotFoundException(`Bid with ID ${bidId} not found`);
+    }
+
+    if (bid.listing.createdBy !== userId) {
+      throw new ForbiddenException(
+        'You can only accept bids for your own listings',
+      );
+    }
+
+    if (bid.status !== BidStatus.PENDING) {
+      throw new BadRequestException('Can only accept pending bids');
+    }
+
+    if (bid.listing.status !== ListingStatus.ACTIVE) {
+      throw new BadRequestException('Listing is no longer active');
+    }
+
+    return await this.dataSource.transaction(async (manager) => {
+      bid.status = BidStatus.ACCEPTED;
+      bid.acceptedAt = new Date();
+      bid.respondedBy = userId;
+      await manager.save(bid);
+
+      bid.listing.status = ListingStatus.FILLED;
+      bid.listing.filledAt = new Date();
+      await manager.save(bid.listing);
+
+      await this.rejectOtherBidsForListing(bid.listingId, bidId, manager);
+
+      this.logger.log(`Accepted bid: ${bidId} for listing: ${bid.listingId}`);
+      return bid;
+    });
+  }
+
+  async rejectBid(
+    bidId: string,
+    userId: string,
+    reason?: string,
+  ): Promise<Bid> {
+    const bid = await this.bidRepository.findOne({
+      where: { id: bidId },
+      relations: ['listing'],
+    });
+
+    if (!bid) {
+      throw new NotFoundException(`Bid with ID ${bidId} not found`);
+    }
+
+    if (bid.listing.createdBy !== userId) {
+      throw new ForbiddenException(
+        'You can only reject bids for your own listings',
+      );
+    }
+
+    if (bid.status !== BidStatus.PENDING) {
+      throw new BadRequestException('Can only reject pending bids');
+    }
+
+    bid.status = BidStatus.REJECTED;
+    bid.rejectedAt = new Date();
+    bid.respondedBy = userId;
+
+    if (!bid.auditTrail) bid.auditTrail = [];
+    bid.auditTrail.push({
+      timestamp: new Date(),
+      action: 'rejected',
+      userId,
+      reason: reason || 'Bid rejected by listing owner',
+      previousStatus: BidStatus.PENDING,
+      newStatus: BidStatus.REJECTED,
+    });
+
+    const rejectedBid = await this.bidRepository.save(bid);
+
+    this.logger.log(`Rejected bid: ${bidId} for listing: ${bid.listingId}`);
+    return rejectedBid;
+  }
+
+  async withdrawBid(bidId: string, userId: string): Promise<Bid> {
+    const bid = await this.bidRepository.findOne({ where: { id: bidId } });
+
+    if (!bid) {
+      throw new NotFoundException(`Bid with ID ${bidId} not found`);
+    }
+
+    if (bid.bidderId !== userId) {
+      throw new ForbiddenException('You can only withdraw your own bids');
+    }
+
+    if (bid.status !== BidStatus.PENDING) {
+      throw new BadRequestException('Can only withdraw pending bids');
+    }
+
+    bid.status = BidStatus.WITHDRAWN;
+    bid.withdrawnAt = new Date();
+    bid.updatedBy = userId;
+
+    const withdrawnBid = await this.bidRepository.save(bid);
+
+    await this.decrementBidCount(bid.listingId);
+
+    this.logger.log(`Withdrew bid: ${bidId} by user: ${userId}`);
+    return withdrawnBid;
+  }
+
+  async executeTrade(
+    executeTradeDto: ExecuteTradeDto,
+    userId: string,
+  ): Promise<Trade> {
+    this.logger.log(
+      `Executing trade for bid: ${executeTradeDto.bidId} by user: ${userId}`,
+    );
+
+    const bid = await this.bidRepository.findOne({
+      where: { id: executeTradeDto.bidId },
+      relations: ['listing'],
+    });
+
+    if (!bid) {
+      throw new NotFoundException(
+        `Bid with ID ${executeTradeDto.bidId} not found`,
+      );
+    }
+
+    if (bid.status !== BidStatus.ACCEPTED) {
+      throw new BadRequestException('Can only execute trade for accepted bids');
+    }
+
+    const isBuyer = bid.listing.type === ListingType.SELL;
+    const isSeller = bid.listing.type === ListingType.BUY;
+
+    if (
+      (isBuyer && bid.bidderId !== userId) ||
+      (isSeller && bid.listing.createdBy !== userId)
+    ) {
+      throw new ForbiddenException(
+        'You are not authorized to execute this trade',
+      );
+    }
+
+    const existingTrade = await this.tradeRepository.findOne({
+      where: { bidId: executeTradeDto.bidId },
+    });
+
+    if (existingTrade) {
+      throw new BadRequestException('Trade already exists for this bid');
+    }
+
+    const finalPrice = executeTradeDto.negotiatedDiscount
+      ? bid.price * (1 - executeTradeDto.negotiatedDiscount)
+      : bid.price;
+
+    const finalAmount = bid.quantity * finalPrice;
+
+    const serviceFee = executeTradeDto.serviceFee || 0;
+    const taxAmount = executeTradeDto.taxAmount || 0;
+    const deliveryCost = executeTradeDto.deliveryCost || 0;
+
+    const totalAmount = finalAmount + serviceFee + taxAmount + deliveryCost;
+
+    const trade = this.tradeRepository.create({
+      ...executeTradeDto,
+      listingId: bid.listingId,
+      bidId: bid.id,
+      buyerId: isBuyer ? bid.bidderId : bid.listing.createdBy,
+      sellerId: isSeller ? bid.bidderId : bid.listing.createdBy,
+      quantity: bid.quantity,
+      price: bid.price,
+      finalPrice,
+      totalAmount: finalAmount,
+      finalAmount: totalAmount,
+      status: TradeStatus.PENDING,
+      paymentStatus: PaymentStatus.PENDING,
+      deliveryStatus: DeliveryStatus.PENDING,
+      createdBy: userId,
+    });
+
+    if (executeTradeDto.deliveryDetails?.deliveryDate) {
+      trade.deliveryDetails = {
+        ...executeTradeDto.deliveryDetails,
+        deliveryDate: new Date(executeTradeDto.deliveryDetails.deliveryDate),
+        deliveryWindow: {
+          start: new Date(executeTradeDto.deliveryDetails.deliveryWindow.start),
+          end: new Date(executeTradeDto.deliveryDetails.deliveryWindow.end),
+        },
+      };
+    }
+
+    if (executeTradeDto.paymentDetails?.paymentSchedule) {
+      trade.paymentDetails = {
+        ...executeTradeDto.paymentDetails,
+        paymentSchedule: executeTradeDto.paymentDetails.paymentSchedule.map(
+          (schedule) => ({
+            ...schedule,
+            dueDate: new Date(schedule.dueDate),
+          }),
+        ),
+      };
+    }
+
+    if (executeTradeDto.contractTerms?.termsAcceptedAt) {
+      trade.contractTerms = {
+        ...executeTradeDto.contractTerms,
+        termsAcceptedAt: new Date(
+          executeTradeDto.contractTerms.termsAcceptedAt,
+        ),
+      };
+    }
+
+    if (executeTradeDto.qualityAssurance?.inspectionDate) {
+      trade.qualityAssurance = {
+        ...executeTradeDto.qualityAssurance,
+        inspectionDate: new Date(
+          executeTradeDto.qualityAssurance.inspectionDate,
+        ),
+      };
+    }
+
+    if (executeTradeDto.milestones) {
+      trade.milestones = executeTradeDto.milestones.map((milestone) => ({
+        ...milestone,
+        dueDate: new Date(milestone.dueDate),
+        completedDate: milestone.completedDate
+          ? new Date(milestone.completedDate)
+          : undefined,
+      }));
+    }
+
+    const savedTrade = await this.tradeRepository.save(trade);
+
+    this.logger.log(
+      `Executed trade: ${savedTrade.id} for bid: ${executeTradeDto.bidId}`,
+    );
+    return savedTrade;
+  }
+
+  async getTradeById(id: string, userId: string): Promise<Trade> {
+    const trade = await this.tradeRepository.findOne({
+      where: { id },
+      relations: ['listing', 'bid'],
+    });
+
+    if (!trade) {
+      throw new NotFoundException(`Trade with ID ${id} not found`);
+    }
+
+    if (trade.buyerId !== userId && trade.sellerId !== userId) {
+      throw new ForbiddenException(
+        'You can only view trades you are involved in',
+      );
+    }
+
+    return trade;
+  }
+
+  async getTradesByUser(
+    userId: string,
+    pagination: PaginationOptions = { page: 1, limit: 10 },
+  ): Promise<PaginatedResult<Trade>> {
+    this.logger.log(`Fetching trades for user: ${userId}`);
+
+    const queryBuilder = this.tradeRepository
+      .createQueryBuilder('trade')
+      .leftJoinAndSelect('trade.listing', 'listing')
+      .leftJoinAndSelect('trade.bid', 'bid')
+      .where('trade.buyerId = :userId OR trade.sellerId = :userId', { userId });
+
+    const sortBy = pagination.sortBy || 'createdAt';
+    const sortOrder = pagination.sortOrder || 'DESC';
+    queryBuilder.orderBy(`trade.${sortBy}`, sortOrder);
+
+    const skip = (pagination.page - 1) * pagination.limit;
+    queryBuilder.skip(skip).take(pagination.limit);
+
+    const [trades, total] = await queryBuilder.getManyAndCount();
+
+    const totalPages = Math.ceil(total / pagination.limit);
+
+    return {
+      data: trades,
+      total,
+      page: pagination.page,
+      limit: pagination.limit,
+      totalPages,
+      hasNext: pagination.page < totalPages,
+      hasPrev: pagination.page > 1,
+    };
+  }
+
+  async updateTradeStatus(
+    id: string,
+    status: TradeStatus,
+    userId: string,
+    reason?: string,
+  ): Promise<Trade> {
+    const trade = await this.getTradeById(id, userId);
+
+    const validTransitions = this.getValidStatusTransitions(trade.status);
+    if (!validTransitions.includes(status)) {
+      throw new BadRequestException(
+        `Cannot transition from ${trade.status} to ${status}`,
+      );
+    }
+
+    const previousStatus = trade.status;
+    trade.status = status;
+    trade.updatedBy = userId;
+
+    if (!trade.auditTrail) trade.auditTrail = [];
+    trade.auditTrail.push({
+      timestamp: new Date(),
+      action: 'status_changed',
+      userId,
+      reason: reason || `Status changed from ${previousStatus} to ${status}`,
+      previousStatus,
+      newStatus: status,
+    });
+
+    switch (status) {
+      case TradeStatus.CONFIRMED:
+        trade.confirmedAt = new Date();
+        trade.confirmedBy = userId;
+        break;
+      case TradeStatus.COMPLETED:
+        trade.completedAt = new Date();
+        break;
+      case TradeStatus.CANCELLED:
+        trade.cancelledAt = new Date();
+        trade.cancelledBy = userId;
+        break;
+      case TradeStatus.DISPUTED:
+        trade.disputedAt = new Date();
+        trade.disputedBy = userId;
+        trade.isDisputed = true;
+        trade.disputeReason = reason;
+        break;
+    }
+
+    const updatedTrade = await this.tradeRepository.save(trade);
+
+    this.logger.log(
+      `Updated trade status: ${id} to ${status} by user: ${userId}`,
+    );
+    return updatedTrade;
+  }
+
+  async getOrderBook(filter: ListingFilter = {}): Promise<{
+    buyOrders: EnergyListing[];
+    sellOrders: EnergyListing[];
+    summary: {
+      totalBuyOrders: number;
+      totalSellOrders: number;
+      totalBuyQuantity: number;
+      totalSellQuantity: number;
+      avgBuyPrice: number;
+      avgSellPrice: number;
+      spread: number;
+    };
+  }> {
+    const buyFilter = { ...filter, type: ListingType.BUY };
+    const sellFilter = { ...filter, type: ListingType.SELL };
+
+    const [buyOrders, sellOrders] = await Promise.all([
+      this.getListings(buyFilter, {
+        page: 1,
+        limit: 100,
+        sortBy: 'price',
+        sortOrder: 'DESC',
+      }),
+      this.getListings(sellFilter, {
+        page: 1,
+        limit: 100,
+        sortBy: 'price',
+        sortOrder: 'ASC',
+      }),
+    ]);
+
+    const totalBuyQuantity = buyOrders.data.reduce(
+      (sum, order) => sum + order.quantity,
+      0,
+    );
+    const totalSellQuantity = sellOrders.data.reduce(
+      (sum, order) => sum + order.quantity,
+      0,
+    );
+
+    const avgBuyPrice =
+      buyOrders.data.length > 0
+        ? buyOrders.data.reduce((sum, order) => sum + order.price, 0) /
+          buyOrders.data.length
+        : 0;
+
+    const avgSellPrice =
+      sellOrders.data.length > 0
+        ? sellOrders.data.reduce((sum, order) => sum + order.price, 0) /
+          sellOrders.data.length
+        : 0;
+
+    const spread = avgSellPrice - avgBuyPrice;
+
+    return {
+      buyOrders: buyOrders.data,
+      sellOrders: sellOrders.data,
+      summary: {
+        totalBuyOrders: buyOrders.total,
+        totalSellOrders: sellOrders.total,
+        totalBuyQuantity,
+        totalSellQuantity,
+        avgBuyPrice,
+        avgSellPrice,
+        spread,
+      },
+    };
+  }
+
+  private async incrementViewCount(listingId: string): Promise<void> {
+    await this.listingRepository.increment({ id: listingId }, 'viewCount', 1);
+  }
+
+  private async incrementBidCount(listingId: string): Promise<void> {
+    await this.listingRepository.increment({ id: listingId }, 'bidCount', 1);
+  }
+
+  private async decrementBidCount(listingId: string): Promise<void> {
+    await this.listingRepository.decrement({ id: listingId }, 'bidCount', 1);
+  }
+
+  private async rejectAllBidsForListing(
+    listingId: string,
+    userId: string,
+  ): Promise<void> {
+    const pendingBids = await this.bidRepository.find({
+      where: { listingId, status: BidStatus.PENDING },
+    });
+
+    for (const bid of pendingBids) {
+      bid.status = BidStatus.REJECTED;
+      bid.rejectedAt = new Date();
+      bid.respondedBy = userId;
+      await this.bidRepository.save(bid);
+    }
+  }
+
+  private async rejectOtherBidsForListing(
+    listingId: string,
+    acceptedBidId: string,
+    manager: Repository<Bid>,
+  ): Promise<void> {
+    const otherBids = await manager.find({
+      where: {
+        listingId,
+        status: BidStatus.PENDING,
+        id: Not(acceptedBidId),
+      },
+    });
+
+    for (const bid of otherBids) {
+      bid.status = BidStatus.REJECTED;
+      bid.rejectedAt = new Date();
+      await manager.save(bid);
+    }
+  }
+
+  private getValidStatusTransitions(currentStatus: TradeStatus): TradeStatus[] {
+    const transitions: Record<TradeStatus, TradeStatus[]> = {
+      [TradeStatus.PENDING]: [TradeStatus.CONFIRMED, TradeStatus.CANCELLED],
+      [TradeStatus.CONFIRMED]: [TradeStatus.IN_PROGRESS, TradeStatus.CANCELLED],
+      [TradeStatus.IN_PROGRESS]: [
+        TradeStatus.COMPLETED,
+        TradeStatus.DISPUTED,
+        TradeStatus.CANCELLED,
+      ],
+      [TradeStatus.COMPLETED]: [TradeStatus.REFUNDED],
+      [TradeStatus.CANCELLED]: [],
+      [TradeStatus.DISPUTED]: [
+        TradeStatus.COMPLETED,
+        TradeStatus.CANCELLED,
+        TradeStatus.REFUNDED,
+      ],
+      [TradeStatus.REFUNDED]: [],
+    };
+
+    return transitions[currentStatus] || [];
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/entities/bid.entity.ts.html b/coverage/lcov-report/src/energy/entities/bid.entity.ts.html new file mode 100644 index 0000000..d3dfa30 --- /dev/null +++ b/coverage/lcov-report/src/energy/entities/bid.entity.ts.html @@ -0,0 +1,745 @@ + + + + + + Code coverage report for src/energy/entities/bid.entity.ts + + + + + + + + + +
+
+

All files / src/energy/entities bid.entity.ts

+
+ +
+ 0% + Statements + 0/220 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/220 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  ManyToOne,
+  JoinColumn,
+} from 'typeorm';
+import { EnergyListing, ListingType } from './energy-listing.entity';
+
+export enum BidStatus {
+  PENDING = 'pending',
+  ACCEPTED = 'accepted',
+  REJECTED = 'rejected',
+  WITHDRAWN = 'withdrawn',
+  EXPIRED = 'expired',
+}
+
+export enum BidType {
+  STANDARD = 'standard',
+  PREMIUM = 'premium',
+  EMERGENCY = 'emergency',
+}
+
+@Entity('bids')
+export class Bid {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ name: 'listing_id' })
+  listingId: string;
+
+  @Column({ name: 'bidder_id' })
+  bidderId: string;
+
+  @Column({ type: 'decimal', precision: 12, scale: 2 })
+  quantity: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4 })
+  price: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  totalPrice?: number;
+
+  @Column({
+    type: 'enum',
+    enum: BidStatus,
+    default: BidStatus.PENDING,
+  })
+  status: BidStatus;
+
+  @Column({
+    type: 'enum',
+    enum: BidType,
+    default: BidType.STANDARD,
+  })
+  type: BidType;
+
+  @Column({ type: 'text', nullable: true })
+  message?: string;
+
+  @Column({ type: 'json', nullable: true })
+  deliveryTerms: {
+    deliveryDate?: Date;
+    deliveryLocation?: {
+      latitude: number;
+      longitude: number;
+      address?: string;
+    };
+    deliveryMethod?: string;
+    deliveryCost?: number;
+    flexibility?: number;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  paymentTerms: {
+    method?: string;
+    schedule?: string[];
+    advancePayment?: number;
+    escrowRequired?: boolean;
+    paymentDays?: number;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  qualityRequirements: {
+    minimumQuality?: number;
+    certifications?: string[];
+    testingRequired?: boolean;
+    inspectionRequired?: boolean;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  additionalTerms: {
+    warrantyPeriod?: number;
+    supportLevel?: string;
+    penaltyClauses?: string[];
+    bonusConditions?: string[];
+  };
+
+  @Column({ type: 'json', nullable: true })
+  metadata: {
+    source?: string;
+    urgency?: 'low' | 'medium' | 'high' | 'critical';
+    confidence?: number;
+    riskAssessment?: {
+      financial: number;
+      operational: number;
+      regulatory: number;
+    };
+    competitiveAdvantage?: string[];
+  };
+
+  @Column({ type: 'decimal', precision: 3, scale: 2, nullable: true })
+  matchScore?: number;
+
+  @Column({ type: 'decimal', precision: 3, scale: 2, nullable: true })
+  competitivenessScore?: number;
+
+  @Column({ type: 'decimal', precision: 3, scale: 2, nullable: true })
+  reliabilityScore?: number;
+
+  @Column({ type: 'decimal', precision: 3, scale: 2, nullable: true })
+  overallScore?: number;
+
+  @Column({ name: 'is_counter_offer', default: false })
+  isCounterOffer: boolean;
+
+  @Column({ name: 'original_bid_id', nullable: true })
+  originalBidId?: string;
+
+  @Column({ name: 'counter_bid_id', nullable: true })
+  counterBidId?: string;
+
+  @Column({ name: 'negotiation_round', default: 1 })
+  negotiationRound: number;
+
+  @Column({ name: 'auto_accept', default: false })
+  autoAccept: boolean;
+
+  @Column({
+    name: 'auto_reject_threshold',
+    type: 'decimal',
+    precision: 3,
+    scale: 2,
+    nullable: true,
+  })
+  autoRejectThreshold?: number;
+
+  @Column({ name: 'expires_at', type: 'datetime', nullable: true })
+  expiresAt?: Date;
+
+  @Column({ name: 'responded_at', type: 'datetime', nullable: true })
+  respondedAt?: Date;
+
+  @Column({ name: 'accepted_at', type: 'datetime', nullable: true })
+  acceptedAt?: Date;
+
+  @Column({ name: 'rejected_at', type: 'datetime', nullable: true })
+  rejectedAt?: Date;
+
+  @Column({ name: 'withdrawn_at', type: 'datetime', nullable: true })
+  withdrawnAt?: Date;
+
+  @Column({ name: 'created_by' })
+  createdBy: string;
+
+  @Column({ name: 'updated_by', nullable: true })
+  updatedBy?: string;
+
+  @Column({ name: 'responded_by', nullable: true })
+  respondedBy?: string;
+
+  @Column({ type: 'json', nullable: true })
+  auditTrail: Array<{
+    timestamp: Date;
+    action: string;
+    userId?: string;
+    reason?: string;
+    previousStatus?: BidStatus;
+    newStatus?: BidStatus;
+  }>;
+
+  @Column({ type: 'json', nullable: true })
+  analytics: {
+    viewCount?: number;
+    responseTime?: number;
+    negotiationDuration?: number;
+    priceHistory?: Array<{
+      timestamp: Date;
+      price: number;
+      changeReason: string;
+    }>;
+    competitorBids?: Array<{
+      price: number;
+      quantity: number;
+      timestamp: Date;
+    }>;
+  };
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+
+  @ManyToOne(() => EnergyListing, (listing) => listing.bids, {
+    onDelete: 'CASCADE',
+  })
+  @JoinColumn({ name: 'listing_id' })
+  listing: EnergyListing;
+
+  @ManyToOne(() => Bid, { nullable: true })
+  @JoinColumn({ name: 'original_bid_id' })
+  originalBid?: Bid;
+
+  @ManyToOne(() => Bid, { nullable: true })
+  @JoinColumn({ name: 'counter_bid_id' })
+  counterBid?: Bid;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/entities/energy-listing.entity.ts.html b/coverage/lcov-report/src/energy/entities/energy-listing.entity.ts.html new file mode 100644 index 0000000..d23f9fc --- /dev/null +++ b/coverage/lcov-report/src/energy/entities/energy-listing.entity.ts.html @@ -0,0 +1,808 @@ + + + + + + Code coverage report for src/energy/entities/energy-listing.entity.ts + + + + + + + + + +
+
+

All files / src/energy/entities energy-listing.entity.ts

+
+ +
+ 0% + Statements + 0/241 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/241 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  ManyToOne,
+  OneToMany,
+  JoinColumn,
+} from 'typeorm';
+
+export enum ListingType {
+  BUY = 'buy',
+  SELL = 'sell',
+}
+
+export enum EnergyType {
+  SOLAR = 'solar',
+  WIND = 'wind',
+  HYDRO = 'hydro',
+  NUCLEAR = 'nuclear',
+  FOSSIL = 'fossil',
+  BIOMASS = 'biomass',
+  GEOTHERMAL = 'geothermal',
+}
+
+export enum ListingStatus {
+  ACTIVE = 'active',
+  PENDING = 'pending',
+  FILLED = 'filled',
+  CANCELLED = 'cancelled',
+  EXPIRED = 'expired',
+}
+
+export enum DeliveryType {
+  IMMEDIATE = 'immediate',
+  SCHEDULED = 'scheduled',
+  FLEXIBLE = 'flexible',
+}
+
+@Entity('energy_listings')
+export class EnergyListing {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ length: 255 })
+  title: string;
+
+  @Column({ type: 'text', nullable: true })
+  description: string;
+
+  @Column({
+    type: 'enum',
+    enum: ListingType,
+  })
+  type: ListingType;
+
+  @Column({
+    type: 'enum',
+    enum: EnergyType,
+  })
+  energyType: EnergyType;
+
+  @Column({ type: 'decimal', precision: 12, scale: 2 })
+  quantity: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4 })
+  price: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  minPrice?: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  maxPrice?: number;
+
+  @Column({
+    type: 'enum',
+    enum: ListingStatus,
+    default: ListingStatus.ACTIVE,
+  })
+  status: ListingStatus;
+
+  @Column({
+    type: 'enum',
+    enum: DeliveryType,
+    default: DeliveryType.FLEXIBLE,
+  })
+  deliveryType: DeliveryType;
+
+  @Column({ type: 'datetime', nullable: true })
+  deliveryDate?: Date;
+
+  @Column({ type: 'datetime', nullable: true })
+  deliveryStartDate?: Date;
+
+  @Column({ type: 'datetime', nullable: true })
+  deliveryEndDate?: Date;
+
+  @Column({ type: 'json', nullable: true })
+  location: {
+    latitude: number;
+    longitude: number;
+    address?: string;
+    city?: string;
+    region?: string;
+    country?: string;
+    postalCode?: string;
+  };
+
+  @Column({ type: 'decimal', precision: 8, scale: 2, nullable: true })
+  maxDeliveryDistance?: number;
+
+  @Column({ type: 'json', nullable: true })
+  qualitySpecifications: {
+    voltage?: number;
+    frequency?: number;
+    certification?: string[];
+    qualityScore?: number;
+    renewablePercentage?: number;
+    carbonFootprint?: number;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  paymentTerms: {
+    method?: string;
+    dueDays?: number;
+    escrowRequired?: boolean;
+    partialPayment?: boolean;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  contractTerms: {
+    duration?: number;
+    terminationNotice?: number;
+    penaltyClauses?: string[];
+    forceMajeure?: boolean;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  requirements: {
+    minimumBidQuantity?: number;
+    maximumBidQuantity?: number;
+    bidIncrement?: number;
+    preferredBuyers?: string[];
+    excludedBuyers?: string[];
+    verificationRequired?: boolean;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  metadata: {
+    source?: string;
+    gridConnection?: string;
+    storageCapacity?: number;
+    peakCapacity?: number;
+    efficiency?: number;
+    maintenanceSchedule?: string[];
+    certifications?: string[];
+    tags?: string[];
+  };
+
+  @Column({ name: 'seller_id', nullable: true })
+  sellerId?: string;
+
+  @Column({ name: 'buyer_id', nullable: true })
+  buyerId?: string;
+
+  @Column({ name: 'created_by' })
+  createdBy: string;
+
+  @Column({ name: 'updated_by', nullable: true })
+  updatedBy?: string;
+
+  @Column({ name: 'expires_at', type: 'datetime', nullable: true })
+  expiresAt?: Date;
+
+  @Column({ name: 'filled_at', type: 'datetime', nullable: true })
+  filledAt?: Date;
+
+  @Column({ name: 'cancelled_at', type: 'datetime', nullable: true })
+  cancelledAt?: Date;
+
+  @Column({ name: 'view_count', default: 0 })
+  viewCount: number;
+
+  @Column({ name: 'bid_count', default: 0 })
+  bidCount: number;
+
+  @Column({ name: 'is_featured', default: false })
+  isFeatured: boolean;
+
+  @Column({ name: 'is_verified', default: false })
+  isVerified: boolean;
+
+  @Column({ name: 'is_premium', default: false })
+  isPremium: boolean;
+
+  @Column({
+    name: 'visibility_score',
+    type: 'decimal',
+    precision: 3,
+    scale: 2,
+    default: 1.0,
+  })
+  visibilityScore: number;
+
+  @Column({
+    name: 'match_score',
+    type: 'decimal',
+    precision: 3,
+    scale: 2,
+    nullable: true,
+  })
+  matchScore?: number;
+
+  @Column({ type: 'json', nullable: true })
+  analytics: {
+    views?: number;
+    clicks?: number;
+    saves?: number;
+    shares?: number;
+    conversionRate?: number;
+    avgBidPrice?: number;
+    priceRange?: {
+      min: number;
+      max: number;
+      avg: number;
+    };
+  };
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+
+  @OneToMany(() => Bid, (bid) => bid.listing)
+  bids: Bid[];
+
+  @OneToMany(() => Trade, (trade) => trade.listing)
+  trades: Trade[];
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/entities/index.html b/coverage/lcov-report/src/energy/entities/index.html new file mode 100644 index 0000000..ce28410 --- /dev/null +++ b/coverage/lcov-report/src/energy/entities/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/energy/entities + + + + + + + + + +
+
+

All files src/energy/entities

+
+ +
+ 0% + Statements + 0/810 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/810 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
bid.entity.ts +
+
0%0/2200%0/10%0/10%0/220
energy-listing.entity.ts +
+
0%0/2410%0/10%0/10%0/241
trade.entity.ts +
+
0%0/3490%0/10%0/10%0/349
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/entities/trade.entity.ts.html b/coverage/lcov-report/src/energy/entities/trade.entity.ts.html new file mode 100644 index 0000000..0bdcfb2 --- /dev/null +++ b/coverage/lcov-report/src/energy/entities/trade.entity.ts.html @@ -0,0 +1,1132 @@ + + + + + + Code coverage report for src/energy/entities/trade.entity.ts + + + + + + + + + +
+
+

All files / src/energy/entities trade.entity.ts

+
+ +
+ 0% + Statements + 0/349 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/349 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  ManyToOne,
+  JoinColumn,
+} from 'typeorm';
+import { EnergyListing } from './energy-listing.entity';
+import { Bid } from './bid.entity';
+
+export enum TradeStatus {
+  PENDING = 'pending',
+  CONFIRMED = 'confirmed',
+  IN_PROGRESS = 'in_progress',
+  COMPLETED = 'completed',
+  CANCELLED = 'cancelled',
+  DISPUTED = 'disputed',
+  REFUNDED = 'refunded',
+}
+
+export enum TradeType {
+  STANDARD = 'standard',
+  PREMIUM = 'premium',
+  EMERGENCY = 'emergency',
+  BULK = 'bulk',
+}
+
+export enum PaymentStatus {
+  PENDING = 'pending',
+  PROCESSING = 'processing',
+  COMPLETED = 'completed',
+  FAILED = 'failed',
+  REFUNDED = 'refunded',
+  PARTIALLY_REFUNDED = 'partially_refunded',
+}
+
+export enum DeliveryStatus {
+  PENDING = 'pending',
+  SCHEDULED = 'scheduled',
+  IN_TRANSIT = 'in_transit',
+  DELIVERED = 'delivered',
+  FAILED = 'failed',
+  CANCELLED = 'cancelled',
+}
+
+@Entity('trades')
+export class Trade {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ name: 'listing_id' })
+  listingId: string;
+
+  @Column({ name: 'bid_id' })
+  bidId: string;
+
+  @Column({ name: 'buyer_id' })
+  buyerId: string;
+
+  @Column({ name: 'seller_id' })
+  sellerId: string;
+
+  @Column({ type: 'decimal', precision: 12, scale: 2 })
+  quantity: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4 })
+  price: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  totalAmount: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  finalPrice?: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2, nullable: true })
+  finalAmount?: number;
+
+  @Column({
+    type: 'enum',
+    enum: TradeStatus,
+    default: TradeStatus.PENDING,
+  })
+  status: TradeStatus;
+
+  @Column({
+    type: 'enum',
+    enum: TradeType,
+    default: TradeType.STANDARD,
+  })
+  type: TradeType;
+
+  @Column({
+    type: 'enum',
+    enum: PaymentStatus,
+    default: PaymentStatus.PENDING,
+  })
+  paymentStatus: PaymentStatus;
+
+  @Column({
+    type: 'enum',
+    enum: DeliveryStatus,
+    default: DeliveryStatus.PENDING,
+  })
+  deliveryStatus: DeliveryStatus;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  negotiatedDiscount?: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  serviceFee?: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  taxAmount?: number;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  deliveryCost?: number;
+
+  @Column({ type: 'json', nullable: true })
+  deliveryDetails: {
+    deliveryAddress: {
+      latitude: number;
+      longitude: number;
+      address: string;
+      city: string;
+      region: string;
+      country: string;
+      postalCode: string;
+    };
+    deliveryDate: Date;
+    deliveryWindow: {
+      start: Date;
+      end: Date;
+    };
+    deliveryMethod: string;
+    trackingNumber?: string;
+    carrier?: string;
+    specialInstructions?: string;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  paymentDetails: {
+    method: string;
+    currency: string;
+    paymentSchedule: Array<{
+      dueDate: Date;
+      amount: number;
+      status: PaymentStatus;
+      transactionId?: string;
+    }>;
+    escrowReleased?: boolean;
+    refundAmount?: number;
+    refundReason?: string;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  contractTerms: {
+    contractId?: string;
+    contractUrl?: string;
+    termsAccepted: boolean;
+    termsAcceptedAt?: Date;
+    terminationClause?: string;
+    warrantyPeriod?: number;
+    supportLevel?: string;
+    penaltyClauses?: string[];
+  };
+
+  @Column({ type: 'json', nullable: true })
+  qualityAssurance: {
+    inspectionRequired: boolean;
+    inspectionCompleted?: boolean;
+    inspectionDate?: Date;
+    inspectionResult?: 'pass' | 'fail' | 'conditional';
+    qualityScore?: number;
+    deficiencies?: string[];
+    correctiveActions?: string[];
+  };
+
+  @Column({ type: 'json', nullable: true })
+  compliance: {
+    certifications: string[];
+    regulatoryApproved: boolean;
+    environmentalCompliance: boolean;
+    safetyCompliance: boolean;
+    complianceDocuments: Array<{
+      type: string;
+      url: string;
+      verified: boolean;
+      verifiedAt?: Date;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  milestones: Array<{
+    id: string;
+    name: string;
+    description: string;
+    dueDate: Date;
+    completedDate?: Date;
+    status: 'pending' | 'in_progress' | 'completed' | 'failed';
+    assignedTo?: string;
+    dependencies?: string[];
+  }>;
+
+  @Column({ type: 'json', nullable: true })
+  riskManagement: {
+    riskLevel: 'low' | 'medium' | 'high' | 'critical';
+    riskFactors: string[];
+    mitigationStrategies: string[];
+    insuranceRequired: boolean;
+    insurancePolicy?: string;
+    contingencyPlans: string[];
+  };
+
+  @Column({ type: 'json', nullable: true })
+  metadata: {
+    source?: string;
+    urgency?: 'low' | 'medium' | 'high' | 'critical';
+    priority?: number;
+    tags?: string[];
+    notes?: string[];
+    attachments?: Array<{
+      type: string;
+      url: string;
+      name: string;
+      uploadedAt: Date;
+    }>;
+  };
+
+  @Column({ name: 'confirmed_at', type: 'datetime', nullable: true })
+  confirmedAt?: Date;
+
+  @Column({ name: 'completed_at', type: 'datetime', nullable: true })
+  completedAt?: Date;
+
+  @Column({ name: 'cancelled_at', type: 'datetime', nullable: true })
+  cancelledAt?: Date;
+
+  @Column({ name: 'disputed_at', type: 'datetime', nullable: true })
+  disputedAt?: Date;
+
+  @Column({ name: 'refunded_at', type: 'datetime', nullable: true })
+  refundedAt?: Date;
+
+  @Column({ name: 'delivery_confirmed_at', type: 'datetime', nullable: true })
+  deliveryConfirmedAt?: Date;
+
+  @Column({ name: 'payment_completed_at', type: 'datetime', nullable: true })
+  paymentCompletedAt?: Date;
+
+  @Column({ name: 'created_by' })
+  createdBy: string;
+
+  @Column({ name: 'updated_by', nullable: true })
+  updatedBy?: string;
+
+  @Column({ name: 'confirmed_by', nullable: true })
+  confirmedBy?: string;
+
+  @Column({ name: 'cancelled_by', nullable: true })
+  cancelledBy?: string;
+
+  @Column({ name: 'disputed_by', nullable: true })
+  disputedBy?: string;
+
+  @Column({ type: 'json', nullable: true })
+  auditTrail: Array<{
+    timestamp: Date;
+    action: string;
+    userId?: string;
+    reason?: string;
+    previousStatus?: TradeStatus;
+    newStatus?: TradeStatus;
+    details?: any;
+  }>;
+
+  @Column({ type: 'json', nullable: true })
+  analytics: {
+    totalDuration?: number;
+    paymentProcessingTime?: number;
+    deliveryTime?: number;
+    customerSatisfaction?: number;
+    issues?: Array<{
+      type: string;
+      description: string;
+      resolved: boolean;
+      resolvedAt?: Date;
+    }>;
+    performanceMetrics?: {
+      onTimeDelivery: boolean;
+      qualityScore: number;
+      communicationScore: number;
+      overallRating: number;
+    };
+  };
+
+  @Column({ name: 'is_disputed', default: false })
+  isDisputed: boolean;
+
+  @Column({ name: 'dispute_reason', nullable: true })
+  disputeReason?: string;
+
+  @Column({ name: 'dispute_resolution', nullable: true })
+  disputeResolution?: string;
+
+  @Column({
+    name: 'refund_amount',
+    type: 'decimal',
+    precision: 15,
+    scale: 2,
+    nullable: true,
+  })
+  refundAmount?: number;
+
+  @Column({
+    name: 'penalty_amount',
+    type: 'decimal',
+    precision: 15,
+    scale: 2,
+    nullable: true,
+  })
+  penaltyAmount?: number;
+
+  @Column({
+    name: 'bonus_amount',
+    type: 'decimal',
+    precision: 15,
+    scale: 2,
+    nullable: true,
+  })
+  bonusAmount?: number;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+
+  @ManyToOne(() => EnergyListing, (listing) => listing.trades, {
+    onDelete: 'CASCADE',
+  })
+  @JoinColumn({ name: 'listing_id' })
+  listing: EnergyListing;
+
+  @ManyToOne(() => Bid, { onDelete: 'CASCADE' })
+  @JoinColumn({ name: 'bid_id' })
+  bid: Bid;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/filters/http-exception.filter.ts.html b/coverage/lcov-report/src/energy/filters/http-exception.filter.ts.html new file mode 100644 index 0000000..8634d32 --- /dev/null +++ b/coverage/lcov-report/src/energy/filters/http-exception.filter.ts.html @@ -0,0 +1,397 @@ + + + + + + Code coverage report for src/energy/filters/http-exception.filter.ts + + + + + + + + + +
+
+

All files / src/energy/filters http-exception.filter.ts

+
+ +
+ 0% + Statements + 0/104 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/104 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  ExceptionFilter,
+  Catch,
+  ArgumentsHost,
+  HttpException,
+  HttpStatus,
+  Logger,
+} from '@nestjs/common';
+import { Request, Response } from 'express';
+import { ConfigService } from '@nestjs/config';
+
+@Catch(HttpException)
+export class HttpExceptionFilter implements ExceptionFilter {
+  private readonly logger = new Logger(HttpExceptionFilter.name);
+
+  constructor(private readonly configService: ConfigService) {}
+
+  catch(exception: HttpException, host: ArgumentsHost) {
+    const ctx = host.switchToHttp();
+    const response = ctx.getResponse<Response>();
+    const request = ctx.getRequest<Request>();
+    const status = exception.getStatus();
+    const exceptionResponse = exception.getResponse();
+
+    const isDevelopment = this.configService.get('NODE_ENV') === 'development';
+
+    let errorResponse: any = {
+      statusCode: status,
+      timestamp: new Date().toISOString(),
+      path: request.url,
+      method: request.method,
+      message: exception.message || 'Internal server error',
+    };
+
+    if (typeof exceptionResponse === 'object' && exceptionResponse !== null) {
+      errorResponse = {
+        ...errorResponse,
+        ...exceptionResponse,
+      };
+    }
+
+    if (exceptionResponse.details && Array.isArray(exceptionResponse.details)) {
+      errorResponse.details = exceptionResponse.details.map((detail: any) => ({
+        field: detail.property || detail.field,
+        message: detail.constraints
+          ? Object.values(detail.constraints).join(', ')
+          : detail.message,
+        value: detail.value,
+      }));
+    }
+
+    if (isDevelopment) {
+      errorResponse.stack = exception.stack;
+      errorResponse.exception = {
+        name: exception.constructor.name,
+        message: exception.message,
+      };
+    }
+
+    this.logError(exception, request, errorResponse);
+
+    response.status(status).json(errorResponse);
+  }
+
+  private logError(
+    exception: HttpException,
+    request: Request,
+    errorResponse: any,
+  ) {
+    const { method, url, ip, headers } = request;
+    const userAgent = headers['user-agent'] || 'Unknown';
+    const userId = (request as any).user?.id || 'Anonymous';
+
+    const logData = {
+      method,
+      url,
+      ip,
+      userAgent,
+      userId,
+      statusCode: exception.getStatus(),
+      message: exception.message,
+      path: request.url,
+      timestamp: new Date().toISOString(),
+    };
+
+    if (exception.getStatus() >= 500) {
+      this.logger.error(`Server Error: ${method} ${url}`, {
+        ...logData,
+        stack: exception.stack,
+        response: errorResponse,
+      });
+    } else if (exception.getStatus() >= 400) {
+      this.logger.warn(`Client Error: ${method} ${url}`, {
+        ...logData,
+        response: errorResponse,
+      });
+    } else {
+      this.logger.log(`HTTP Exception: ${method} ${url}`, {
+        ...logData,
+        response: errorResponse,
+      });
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/filters/index.html b/coverage/lcov-report/src/energy/filters/index.html new file mode 100644 index 0000000..77ea787 --- /dev/null +++ b/coverage/lcov-report/src/energy/filters/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/energy/filters + + + + + + + + + +
+
+

All files src/energy/filters

+
+ +
+ 0% + Statements + 0/104 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/104 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
http-exception.filter.ts +
+
0%0/1040%0/10%0/10%0/104
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/guards/auth.guard.ts.html b/coverage/lcov-report/src/energy/guards/auth.guard.ts.html new file mode 100644 index 0000000..e1f9c97 --- /dev/null +++ b/coverage/lcov-report/src/energy/guards/auth.guard.ts.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for src/energy/guards/auth.guard.ts + + + + + + + + + +
+
+

All files / src/energy/guards auth.guard.ts

+
+ +
+ 0% + Statements + 0/37 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
+import { Reflector } from '@nestjs/core';
+
+@Injectable()
+export class AuthGuard implements CanActivate {
+  constructor(private reflector: Reflector) {}
+
+  canActivate(context: ExecutionContext): boolean {
+    const request = context.switchToHttp().getRequest();
+
+    const token = this.extractTokenFromHeader(request);
+    if (!token) {
+      return false;
+    }
+
+    try {
+      const payload = this.verifyToken(token);
+      request['user'] = payload;
+      return true;
+    } catch {
+      return false;
+    }
+  }
+
+  private extractTokenFromHeader(request: any): string | undefined {
+    const [type, token] = request.headers.authorization?.split(' ') ?? [];
+    return type === 'Bearer' ? token : undefined;
+  }
+
+  private verifyToken(token: string): any {
+    return {
+      id: 'user-id-placeholder',
+      email: 'user@example.com',
+      role: 'user',
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/guards/index.html b/coverage/lcov-report/src/energy/guards/index.html new file mode 100644 index 0000000..90bfae6 --- /dev/null +++ b/coverage/lcov-report/src/energy/guards/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/energy/guards + + + + + + + + + +
+
+

All files src/energy/guards

+
+ +
+ 0% + Statements + 0/37 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
auth.guard.ts +
+
0%0/370%0/10%0/10%0/37
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/energy/index.html b/coverage/lcov-report/src/energy/index.html new file mode 100644 index 0000000..342ce65 --- /dev/null +++ b/coverage/lcov-report/src/energy/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/energy + + + + + + + + + +
+
+

All files src/energy

+
+ +
+ 0% + Statements + 0/1588 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/1588 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
energy.controller.ts +
+
0%0/6080%0/10%0/10%0/608
energy.module.ts +
+
0%0/230%0/10%0/10%0/23
energy.service.ts +
+
0%0/9570%0/10%0/10%0/957
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/analysis/economic-indicator.service.ts.html b/coverage/lcov-report/src/forecasting/analysis/economic-indicator.service.ts.html new file mode 100644 index 0000000..47d8c5b --- /dev/null +++ b/coverage/lcov-report/src/forecasting/analysis/economic-indicator.service.ts.html @@ -0,0 +1,1936 @@ + + + + + + Code coverage report for src/forecasting/analysis/economic-indicator.service.ts + + + + + + + + + +
+
+

All files / src/forecasting/analysis economic-indicator.service.ts

+
+ +
+ 0% + Statements + 0/617 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/617 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { HttpService } from '@nestjs/axios';
+import { firstValueFrom } from 'rxjs';
+
+export interface EconomicIndicator {
+  name: string;
+  value: number;
+  unit: string;
+  timestamp: Date;
+  source: string;
+  region: string;
+}
+
+export interface EconomicData {
+  gdp: number;
+  inflation: number;
+  unemployment: number;
+  interestRate: number;
+  industrialProduction: number;
+  consumerConfidence: number;
+  manufacturingIndex: number;
+  retailSales: number;
+  energyPrices: number;
+  currencyExchange: number;
+}
+
+export interface MarketImpact {
+  indicator: string;
+  correlation: number;
+  impact: number;
+  trend: 'increasing' | 'decreasing' | 'stable';
+  significance: 'high' | 'medium' | 'low';
+}
+
+@Injectable()
+export class EconomicIndicatorService {
+  private readonly logger = new Logger(EconomicIndicatorService.name);
+  private readonly fredApiKey = process.env.FRED_API_KEY;
+  private readonly alphaVantageApiKey = process.env.ALPHA_VANTAGE_API_KEY;
+
+  constructor(private readonly httpService: HttpService) {}
+
+  async getGDPData(
+    region: string = 'US',
+    startDate: Date,
+    endDate: Date,
+  ): Promise<EconomicIndicator[]> {
+    try {
+      const response = await firstValueFrom(
+        this.httpService.get(
+          'https://api.stlouisfed.org/fred/series/observations',
+          {
+            params: {
+              series_id: this.getGDPSeriesId(region),
+              api_key: this.fredApiKey,
+              observation_start: startDate.toISOString().split('T')[0],
+              observation_end: endDate.toISOString().split('T')[0],
+              file_type: 'json',
+            },
+          },
+        ),
+      );
+
+      return response.data.observations.map((obs: any) => ({
+        name: 'GDP',
+        value: parseFloat(obs.value) || 0,
+        unit: 'Billions USD',
+        timestamp: new Date(obs.date),
+        source: 'FRED',
+        region,
+      }));
+    } catch (error) {
+      this.logger.error('Failed to fetch GDP data', error);
+      return this.getMockGDPData(region, startDate, endDate);
+    }
+  }
+
+  async getInflationData(
+    region: string = 'US',
+    startDate: Date,
+    endDate: Date,
+  ): Promise<EconomicIndicator[]> {
+    try {
+      const response = await firstValueFrom(
+        this.httpService.get(
+          'https://api.stlouisfed.org/fred/series/observations',
+          {
+            params: {
+              series_id: this.getInflationSeriesId(region),
+              api_key: this.fredApiKey,
+              observation_start: startDate.toISOString().split('T')[0],
+              observation_end: endDate.toISOString().split('T')[0],
+              file_type: 'json',
+            },
+          },
+        ),
+      );
+
+      return response.data.observations.map((obs: any) => ({
+        name: 'Inflation',
+        value: parseFloat(obs.value) || 0,
+        unit: 'Percent',
+        timestamp: new Date(obs.date),
+        source: 'FRED',
+        region,
+      }));
+    } catch (error) {
+      this.logger.error('Failed to fetch inflation data', error);
+      return this.getMockInflationData(region, startDate, endDate);
+    }
+  }
+
+  async getUnemploymentData(
+    region: string = 'US',
+    startDate: Date,
+    endDate: Date,
+  ): Promise<EconomicIndicator[]> {
+    try {
+      const response = await firstValueFrom(
+        this.httpService.get(
+          'https://api.stlouisfed.org/fred/series/observations',
+          {
+            params: {
+              series_id: this.getUnemploymentSeriesId(region),
+              api_key: this.fredApiKey,
+              observation_start: startDate.toISOString().split('T')[0],
+              observation_end: endDate.toISOString().split('T')[0],
+              file_type: 'json',
+            },
+          },
+        ),
+      );
+
+      return response.data.observations.map((obs: any) => ({
+        name: 'Unemployment',
+        value: parseFloat(obs.value) || 0,
+        unit: 'Percent',
+        timestamp: new Date(obs.date),
+        source: 'FRED',
+        region,
+      }));
+    } catch (error) {
+      this.logger.error('Failed to fetch unemployment data', error);
+      return this.getMockUnemploymentData(region, startDate, endDate);
+    }
+  }
+
+  async getInterestRateData(
+    region: string = 'US',
+    startDate: Date,
+    endDate: Date,
+  ): Promise<EconomicIndicator[]> {
+    try {
+      const response = await firstValueFrom(
+        this.httpService.get(
+          'https://api.stlouisfed.org/fred/series/observations',
+          {
+            params: {
+              series_id: this.getInterestRateSeriesId(region),
+              api_key: this.fredApiKey,
+              observation_start: startDate.toISOString().split('T')[0],
+              observation_end: endDate.toISOString().split('T')[0],
+              file_type: 'json',
+            },
+          },
+        ),
+      );
+
+      return response.data.observations.map((obs: any) => ({
+        name: 'Interest Rate',
+        value: parseFloat(obs.value) || 0,
+        unit: 'Percent',
+        timestamp: new Date(obs.date),
+        source: 'FRED',
+        region,
+      }));
+    } catch (error) {
+      this.logger.error('Failed to fetch interest rate data', error);
+      return this.getMockInterestRateData(region, startDate, endDate);
+    }
+  }
+
+  async getEnergyPrices(
+    region: string = 'US',
+    startDate: Date,
+    endDate: Date,
+  ): Promise<EconomicIndicator[]> {
+    try {
+      // Use Alpha Vantage for energy prices
+      const response = await firstValueFrom(
+        this.httpService.get('https://www.alphavantage.co/query', {
+          params: {
+            function: 'GLOBAL_QUOTE',
+            symbol: this.getEnergySymbol(region),
+            apikey: this.alphaVantageApiKey,
+          },
+        }),
+      );
+
+      const data = response.data['Global Quote'];
+
+      return [
+        {
+          name: 'Energy Prices',
+          value: parseFloat(data['05. price']) || 0,
+          unit: 'USD',
+          timestamp: new Date(),
+          source: 'Alpha Vantage',
+          region,
+        },
+      ];
+    } catch (error) {
+      this.logger.error('Failed to fetch energy prices', error);
+      return this.getMockEnergyPrices(region, startDate, endDate);
+    }
+  }
+
+  async getEconomicSnapshot(region: string = 'US'): Promise<EconomicData> {
+    const endDate = new Date();
+    const startDate = new Date();
+    startDate.setMonth(startDate.getMonth() - 12);
+
+    const [
+      gdpData,
+      inflationData,
+      unemploymentData,
+      interestRateData,
+      energyPricesData,
+    ] = await Promise.all([
+      this.getGDPData(region, startDate, endDate),
+      this.getInflationData(region, startDate, endDate),
+      this.getUnemploymentData(region, startDate, endDate),
+      this.getInterestRateData(region, startDate, endDate),
+      this.getEnergyPrices(region, startDate, endDate),
+    ]);
+
+    return {
+      gdp: this.getLatestValue(gdpData),
+      inflation: this.getLatestValue(inflationData),
+      unemployment: this.getLatestValue(unemploymentData),
+      interestRate: this.getLatestValue(interestRateData),
+      industrialProduction: this.getMockIndustrialProduction(),
+      consumerConfidence: this.getMockConsumerConfidence(),
+      manufacturingIndex: this.getMockManufacturingIndex(),
+      retailSales: this.getMockRetailSales(),
+      energyPrices: this.getLatestValue(energyPricesData),
+      currencyExchange: this.getMockCurrencyExchange(),
+    };
+  }
+
+  async analyzeEconomicImpact(
+    economicData: EconomicData,
+    historicalEnergyData: { timestamp: Date; price: number; demand: number }[],
+  ): Promise<MarketImpact[]> {
+    const impacts: MarketImpact[] = [];
+
+    // GDP Impact
+    impacts.push({
+      indicator: 'GDP',
+      correlation: this.calculateCorrelation(
+        historicalEnergyData.map((d) => d.demand),
+        [economicData.gdp],
+      ),
+      impact: this.calculateGDPImpact(economicData.gdp),
+      trend: this.getTrend(economicData.gdp, 20000), // Base GDP of 20T
+      significance: 'high',
+    });
+
+    // Inflation Impact
+    impacts.push({
+      indicator: 'Inflation',
+      correlation: this.calculateCorrelation(
+        historicalEnergyData.map((d) => d.price),
+        [economicData.inflation],
+      ),
+      impact: this.calculateInflationImpact(economicData.inflation),
+      trend: this.getTrend(economicData.inflation, 2), // 2% target inflation
+      significance: 'medium',
+    });
+
+    // Interest Rate Impact
+    impacts.push({
+      indicator: 'Interest Rate',
+      correlation: this.calculateCorrelation(
+        historicalEnergyData.map((d) => d.price),
+        [economicData.interestRate],
+      ),
+      impact: this.calculateInterestRateImpact(economicData.interestRate),
+      trend: this.getTrend(economicData.interestRate, 3), // 3% baseline
+      significance: 'medium',
+    });
+
+    // Unemployment Impact
+    impacts.push({
+      indicator: 'Unemployment',
+      correlation: this.calculateCorrelation(
+        historicalEnergyData.map((d) => d.demand),
+        [economicData.unemployment],
+      ),
+      impact: this.calculateUnemploymentImpact(economicData.unemployment),
+      trend: this.getTrend(economicData.unemployment, 5), // 5% natural rate
+      significance: 'medium',
+    });
+
+    // Energy Prices Impact
+    impacts.push({
+      indicator: 'Energy Prices',
+      correlation: this.calculateCorrelation(
+        historicalEnergyData.map((d) => d.price),
+        [economicData.energyPrices],
+      ),
+      impact: this.calculateEnergyPriceImpact(economicData.energyPrices),
+      trend: this.getTrend(economicData.energyPrices, 100), // $100 baseline
+      significance: 'high',
+    });
+
+    return impacts;
+  }
+
+  async predictEconomicTrends(
+    economicData: EconomicData[],
+  ): Promise<Record<string, number>> {
+    const trends: Record<string, number> = {};
+
+    // Simple linear trend prediction for each indicator
+    const indicators = [
+      'gdp',
+      'inflation',
+      'unemployment',
+      'interestRate',
+      'industrialProduction',
+      'consumerConfidence',
+      'manufacturingIndex',
+      'retailSales',
+      'energyPrices',
+      'currencyExchange',
+    ];
+
+    indicators.forEach((indicator) => {
+      const values = economicData.map(
+        (d) => d[indicator as keyof EconomicData],
+      );
+      trends[indicator] = this.predictNextValue(values);
+    });
+
+    return trends;
+  }
+
+  private getGDPSeriesId(region: string): string {
+    const seriesMap: Record<string, string> = {
+      US: 'GDP',
+      EU: 'CLVMNACSCAB1GQEU',
+      UK: 'UKNGDP',
+      JP: 'JPNRGDPEXP',
+      CN: 'NGDP_CN',
+    };
+    return seriesMap[region] || 'GDP';
+  }
+
+  private getInflationSeriesId(region: string): string {
+    const seriesMap: Record<string, string> = {
+      US: 'CPIAUCSL',
+      EU: 'CP0000EZ19M086NEST',
+      UK: 'GBRCPIALLMINMEI',
+      JP: 'JPNCPIALLMINMEI',
+      CN: 'CHNCPIALLMINMEI',
+    };
+    return seriesMap[region] || 'CPIAUCSL';
+  }
+
+  private getUnemploymentSeriesId(region: string): string {
+    const seriesMap: Record<string, string> = {
+      US: 'UNRATE',
+      EU: 'LRUN64TTZQEU',
+      UK: 'LRUN64TTGBM',
+      JP: 'LRUN64TTJPQ156S',
+      CN: 'LMUNRRTTCHM156S',
+    };
+    return seriesMap[region] || 'UNRATE';
+  }
+
+  private getInterestRateSeriesId(region: string): string {
+    const seriesMap: Record<string, string> = {
+      US: 'FEDFUNDS',
+      EU: 'ESTBC',
+      UK: 'BOEBGCR',
+      JP: 'INTSRJPM193N',
+      CN: 'INTSRJPM193N',
+    };
+    return seriesMap[region] || 'FEDFUNDS';
+  }
+
+  private getEnergySymbol(region: string): string {
+    const symbolMap: Record<string, string> = {
+      US: 'CL=F', // Crude Oil
+      EU: 'BZ=F', // Brent Crude
+      UK: 'BZ=F',
+      JP: 'CL=F',
+      CN: 'CL=F',
+    };
+    return symbolMap[region] || 'CL=F';
+  }
+
+  private getLatestValue(indicators: EconomicIndicator[]): number {
+    return indicators.length > 0 ? indicators[indicators.length - 1].value : 0;
+  }
+
+  private calculateCorrelation(x: number[], y: number[]): number {
+    if (x.length !== y.length || x.length === 0) return 0;
+
+    const n = x.length;
+    const sumX = x.reduce((sum, val) => sum + val, 0);
+    const sumY = y.reduce((sum, val) => sum + val, 0);
+    const sumXY = x.reduce((sum, val, i) => sum + val * y[i], 0);
+    const sumX2 = x.reduce((sum, val) => sum + val * val, 0);
+    const sumY2 = y.reduce((sum, val) => sum + val * val, 0);
+
+    const numerator = n * sumXY - sumX * sumY;
+    const denominator = Math.sqrt(
+      (n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY),
+    );
+
+    return denominator === 0 ? 0 : numerator / denominator;
+  }
+
+  private calculateGDPImpact(gdp: number): number {
+    // Higher GDP generally increases energy demand
+    const baseline = 20000; // 20 trillion USD
+    return ((gdp - baseline) / baseline) * 0.3; // 30% elasticity
+  }
+
+  private calculateInflationImpact(inflation: number): number {
+    // Higher inflation can reduce energy demand but increase prices
+    const target = 2; // 2% target
+    return (inflation - target) * 0.05;
+  }
+
+  private calculateInterestRateImpact(rate: number): number {
+    // Higher interest rates can reduce economic activity and energy demand
+    const baseline = 3; // 3% baseline
+    return (rate - baseline) * -0.02;
+  }
+
+  private calculateUnemploymentImpact(unemployment: number): number {
+    // Higher unemployment reduces energy demand
+    const naturalRate = 5; // 5% natural rate
+    return (unemployment - naturalRate) * -0.03;
+  }
+
+  private calculateEnergyPriceImpact(price: number): number {
+    // Energy prices directly affect market prices
+    const baseline = 100; // $100 baseline
+    return (price - baseline) / baseline;
+  }
+
+  private getTrend(
+    current: number,
+    baseline: number,
+  ): 'increasing' | 'decreasing' | 'stable' {
+    const diff = (current - baseline) / baseline;
+    if (diff > 0.05) return 'increasing';
+    if (diff < -0.05) return 'decreasing';
+    return 'stable';
+  }
+
+  private predictNextValue(values: number[]): number {
+    if (values.length < 2) return values[0] || 0;
+
+    // Simple linear regression
+    const n = values.length;
+    const sumX = values.reduce((sum, _, i) => sum + i, 0);
+    const sumY = values.reduce((sum, val) => sum + val, 0);
+    const sumXY = values.reduce((sum, val, i) => sum + i * val, 0);
+    const sumX2 = values.reduce((sum, _, i) => sum + i * i, 0);
+
+    const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
+    const intercept = (sumY - slope * sumX) / n;
+
+    return slope * n + intercept;
+  }
+
+  // Mock data methods for fallback
+  private getMockGDPData(
+    region: string,
+    startDate: Date,
+    endDate: Date,
+  ): EconomicIndicator[] {
+    const data: EconomicIndicator[] = [];
+    const current = new Date(startDate);
+
+    while (current <= endDate) {
+      data.push({
+        name: 'GDP',
+        value: 20000 + Math.random() * 2000,
+        unit: 'Billions USD',
+        timestamp: new Date(current),
+        source: 'Mock',
+        region,
+      });
+      current.setMonth(current.getMonth() + 1);
+    }
+
+    return data;
+  }
+
+  private getMockInflationData(
+    region: string,
+    startDate: Date,
+    endDate: Date,
+  ): EconomicIndicator[] {
+    const data: EconomicIndicator[] = [];
+    const current = new Date(startDate);
+
+    while (current <= endDate) {
+      data.push({
+        name: 'Inflation',
+        value: 2 + Math.random() * 3,
+        unit: 'Percent',
+        timestamp: new Date(current),
+        source: 'Mock',
+        region,
+      });
+      current.setMonth(current.getMonth() + 1);
+    }
+
+    return data;
+  }
+
+  private getMockUnemploymentData(
+    region: string,
+    startDate: Date,
+    endDate: Date,
+  ): EconomicIndicator[] {
+    const data: EconomicIndicator[] = [];
+    const current = new Date(startDate);
+
+    while (current <= endDate) {
+      data.push({
+        name: 'Unemployment',
+        value: 3 + Math.random() * 4,
+        unit: 'Percent',
+        timestamp: new Date(current),
+        source: 'Mock',
+        region,
+      });
+      current.setMonth(current.getMonth() + 1);
+    }
+
+    return data;
+  }
+
+  private getMockInterestRateData(
+    region: string,
+    startDate: Date,
+    endDate: Date,
+  ): EconomicIndicator[] {
+    const data: EconomicIndicator[] = [];
+    const current = new Date(startDate);
+
+    while (current <= endDate) {
+      data.push({
+        name: 'Interest Rate',
+        value: 2 + Math.random() * 4,
+        unit: 'Percent',
+        timestamp: new Date(current),
+        source: 'Mock',
+        region,
+      });
+      current.setMonth(current.getMonth() + 1);
+    }
+
+    return data;
+  }
+
+  private getMockEnergyPrices(
+    region: string,
+    startDate: Date,
+    endDate: Date,
+  ): EconomicIndicator[] {
+    const data: EconomicIndicator[] = [];
+    const current = new Date(startDate);
+
+    while (current <= endDate) {
+      data.push({
+        name: 'Energy Prices',
+        value: 80 + Math.random() * 40,
+        unit: 'USD',
+        timestamp: new Date(current),
+        source: 'Mock',
+        region,
+      });
+      current.setMonth(current.getMonth() + 1);
+    }
+
+    return data;
+  }
+
+  private getMockIndustrialProduction(): number {
+    return 100 + Math.random() * 20;
+  }
+
+  private getMockConsumerConfidence(): number {
+    return 80 + Math.random() * 40;
+  }
+
+  private getMockManufacturingIndex(): number {
+    return 50 + Math.random() * 20;
+  }
+
+  private getMockRetailSales(): number {
+    return 500000 + Math.random() * 100000;
+  }
+
+  private getMockCurrencyExchange(): number {
+    return 1 + Math.random() * 0.2;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/analysis/index.html b/coverage/lcov-report/src/forecasting/analysis/index.html new file mode 100644 index 0000000..e2066e5 --- /dev/null +++ b/coverage/lcov-report/src/forecasting/analysis/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/forecasting/analysis + + + + + + + + + +
+
+

All files src/forecasting/analysis

+
+ +
+ 0% + Statements + 0/617 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/617 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
economic-indicator.service.ts +
+
0%0/6170%0/10%0/10%0/617
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/dto/forecast-query.dto.ts.html b/coverage/lcov-report/src/forecasting/dto/forecast-query.dto.ts.html new file mode 100644 index 0000000..de433fc --- /dev/null +++ b/coverage/lcov-report/src/forecasting/dto/forecast-query.dto.ts.html @@ -0,0 +1,445 @@ + + + + + + Code coverage report for src/forecasting/dto/forecast-query.dto.ts + + + + + + + + + +
+
+

All files / src/forecasting/dto forecast-query.dto.ts

+
+ +
+ 0% + Statements + 0/120 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/120 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsEnum,
+  IsDateString,
+  IsNumber,
+  IsOptional,
+  IsArray,
+  Min,
+  Max,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { ForecastHorizon } from '../entities/forecast-data.entity';
+
+export class ForecastQueryDto {
+  @IsString()
+  marketType: string;
+
+  @IsEnum(ForecastHorizon)
+  forecastHorizon: ForecastHorizon;
+
+  @IsDateString()
+  @IsOptional()
+  startDate?: string;
+
+  @IsDateString()
+  @IsOptional()
+  endDate?: string;
+
+  @IsNumber()
+  @Min(0)
+  @Max(1)
+  @IsOptional()
+  confidenceLevel?: number = 0.95;
+
+  @IsArray()
+  @IsString({ each: true })
+  @IsOptional()
+  models?: string[];
+
+  @IsNumber()
+  @Min(1)
+  @Max(1000)
+  @IsOptional()
+  ensembleSize?: number = 10;
+}
+
+export class HistoricalDataQueryDto {
+  @IsString()
+  marketType: string;
+
+  @IsDateString()
+  startDate: string;
+
+  @IsDateString()
+  endDate: string;
+
+  @IsNumber()
+  @Min(1)
+  @Max(10000)
+  @IsOptional()
+  limit?: number = 1000;
+}
+
+export class EnsembleConfigDto {
+  @IsArray()
+  @IsString({ each: true })
+  models: string[];
+
+  @IsArray()
+  @Type(() => Number)
+  weights?: number[];
+
+  @IsNumber()
+  @Min(0.1)
+  @Max(1.0)
+  @IsOptional()
+  diversityThreshold?: number = 0.7;
+
+  @IsString()
+  @IsOptional()
+  @IsEnum(['weighted', 'majority', 'ranked'])
+  votingMethod?: string = 'weighted';
+}
+
+export class WeatherIntegrationDto {
+  @IsString()
+  location: string;
+
+  @IsDateString()
+  startDate: string;
+
+  @IsDateString()
+  endDate: string;
+
+  @IsArray()
+  @IsString({ each: true })
+  @IsOptional()
+  parameters?: string[] = [
+    'temperature',
+    'humidity',
+    'windSpeed',
+    'precipitation',
+  ];
+}
+
+export class EconomicIndicatorDto {
+  @IsArray()
+  @IsString({ each: true })
+  indicators: string[];
+
+  @IsDateString()
+  startDate: string;
+
+  @IsDateString()
+  endDate: string;
+
+  @IsString()
+  @IsOptional()
+  region?: string = 'global';
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/dto/index.html b/coverage/lcov-report/src/forecasting/dto/index.html new file mode 100644 index 0000000..ecb73df --- /dev/null +++ b/coverage/lcov-report/src/forecasting/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/forecasting/dto + + + + + + + + + +
+
+

All files src/forecasting/dto

+
+ +
+ 0% + Statements + 0/120 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/120 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
forecast-query.dto.ts +
+
0%0/1200%0/10%0/10%0/120
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/ensemble/ensemble-methods.service.ts.html b/coverage/lcov-report/src/forecasting/ensemble/ensemble-methods.service.ts.html new file mode 100644 index 0000000..e763cc5 --- /dev/null +++ b/coverage/lcov-report/src/forecasting/ensemble/ensemble-methods.service.ts.html @@ -0,0 +1,3508 @@ + + + + + + Code coverage report for src/forecasting/ensemble/ensemble-methods.service.ts + + + + + + + + + +
+
+

All files / src/forecasting/ensemble ensemble-methods.service.ts

+
+ +
+ 63.54% + Statements + 725/1141 +
+ + +
+ 82.11% + Branches + 101/123 +
+ + +
+ 61.36% + Functions + 27/44 +
+ + +
+ 63.54% + Lines + 725/1141 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +11421x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +1x +1x +1x +1x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +1x +1x +1x +14x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +  +2x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +  +2x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +  +  +  +2x +1x +1x +24x +24x +24x +24x +24x +24x +24x +24x +24x +36x +36x +36x +36x +36x +16x +16x +16x +16x +12x +36x +8x +8x +8x +8x +8x +5x +36x +8x +5x +36x +2x +2x +2x +2x +2x +36x +2x +2x +36x +24x +24x +36x +  +  +  +  +  +  +24x +24x +36x +10x +10x +10x +10x +10x +36x +24x +24x +24x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +13x +13x +13x +13x +1x +1x +1x +3x +1x +1x +1x +12x +12x +12x +12x +12x +12x +19x +12x +12x +12x +12x +1x +1x +13x +13x +13x +13x +13x +13x +11x +13x +1x +13x +1x +13x +  +13x +13x +1x +1x +11x +11x +11x +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +11x +11x +11x +11x +11x +16x +16x +16x +16x +11x +11x +11x +  +  +  +  +  +  +  +  +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +17x +8x +8x +8x +8x +8x +8x +8x +8x +1x +1x +13x +13x +13x +13x +  +  +13x +13x +13x +13x +13x +13x +13x +  +  +13x +13x +13x +13x +13x +13x +1x +1x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +1x +1x +16x +8x +8x +8x +8x +8x +8x +8x +8x +1x +1x +15x +15x +15x +1x +1x +47x +46x +46x +46x +46x +46x +46x +46x +46x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +10x +10x +10x +10x +10x +10x +10x +10x +10x +2x +2x +2x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +2x +2x +10x +2x +2x +2x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +2x +2x +2x +2x +2x +1x +1x +8x +8x +40x +40x +40x +8x +8x +8x +8x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +2x +2x +2x +2x +8x +2x +2x +2x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +2x +2x +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import {
+  TimeSeriesService,
+  ForecastResult,
+  TimeSeriesData,
+} from '../models/time-series.service';
+import { WeatherData } from '../integrations/weather-data.service';
+import { EconomicData } from '../analysis/economic-indicator.service';
+import { ForecastHorizon } from '../entities/forecast-data.entity';
+ 
+export interface EnsembleConfig {
+  models: string[];
+  weights?: number[];
+  diversityThreshold?: number;
+  votingMethod?: 'weighted' | 'majority' | 'ranked';
+  errorReductionMethod?: 'bagging' | 'boosting' | 'stacking';
+}
+ 
+export interface EnsembleResult {
+  forecast: ForecastResult;
+  individualForecasts: ForecastResult[];
+  ensembleWeights: Record<string, number>;
+  diversity: number;
+  errorReduction: number;
+  confidence: number;
+  metadata: {
+    method: string;
+    modelCount: number;
+    agreement: number;
+    variance: number;
+  };
+}
+ 
+export interface ModelPerformance {
+  model: string;
+  accuracy: number;
+  mae: number;
+  rmse: number;
+  mape: number;
+  bias: number;
+  variance: number;
+  consistency: number;
+}
+ 
+@Injectable()
+export class EnsembleMethodsService {
+  private readonly logger = new Logger(EnsembleMethodsService.name);
+ 
+  constructor(private readonly timeSeriesService: TimeSeriesService) {}
+ 
+  async createEnsembleForecast(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+    config: EnsembleConfig,
+    weatherData?: WeatherData[],
+    economicData?: EconomicData[],
+  ): Promise<EnsembleResult> {
+    try {
+      // Generate individual forecasts
+      const individualForecasts = await this.generateIndividualForecasts(
+        data,
+        horizon,
+        config.models,
+        weatherData,
+        economicData,
+      );
+ 
+      if (individualForecasts.length === 0) {
+        throw new Error(
+          'No forecasts could be generated for ensemble processing',
+        );
+      }
+ 
+      // Calculate model weights based on performance
+      const weights = await this.calculateOptimalWeights(
+        individualForecasts,
+        config,
+      );
+ 
+      // Apply ensemble method
+      const ensembleForecast = this.applyEnsembleMethod(
+        individualForecasts,
+        weights,
+        config.votingMethod || 'weighted',
+      );
+ 
+      // Calculate ensemble metrics
+      const diversity = this.calculateDiversity(individualForecasts);
+      const errorReduction = this.calculateErrorReduction(
+        individualForecasts,
+        ensembleForecast,
+      );
+      const confidence = this.calculateEnsembleConfidence(
+        individualForecasts,
+        weights,
+      );
+ 
+      return {
+        forecast: ensembleForecast,
+        individualForecasts,
+        ensembleWeights: weights,
+        diversity,
+        errorReduction,
+        confidence,
+        metadata: {
+          method: config.votingMethod || 'weighted',
+          modelCount: config.models.length,
+          agreement: this.calculateAgreement(individualForecasts),
+          variance: this.calculateForecastVariance(individualForecasts),
+        },
+      };
+    } catch (error) {
+      this.logger.error('Failed to create ensemble forecast', error);
+      throw error;
+    }
+  }
+ 
+  async optimizeEnsemble(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+    candidateModels: string[],
+    validationSplit: number = 0.2,
+  ): Promise<EnsembleConfig> {
+    try {
+      // Split data for validation
+      const trainSize = Math.floor(data.length * (1 - validationSplit));
+      const trainData = data.slice(0, trainSize);
+      const validationData = data.slice(trainSize);
+ 
+      // Evaluate all candidate models
+      const modelPerformances = await this.evaluateModels(
+        trainData,
+        validationData,
+        horizon,
+        candidateModels,
+      );
+ 
+      // Select best performing models
+      const selectedModels = this.selectBestModels(modelPerformances, 5); // Top 5 models
+ 
+      // Calculate optimal weights
+      const weights = this.calculateWeightsFromPerformance(
+        modelPerformances.filter((p) => selectedModels.includes(p.model)),
+      );
+ 
+      return {
+        models: selectedModels,
+        weights,
+        diversityThreshold: 0.7,
+        votingMethod: 'weighted',
+        errorReductionMethod: 'bagging',
+      };
+    } catch (error) {
+      this.logger.error('Failed to optimize ensemble', error);
+      throw error;
+    }
+  }
+ 
+  async baggingEnsemble(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+    models: string[],
+    numBootstrap: number = 10,
+  ): Promise<EnsembleResult> {
+    try {
+      const bootstrapForecasts: ForecastResult[] = [];
+ 
+      for (let i = 0; i < numBootstrap; i++) {
+        // Create bootstrap sample
+        const bootstrapData = this.createBootstrapSample(data);
+ 
+        // Generate forecasts for bootstrap sample
+        const bootstrapResult = await this.createEnsembleForecast(
+          bootstrapData,
+          horizon,
+          { models, votingMethod: 'weighted' },
+        );
+ 
+        bootstrapForecasts.push(bootstrapResult.forecast);
+      }
+ 
+      // Aggregate bootstrap forecasts
+      const aggregatedForecast =
+        this.aggregateBootstrapForecasts(bootstrapForecasts);
+ 
+      return {
+        forecast: aggregatedForecast,
+        individualForecasts: bootstrapForecasts,
+        ensembleWeights: this.calculateBootstrapWeights(bootstrapForecasts),
+        diversity: this.calculateDiversity(bootstrapForecasts),
+        errorReduction:
+          this.calculateBootstrapErrorReduction(bootstrapForecasts),
+        confidence: this.calculateBootstrapConfidence(bootstrapForecasts),
+        metadata: {
+          method: 'bagging',
+          modelCount: numBootstrap,
+          agreement: this.calculateAgreement(bootstrapForecasts),
+          variance: this.calculateForecastVariance(bootstrapForecasts),
+        },
+      };
+    } catch (error) {
+      this.logger.error('Failed to create bagging ensemble', error);
+      throw error;
+    }
+  }
+ 
+  async boostingEnsemble(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+    models: string[],
+    numIterations: number = 10,
+  ): Promise<EnsembleResult> {
+    try {
+      let currentData = [...data];
+      const boostedForecasts: ForecastResult[] = [];
+      const modelWeights: number[] = [];
+
+      for (let i = 0; i < numIterations; i++) {
+        // Train model on current data
+        const iterationResult = await this.createEnsembleForecast(
+          currentData,
+          horizon,
+          { models, votingMethod: 'weighted' },
+        );
+
+        // Calculate residuals
+        const residuals = this.calculateResiduals(
+          currentData,
+          iterationResult.forecast,
+        );
+
+        // Update data weights based on residuals
+        currentData = this.updateDataWeights(currentData, residuals);
+
+        boostedForecasts.push(iterationResult.forecast);
+        modelWeights.push(iterationResult.forecast.accuracy);
+      }
+
+      // Create final boosted forecast
+      const finalForecast = this.createBoostedForecast(
+        boostedForecasts,
+        modelWeights,
+      );
+
+      return {
+        forecast: finalForecast,
+        individualForecasts: boostedForecasts,
+        ensembleWeights: this.createWeightMap(models, modelWeights),
+        diversity: this.calculateDiversity(boostedForecasts),
+        errorReduction: this.calculateBoostingErrorReduction(boostedForecasts),
+        confidence: this.calculateBoostingConfidence(
+          boostedForecasts,
+          modelWeights,
+        ),
+        metadata: {
+          method: 'boosting',
+          modelCount: numIterations,
+          agreement: this.calculateAgreement(boostedForecasts),
+          variance: this.calculateForecastVariance(boostedForecasts),
+        },
+      };
+    } catch (error) {
+      this.logger.error('Failed to create boosting ensemble', error);
+      throw error;
+    }
+  }
+ 
+  async stackingEnsemble(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+    baseModels: string[],
+    metaModel: string = 'linear',
+  ): Promise<EnsembleResult> {
+    try {
+      // Split data for meta-learning
+      const folds = this.createCrossValidationFolds(data, 5);
+      const metaFeatures: number[][] = [];
+      const metaTargets: number[] = [];
+
+      // Generate out-of-sample predictions for meta-learning
+      for (const fold of folds) {
+        const trainData = fold.train;
+        const testData = fold.test;
+
+        const baseForecasts = await this.generateIndividualForecasts(
+          trainData,
+          horizon,
+          baseModels,
+        );
+
+        // Use base models to predict on test data
+        const testForecasts = await this.generateIndividualForecasts(
+          testData,
+          horizon,
+          baseModels,
+        );
+
+        // Store predictions as meta-features
+        const features = testForecasts.map((f) => f.predictedValue);
+        metaFeatures.push(...features.map((f) => [f])); // Simplified for single value
+        metaTargets.push(...testData.map((d) => d.value));
+      }
+
+      // Train meta-model
+      const metaModelWeights = this.trainMetaModel(
+        metaFeatures,
+        metaTargets,
+        metaModel,
+      );
+
+      // Generate final ensemble forecast
+      const finalBaseForecasts = await this.generateIndividualForecasts(
+        data,
+        horizon,
+        baseModels,
+      );
+      const finalForecast = this.applyMetaModel(
+        finalBaseForecasts,
+        metaModelWeights,
+        horizon,
+      );
+
+      return {
+        forecast: finalForecast,
+        individualForecasts: finalBaseForecasts,
+        ensembleWeights: this.createWeightMap(baseModels, metaModelWeights),
+        diversity: this.calculateDiversity(finalBaseForecasts),
+        errorReduction: this.calculateStackingErrorReduction(
+          finalBaseForecasts,
+          finalForecast,
+        ),
+        confidence: this.calculateStackingConfidence(
+          finalBaseForecasts,
+          metaModelWeights,
+        ),
+        metadata: {
+          method: 'stacking',
+          modelCount: baseModels.length,
+          agreement: this.calculateAgreement(finalBaseForecasts),
+          variance: this.calculateForecastVariance(finalBaseForecasts),
+        },
+      };
+    } catch (error) {
+      this.logger.error('Failed to create stacking ensemble', error);
+      throw error;
+    }
+  }
+ 
+  async evaluateEnsemblePerformance(
+    ensembleResults: EnsembleResult[],
+    actualData: TimeSeriesData[],
+  ): Promise<{
+    overallAccuracy: number;
+    errorReduction: number;
+    consistency: number;
+    reliability: number;
+  }> {
+    try {
+      if (ensembleResults.length === 0) {
+        return {
+          overallAccuracy: 0,
+          errorReduction: 0,
+          consistency: 0,
+          reliability: 0,
+        };
+      }
+ 
+      const accuracies = ensembleResults.map(
+        (result) => result.forecast.accuracy,
+      );
+      const errorReductions = ensembleResults.map(
+        (result) => result.errorReduction,
+      );
+      const confidences = ensembleResults.map((result) => result.confidence);
+ 
+      const overallAccuracy =
+        accuracies.reduce((sum, acc) => sum + acc, 0) / accuracies.length;
+      const averageErrorReduction =
+        errorReductions.reduce((sum, red) => sum + red, 0) /
+        errorReductions.length;
+      const averageConfidence =
+        confidences.reduce((sum, conf) => sum + conf, 0) / confidences.length;
+ 
+      // Calculate consistency (variance in performance)
+      const consistency =
+        1 - this.calculateVariance(accuracies) / Math.pow(overallAccuracy, 2);
+ 
+      // Calculate reliability (confidence vs actual accuracy)
+      const reliability = this.calculateReliability(
+        ensembleResults,
+        actualData,
+      );
+ 
+      return {
+        overallAccuracy,
+        errorReduction: averageErrorReduction,
+        consistency,
+        reliability,
+      };
+    } catch (error) {
+      this.logger.error('Failed to evaluate ensemble performance', error);
+      throw error;
+    }
+  }
+ 
+  private async generateIndividualForecasts(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+    models: string[],
+    weatherData?: WeatherData[],
+    economicData?: EconomicData[],
+  ): Promise<ForecastResult[]> {
+    const forecasts: ForecastResult[] = [];
+ 
+    for (const model of models) {
+      try {
+        let forecast: ForecastResult;
+ 
+        switch (model) {
+          case 'ARIMA':
+            forecast = await this.timeSeriesService.arimaForecast(
+              data,
+              horizon,
+            );
+            break;
+          case 'ExponentialSmoothing':
+            forecast =
+              await this.timeSeriesService.exponentialSmoothingForecast(
+                data,
+                horizon,
+              );
+            break;
+          case 'LSTM':
+            forecast = await this.timeSeriesService.lstmForecast(data, horizon);
+            break;
+          case 'Prophet':
+            forecast = await this.timeSeriesService.prophetForecast(
+              data,
+              horizon,
+            );
+            break;
+          default:
+            this.logger.warn(`Unknown model: ${model}, skipping`);
+            continue;
+        }
+ 
+        // Enhance forecast with external data if available
+        if (weatherData || economicData) {
+          forecast = this.enhanceForecastWithExternalData(
+            forecast,
+            weatherData,
+            economicData,
+          );
+        }
+ 
+        forecasts.push(forecast);
+      } catch (error) {
+        this.logger.error(
+          `Failed to generate forecast with model ${model}`,
+          error,
+        );
+      }
+    }
+ 
+    return forecasts;
+  }
+ 
+  private enhanceForecastWithExternalData(
+    forecast: ForecastResult,
+    weatherData?: WeatherData[],
+    economicData?: EconomicData[],
+  ): ForecastResult {
+    let adjustment = 0;
+
+    if (weatherData) {
+      // Calculate weather impact
+      const recentWeather = weatherData.slice(-7);
+      const avgTemp =
+        recentWeather.reduce((sum, d) => sum + d.temperature, 0) /
+        recentWeather.length;
+      const tempImpact = (avgTemp - 20) * 0.01; // 20°C as baseline
+      adjustment += tempImpact;
+    }
+
+    if (economicData) {
+      // Calculate economic impact
+      const latestEconomic = economicData[economicData.length - 1];
+      const gdpImpact = ((latestEconomic.gdp - 20000) / 20000) * 0.1; // 20T as baseline
+      adjustment += gdpImpact;
+    }
+
+    return {
+      ...forecast,
+      predictedValue: forecast.predictedValue * (1 + adjustment),
+      accuracy: Math.max(
+        0.5,
+        forecast.accuracy * (1 - Math.abs(adjustment) * 0.1),
+      ),
+    };
+  }
+ 
+  private async calculateOptimalWeights(
+    forecasts: ForecastResult[],
+    config: EnsembleConfig,
+  ): Promise<Record<string, number>> {
+    if (config.weights && config.weights.length === forecasts.length) {
+      // Use provided weights
+      const weights: Record<string, number> = {};
+      forecasts.forEach((forecast, i) => {
+        weights[forecast.model] = config.weights[i];
+      });
+      return weights;
+    }
+ 
+    // Calculate weights based on accuracy
+    const totalAccuracy = forecasts.reduce((sum, f) => sum + f.accuracy, 0);
+    const weights: Record<string, number> = {};
+ 
+    forecasts.forEach((forecast) => {
+      weights[forecast.model] = forecast.accuracy / totalAccuracy;
+    });
+ 
+    return weights;
+  }
+ 
+  private applyEnsembleMethod(
+    forecasts: ForecastResult[],
+    weights: Record<string, number>,
+    method: string,
+  ): ForecastResult {
+    switch (method) {
+      case 'weighted':
+        return this.weightedAverage(forecasts, weights);
+      case 'majority':
+        return this.majorityVoting(forecasts);
+      case 'ranked':
+        return this.rankedVoting(forecasts);
+      default:
+        return this.weightedAverage(forecasts, weights);
+    }
+  }
+ 
+  private weightedAverage(
+    forecasts: ForecastResult[],
+    weights: Record<string, number>,
+  ): ForecastResult {
+    if (forecasts.length === 0) {
+      return {
+        predictedValue: 0,
+        confidenceInterval: { lower: 0, upper: 0 },
+        accuracy: 0,
+        model: 'Ensemble',
+        horizon: ForecastHorizon.ONE_HOUR,
+        metadata: {
+          method: 'weighted_average',
+          modelCount: 0,
+          variance: 0,
+        },
+      };
+    }
+ 
+    let weightedValue = 0;
+    let weightedAccuracy = 0;
+    let totalWeight = 0;
+ 
+    forecasts.forEach((forecast) => {
+      const weight = weights[forecast.model] || 0;
+      weightedValue += forecast.predictedValue * weight;
+      weightedAccuracy += forecast.accuracy * weight;
+      totalWeight += weight;
+    });
+ 
+    if (totalWeight === 0) {
+      // Fallback to simple average
+      weightedValue =
+        forecasts.reduce((sum, f) => sum + f.predictedValue, 0) /
+        forecasts.length;
+      weightedAccuracy =
+        forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+      totalWeight = 1;
+    }
+ 
+    const ensembleValue = weightedValue / totalWeight;
+    const ensembleAccuracy = weightedAccuracy / totalWeight;
+ 
+    // Calculate ensemble confidence intervals
+    const values = forecasts.map((f) => f.predictedValue);
+    const variance = this.calculateVariance(values);
+    const stdDev = Math.sqrt(variance);
+ 
+    return {
+      predictedValue: ensembleValue,
+      confidenceInterval: {
+        lower: ensembleValue - 1.96 * stdDev,
+        upper: ensembleValue + 1.96 * stdDev,
+      },
+      accuracy: ensembleAccuracy,
+      model: 'Ensemble',
+      horizon: forecasts[0].horizon,
+      metadata: {
+        method: 'weighted_average',
+        modelCount: forecasts.length,
+        variance,
+      },
+    };
+  }
+ 
+  private majorityVoting(forecasts: ForecastResult[]): ForecastResult {
+    if (forecasts.length === 0) {
+      return {
+        predictedValue: 0,
+        confidenceInterval: { lower: 0, upper: 0 },
+        accuracy: 0,
+        model: 'Ensemble-Majority',
+        horizon: ForecastHorizon.ONE_HOUR,
+      };
+    }
+ 
+    // Sort forecasts by predicted value
+    const sortedForecasts = [...forecasts].sort(
+      (a, b) => a.predictedValue - b.predictedValue,
+    );
+ 
+    // Take median as majority vote
+    const medianIndex = Math.floor(sortedForecasts.length / 2);
+    const medianForecast = sortedForecasts[medianIndex];
+ 
+    // Calculate average accuracy
+    const avgAccuracy =
+      forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+ 
+    return {
+      ...medianForecast,
+      accuracy: avgAccuracy,
+      model: 'Ensemble-Majority',
+      metadata: {
+        method: 'majority_voting',
+        modelCount: forecasts.length,
+      },
+    };
+  }
+ 
+  private rankedVoting(forecasts: ForecastResult[]): ForecastResult {
+    if (forecasts.length === 0) {
+      return {
+        predictedValue: 0,
+        confidenceInterval: { lower: 0, upper: 0 },
+        accuracy: 0,
+        model: 'Ensemble-Ranked',
+        horizon: ForecastHorizon.ONE_HOUR,
+      };
+    }
+ 
+    // Rank models by accuracy
+    const rankedForecasts = [...forecasts].sort(
+      (a, b) => b.accuracy - a.accuracy,
+    );
+ 
+    // Weight by rank (higher accuracy gets more weight)
+    let weightedValue = 0;
+    let totalWeight = 0;
+ 
+    rankedForecasts.forEach((forecast, index) => {
+      const weight = 1 / (index + 1); // Inverse rank weighting
+      weightedValue += forecast.predictedValue * weight;
+      totalWeight += weight;
+    });
+ 
+    const ensembleValue = weightedValue / totalWeight;
+    const avgAccuracy =
+      forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+ 
+    return {
+      predictedValue: ensembleValue,
+      confidenceInterval: {
+        lower: ensembleValue * 0.95,
+        upper: ensembleValue * 1.05,
+      },
+      accuracy: avgAccuracy,
+      model: 'Ensemble-Ranked',
+      horizon: forecasts[0].horizon,
+      metadata: {
+        method: 'ranked_voting',
+        modelCount: forecasts.length,
+      },
+    };
+  }
+ 
+  private calculateDiversity(forecasts: ForecastResult[]): number {
+    if (forecasts.length < 2) return 0;
+ 
+    const values = forecasts.map((f) => f.predictedValue);
+    const variance = this.calculateVariance(values);
+    const mean = values.reduce((sum, val) => sum + val, 0) / values.length;
+ 
+    // Diversity as coefficient of variation
+    return Math.sqrt(variance) / mean;
+  }
+ 
+  private calculateErrorReduction(
+    individualForecasts: ForecastResult[],
+    ensembleForecast: ForecastResult,
+  ): number {
+    if (individualForecasts.length === 0) {
+      return 0;
+    }
+ 
+    const avgIndividualError =
+      individualForecasts.reduce((sum, f) => sum + (1 - f.accuracy), 0) /
+      individualForecasts.length;
+    const ensembleError = 1 - ensembleForecast.accuracy;
+ 
+    if (avgIndividualError <= 0) {
+      return 0;
+    }
+ 
+    return Math.max(
+      0,
+      (avgIndividualError - ensembleError) / avgIndividualError,
+    );
+  }
+ 
+  private calculateEnsembleConfidence(
+    forecasts: ForecastResult[],
+    weights: Record<string, number>,
+  ): number {
+    const weightedAccuracy = forecasts.reduce(
+      (sum, f) => sum + f.accuracy * (weights[f.model] || 0),
+      0,
+    );
+    const totalWeight = Object.values(weights).reduce((sum, w) => sum + w, 0);
+ 
+    return totalWeight > 0 ? weightedAccuracy / totalWeight : 0.5;
+  }
+ 
+  private calculateAgreement(forecasts: ForecastResult[]): number {
+    if (forecasts.length < 2) return 1;
+ 
+    const values = forecasts.map((f) => f.predictedValue);
+    const mean = values.reduce((sum, val) => sum + val, 0) / values.length;
+    const variance = this.calculateVariance(values);
+ 
+    // Agreement as inverse of normalized variance
+    return Math.max(0, 1 - variance / (mean * mean));
+  }
+ 
+  private calculateForecastVariance(forecasts: ForecastResult[]): number {
+    const values = forecasts.map((f) => f.predictedValue);
+    return this.calculateVariance(values);
+  }
+ 
+  private calculateVariance(values: number[]): number {
+    if (values.length === 0) return 0;
+ 
+    const mean = values.reduce((sum, val) => sum + val, 0) / values.length;
+    const variance =
+      values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) /
+      values.length;
+ 
+    return variance;
+  }
+ 
+  private async evaluateModels(
+    trainData: TimeSeriesData[],
+    validationData: TimeSeriesData[],
+    horizon: ForecastHorizon,
+    models: string[],
+  ): Promise<ModelPerformance[]> {
+    const performances: ModelPerformance[] = [];
+ 
+    for (const model of models) {
+      try {
+        // Generate forecast on training data
+        const forecast = await this.generateIndividualForecasts(
+          trainData,
+          horizon,
+          [model],
+        );
+ 
+        if (forecast.length === 0) continue;
+ 
+        // Calculate performance metrics
+        const predicted = forecast[0].predictedValue;
+        const actual = validationData[validationData.length - 1]?.value || 0;
+ 
+        const accuracy = forecast[0].accuracy;
+        const error = Math.abs(predicted - actual);
+        const mae = error;
+        const rmse = Math.sqrt(error * error);
+        const mape = actual !== 0 ? (error / actual) * 100 : 0;
+        const bias = predicted - actual;
+        const variance = this.calculateVariance(
+          validationData.map((d) => d.value),
+        );
+        const consistency = 1 - Math.abs(bias) / actual;
+ 
+        performances.push({
+          model,
+          accuracy,
+          mae,
+          rmse,
+          mape,
+          bias,
+          variance,
+          consistency,
+        });
+      } catch (error) {
+        this.logger.error(`Failed to evaluate model ${model}`, error);
+      }
+    }
+ 
+    return performances;
+  }
+ 
+  private selectBestModels(
+    performances: ModelPerformance[],
+    count: number,
+  ): string[] {
+    return performances
+      .sort((a, b) => b.accuracy - a.accuracy)
+      .slice(0, count)
+      .map((p) => p.model);
+  }
+ 
+  private calculateWeightsFromPerformance(
+    performances: ModelPerformance[],
+  ): number[] {
+    const totalAccuracy = performances.reduce((sum, p) => sum + p.accuracy, 0);
+    return performances.map((p) => p.accuracy / totalAccuracy);
+  }
+ 
+  private createBootstrapSample(data: TimeSeriesData[]): TimeSeriesData[] {
+    const bootstrapData: TimeSeriesData[] = [];
+    for (let i = 0; i < data.length; i++) {
+      const randomIndex = Math.floor(Math.random() * data.length);
+      bootstrapData.push(data[randomIndex]);
+    }
+    return bootstrapData.sort(
+      (a, b) => a.timestamp.getTime() - b.timestamp.getTime(),
+    );
+  }
+ 
+  private aggregateBootstrapForecasts(
+    forecasts: ForecastResult[],
+  ): ForecastResult {
+    const values = forecasts.map((f) => f.predictedValue);
+    const mean = values.reduce((sum, val) => sum + val, 0) / values.length;
+    const variance = this.calculateVariance(values);
+    const avgAccuracy =
+      forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+ 
+    return {
+      predictedValue: mean,
+      confidenceInterval: {
+        lower: mean - 1.96 * Math.sqrt(variance),
+        upper: mean + 1.96 * Math.sqrt(variance),
+      },
+      accuracy: avgAccuracy,
+      model: 'Bootstrap-Ensemble',
+      horizon: forecasts[0].horizon,
+      metadata: {
+        method: 'bootstrap_aggregation',
+        variance,
+      },
+    };
+  }
+ 
+  private calculateBootstrapWeights(
+    forecasts: ForecastResult[],
+  ): Record<string, number> {
+    const weights: Record<string, number> = {};
+    forecasts.forEach((forecast, i) => {
+      weights[`bootstrap_${i}`] = 1 / forecasts.length;
+    });
+    return weights;
+  }
+ 
+  private calculateBootstrapErrorReduction(
+    forecasts: ForecastResult[],
+  ): number {
+    const avgIndividualAccuracy =
+      forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+    const ensembleAccuracy =
+      forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+ 
+    return Math.max(
+      0,
+      (ensembleAccuracy - avgIndividualAccuracy) / avgIndividualAccuracy,
+    );
+  }
+ 
+  private calculateBootstrapConfidence(forecasts: ForecastResult[]): number {
+    return forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+  }
+ 
+  private calculateResiduals(
+    data: TimeSeriesData[],
+    forecast: ForecastResult,
+  ): number[] {
+    return data.map((d) => d.value - forecast.predictedValue);
+  }
+ 
+  private updateDataWeights(
+    data: TimeSeriesData[],
+    residuals: number[],
+  ): TimeSeriesData[] {
+    // Increase weight for poorly predicted samples
+    const maxResidual = Math.max(...residuals.map(Math.abs));
+    return data.map((d, i) => ({
+      ...d,
+      value: d.value * (1 + (Math.abs(residuals[i]) / maxResidual) * 0.1),
+    }));
+  }
+ 
+  private createBoostedForecast(
+    forecasts: ForecastResult[],
+    weights: number[],
+  ): ForecastResult {
+    const weightedValue = forecasts.reduce(
+      (sum, f, i) => sum + f.predictedValue * weights[i],
+      0,
+    );
+    const totalWeight = weights.reduce((sum, w) => sum + w, 0);
+    const avgAccuracy =
+      forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+
+    return {
+      predictedValue: weightedValue / totalWeight,
+      confidenceInterval: {
+        lower: (weightedValue / totalWeight) * 0.95,
+        upper: (weightedValue / totalWeight) * 1.05,
+      },
+      accuracy: avgAccuracy,
+      model: 'Boosted-Ensemble',
+      horizon: forecasts[0].horizon,
+      metadata: {
+        method: 'boosting',
+        iterations: forecasts.length,
+      },
+    };
+  }
+ 
+  private createWeightMap(
+    models: string[],
+    weights: number[],
+  ): Record<string, number> {
+    const weightMap: Record<string, number> = {};
+    models.forEach((model, i) => {
+      weightMap[model] = weights[i] || 0;
+    });
+    return weightMap;
+  }
+ 
+  private calculateBoostingErrorReduction(forecasts: ForecastResult[]): number {
+    if (forecasts.length < 2) return 0;
+
+    const firstAccuracy = forecasts[0].accuracy;
+    const lastAccuracy = forecasts[forecasts.length - 1].accuracy;
+
+    return Math.max(0, (lastAccuracy - firstAccuracy) / firstAccuracy);
+  }
+ 
+  private calculateBoostingConfidence(
+    forecasts: ForecastResult[],
+    weights: number[],
+  ): number {
+    const weightedAccuracy = forecasts.reduce(
+      (sum, f, i) => sum + f.accuracy * weights[i],
+      0,
+    );
+    const totalWeight = weights.reduce((sum, w) => sum + w, 0);
+    return totalWeight > 0 ? weightedAccuracy / totalWeight : 0.5;
+  }
+ 
+  private createCrossValidationFolds(
+    data: TimeSeriesData[],
+    numFolds: number,
+  ): Array<{ train: TimeSeriesData[]; test: TimeSeriesData[] }> {
+    const folds: Array<{ train: TimeSeriesData[]; test: TimeSeriesData[] }> =
+      [];
+    const foldSize = Math.floor(data.length / numFolds);
+
+    for (let i = 0; i < numFolds; i++) {
+      const startIndex = i * foldSize;
+      const endIndex = i === numFolds - 1 ? data.length : (i + 1) * foldSize;
+
+      const test = data.slice(startIndex, endIndex);
+      const train = [...data.slice(0, startIndex), ...data.slice(endIndex)];
+
+      folds.push({ train, test });
+    }
+
+    return folds;
+  }
+ 
+  private trainMetaModel(
+    features: number[][],
+    targets: number[],
+    method: string,
+  ): number[] {
+    switch (method) {
+      case 'linear':
+        return this.trainLinearRegression(features, targets);
+      case 'ridge':
+        return this.trainRidgeRegression(features, targets);
+      case 'lasso':
+        return this.trainLassoRegression(features, targets);
+      default:
+        return this.trainLinearRegression(features, targets);
+    }
+  }
+ 
+  private trainLinearRegression(
+    features: number[][],
+    targets: number[],
+  ): number[] {
+    // Simplified linear regression
+    // In production, use proper ML library
+    const n = features.length;
+    if (n === 0) return [1];
+
+    const avgFeature = features.reduce((sum, f) => sum + f[0], 0) / n;
+    const avgTarget = targets.reduce((sum, t) => sum + t, 0) / n;
+
+    const numerator = features.reduce(
+      (sum, f, i) => sum + (f[0] - avgFeature) * (targets[i] - avgTarget),
+      0,
+    );
+    const denominator = features.reduce(
+      (sum, f) => sum + Math.pow(f[0] - avgFeature, 2),
+      0,
+    );
+
+    const slope = denominator !== 0 ? numerator / denominator : 0;
+    const intercept = avgTarget - slope * avgFeature;
+
+    return [slope, intercept];
+  }
+ 
+  private trainRidgeRegression(
+    features: number[][],
+    targets: number[],
+  ): number[] {
+    // Simplified ridge regression
+    const weights = this.trainLinearRegression(features, targets);
+    const alpha = 0.1;
+    return weights.map((w) => w / (1 + alpha));
+  }
+ 
+  private trainLassoRegression(
+    features: number[][],
+    targets: number[],
+  ): number[] {
+    // Simplified lasso regression
+    const weights = this.trainLinearRegression(features, targets);
+    const alpha = 0.1;
+    return weights.map((w) => Math.sign(w) * Math.max(0, Math.abs(w) - alpha));
+  }
+ 
+  private applyMetaModel(
+    forecasts: ForecastResult[],
+    weights: number[],
+    horizon: ForecastHorizon,
+  ): ForecastResult {
+    const features = forecasts.map((f) => f.predictedValue);
+    const prediction = weights[0] * features[0] + (weights[1] || 0);
+
+    const avgAccuracy =
+      forecasts.reduce((sum, f) => sum + f.accuracy, 0) / forecasts.length;
+
+    return {
+      predictedValue: prediction,
+      confidenceInterval: {
+        lower: prediction * 0.95,
+        upper: prediction * 1.05,
+      },
+      accuracy: avgAccuracy,
+      model: 'Stacking-Ensemble',
+      horizon,
+      metadata: {
+        method: 'stacking',
+        weights,
+      },
+    };
+  }
+ 
+  private calculateStackingErrorReduction(
+    baseForecasts: ForecastResult[],
+    metaForecast: ForecastResult,
+  ): number {
+    const avgBaseAccuracy =
+      baseForecasts.reduce((sum, f) => sum + f.accuracy, 0) /
+      baseForecasts.length;
+    return Math.max(
+      0,
+      (metaForecast.accuracy - avgBaseAccuracy) / avgBaseAccuracy,
+    );
+  }
+ 
+  private calculateStackingConfidence(
+    baseForecasts: ForecastResult[],
+    weights: number[],
+  ): number {
+    const avgBaseAccuracy =
+      baseForecasts.reduce((sum, f) => sum + f.accuracy, 0) /
+      baseForecasts.length;
+    const weightMagnitude = Math.sqrt(
+      weights.reduce((sum, w) => sum + w * w, 0),
+    );
+    return avgBaseAccuracy * (1 + weightMagnitude * 0.1);
+  }
+ 
+  private calculateReliability(
+    ensembleResults: EnsembleResult[],
+    actualData: TimeSeriesData[],
+  ): number {
+    // Calculate correlation between confidence and actual accuracy
+    const confidences = ensembleResults.map((r) => r.confidence);
+    const accuracies = ensembleResults.map((r) => r.forecast.accuracy);
+ 
+    return this.calculateCorrelation(confidences, accuracies);
+  }
+ 
+  private calculateCorrelation(x: number[], y: number[]): number {
+    if (x.length !== y.length || x.length === 0) return 0;
+ 
+    const n = x.length;
+    const sumX = x.reduce((sum, val) => sum + val, 0);
+    const sumY = y.reduce((sum, val) => sum + val, 0);
+    const sumXY = x.reduce((sum, val, i) => sum + val * y[i], 0);
+    const sumX2 = x.reduce((sum, val) => sum + val * val, 0);
+    const sumY2 = y.reduce((sum, val) => sum + val * val, 0);
+ 
+    const numerator = n * sumXY - sumX * sumY;
+    const denominator = Math.sqrt(
+      (n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY),
+    );
+ 
+    return denominator === 0 ? 0 : numerator / denominator;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/ensemble/index.html b/coverage/lcov-report/src/forecasting/ensemble/index.html new file mode 100644 index 0000000..0166695 --- /dev/null +++ b/coverage/lcov-report/src/forecasting/ensemble/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/forecasting/ensemble + + + + + + + + + +
+
+

All files src/forecasting/ensemble

+
+ +
+ 63.54% + Statements + 725/1141 +
+ + +
+ 82.11% + Branches + 101/123 +
+ + +
+ 61.36% + Functions + 27/44 +
+ + +
+ 63.54% + Lines + 725/1141 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ensemble-methods.service.ts +
+
63.54%725/114182.11%101/12361.36%27/4463.54%725/1141
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/entities/forecast-data.entity.ts.html b/coverage/lcov-report/src/forecasting/entities/forecast-data.entity.ts.html new file mode 100644 index 0000000..1c1913b --- /dev/null +++ b/coverage/lcov-report/src/forecasting/entities/forecast-data.entity.ts.html @@ -0,0 +1,313 @@ + + + + + + Code coverage report for src/forecasting/entities/forecast-data.entity.ts + + + + + + + + + +
+
+

All files / src/forecasting/entities forecast-data.entity.ts

+
+ +
+ 100% + Statements + 76/76 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 76/76 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +771x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+ 
+export enum ForecastHorizon {
+  ONE_HOUR = '1h',
+  SIX_HOURS = '6h',
+  TWENTY_FOUR_HOURS = '24h',
+  ONE_WEEK = '1w',
+  ONE_MONTH = '1m',
+  THREE_MONTHS = '3m',
+  SIX_MONTHS = '6m',
+  ONE_YEAR = '1y',
+}
+ 
+export enum ForecastStatus {
+  PENDING = 'pending',
+  PROCESSING = 'processing',
+  COMPLETED = 'completed',
+  FAILED = 'failed',
+}
+ 
+@Entity('forecast_data')
+@Index(['marketType', 'forecastHorizon', 'createdAt'])
+export class ForecastData {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+ 
+  @Column({ type: 'varchar', length: 50 })
+  marketType: string;
+ 
+  @Column({ type: 'enum', enum: ForecastHorizon })
+  forecastHorizon: ForecastHorizon;
+ 
+  @Column({ type: 'decimal', precision: 10, scale: 2 })
+  predictedValue: number;
+ 
+  @Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
+  confidenceIntervalLower: number;
+ 
+  @Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
+  confidenceIntervalUpper: number;
+ 
+  @Column({ type: 'decimal', precision: 5, scale: 2 })
+  accuracy: number;
+ 
+  @Column({ type: 'json', nullable: true })
+  modelWeights: Record<string, number>;
+ 
+  @Column({ type: 'json', nullable: true })
+  inputData: Record<string, any>;
+ 
+  @Column({
+    type: 'enum',
+    enum: ForecastStatus,
+    default: ForecastStatus.PENDING,
+  })
+  status: ForecastStatus;
+ 
+  @Column({ type: 'text', nullable: true })
+  errorMessage: string;
+ 
+  @Column({ type: 'timestamp', nullable: true })
+  targetDate: Date;
+ 
+  @CreateDateColumn()
+  createdAt: Date;
+ 
+  @UpdateDateColumn()
+  updatedAt: Date;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/entities/index.html b/coverage/lcov-report/src/forecasting/entities/index.html new file mode 100644 index 0000000..6de45db --- /dev/null +++ b/coverage/lcov-report/src/forecasting/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/forecasting/entities + + + + + + + + + +
+
+

All files src/forecasting/entities

+
+ +
+ 100% + Statements + 76/76 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 76/76 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
forecast-data.entity.ts +
+
100%76/76100%2/2100%0/0100%76/76
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/index.html b/coverage/lcov-report/src/forecasting/index.html new file mode 100644 index 0000000..c95b0ea --- /dev/null +++ b/coverage/lcov-report/src/forecasting/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/forecasting + + + + + + + + + +
+
+

All files src/forecasting

+
+ +
+ 0% + Statements + 0/628 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/628 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
market-forecasting.controller.ts +
+
0%0/5920%0/10%0/10%0/592
market-forecasting.module.ts +
+
0%0/360%0/10%0/10%0/36
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/integrations/index.html b/coverage/lcov-report/src/forecasting/integrations/index.html new file mode 100644 index 0000000..4dcf9a2 --- /dev/null +++ b/coverage/lcov-report/src/forecasting/integrations/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/forecasting/integrations + + + + + + + + + +
+
+

All files src/forecasting/integrations

+
+ +
+ 0% + Statements + 0/402 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/402 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
weather-data.service.ts +
+
0%0/4020%0/10%0/10%0/402
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/integrations/weather-data.service.ts.html b/coverage/lcov-report/src/forecasting/integrations/weather-data.service.ts.html new file mode 100644 index 0000000..333f3e9 --- /dev/null +++ b/coverage/lcov-report/src/forecasting/integrations/weather-data.service.ts.html @@ -0,0 +1,1291 @@ + + + + + + Code coverage report for src/forecasting/integrations/weather-data.service.ts + + + + + + + + + +
+
+

All files / src/forecasting/integrations weather-data.service.ts

+
+ +
+ 0% + Statements + 0/402 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/402 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { HttpService } from '@nestjs/axios';
+import { firstValueFrom } from 'rxjs';
+
+export interface WeatherData {
+  timestamp: Date;
+  temperature: number;
+  humidity: number;
+  windSpeed: number;
+  windDirection: number;
+  precipitation: number;
+  pressure: number;
+  visibility: number;
+  cloudCover: number;
+  uvIndex: number;
+  location: string;
+}
+
+export interface WeatherForecast {
+  timestamp: Date;
+  temperature: {
+    current: number;
+    min: number;
+    max: number;
+  };
+  humidity: number;
+  windSpeed: number;
+  windDirection: number;
+  precipitation: {
+    probability: number;
+    amount: number;
+  };
+  pressure: number;
+  cloudCover: number;
+  uvIndex: number;
+  conditions: string;
+}
+
+@Injectable()
+export class WeatherDataService {
+  private readonly logger = new Logger(WeatherDataService.name);
+  private readonly weatherApiKey = process.env.WEATHER_API_KEY;
+  private readonly baseUrl = 'https://api.openweathermap.org/data/2.5';
+
+  constructor(private readonly httpService: HttpService) {}
+
+  async getCurrentWeather(location: string): Promise<WeatherData> {
+    try {
+      const response = await firstValueFrom(
+        this.httpService.get(`${this.baseUrl}/weather`, {
+          params: {
+            q: location,
+            appid: this.weatherApiKey,
+            units: 'metric',
+          },
+        }),
+      );
+
+      const data = response.data;
+
+      return {
+        timestamp: new Date(),
+        temperature: data.main.temp,
+        humidity: data.main.humidity,
+        windSpeed: data.wind?.speed || 0,
+        windDirection: data.wind?.deg || 0,
+        precipitation: data.rain?.['1h'] || data.snow?.['1h'] || 0,
+        pressure: data.main.pressure,
+        visibility: data.visibility / 1000, // Convert to km
+        cloudCover: data.clouds.all,
+        uvIndex: 0, // UV index not available in current weather endpoint
+        location: data.name,
+      };
+    } catch (error) {
+      this.logger.error(
+        `Failed to fetch current weather for ${location}`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  async getHistoricalWeather(
+    location: string,
+    startDate: Date,
+    endDate: Date,
+  ): Promise<WeatherData[]> {
+    try {
+      const weatherData: WeatherData[] = [];
+      const currentDate = new Date(startDate);
+
+      while (currentDate <= endDate) {
+        const timestamp = Math.floor(currentDate.getTime() / 1000);
+
+        // OpenWeatherMap historical data requires coordinates
+        const coordinates = await this.getCoordinates(location);
+
+        const response = await firstValueFrom(
+          this.httpService.get(`${this.baseUrl}/onecall/timemachine`, {
+            params: {
+              lat: coordinates.lat,
+              lon: coordinates.lon,
+              dt: timestamp,
+              appid: this.weatherApiKey,
+              units: 'metric',
+            },
+          }),
+        );
+
+        const data = response.data;
+        const current = data.current;
+
+        weatherData.push({
+          timestamp: new Date(current.dt * 1000),
+          temperature: current.temp,
+          humidity: current.humidity,
+          windSpeed: current.wind_speed,
+          windDirection: current.wind_deg,
+          precipitation: current.rain?.['1h'] || current.snow?.['1h'] || 0,
+          pressure: current.pressure,
+          visibility: current.visibility / 1000,
+          cloudCover: current.clouds,
+          uvIndex: current.uvi,
+          location,
+        });
+
+        currentDate.setDate(currentDate.getDate() + 1);
+      }
+
+      return weatherData;
+    } catch (error) {
+      this.logger.error(
+        `Failed to fetch historical weather for ${location}`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  async getWeatherForecast(
+    location: string,
+    days: number = 7,
+  ): Promise<WeatherForecast[]> {
+    try {
+      const coordinates = await this.getCoordinates(location);
+
+      const response = await firstValueFrom(
+        this.httpService.get(`${this.baseUrl}/onecall`, {
+          params: {
+            lat: coordinates.lat,
+            lon: coordinates.lon,
+            appid: this.weatherApiKey,
+            units: 'metric',
+            exclude: 'minutely,alerts',
+          },
+        }),
+      );
+
+      const data = response.data;
+
+      return data.daily.slice(0, days).map((day: any) => ({
+        timestamp: new Date(day.dt * 1000),
+        temperature: {
+          current: day.temp.day,
+          min: day.temp.min,
+          max: day.temp.max,
+        },
+        humidity: day.humidity,
+        windSpeed: day.wind_speed,
+        windDirection: day.wind_deg,
+        precipitation: {
+          probability: day.pop,
+          amount: day.rain?.['1h'] || day.snow?.['1h'] || 0,
+        },
+        pressure: day.pressure,
+        cloudCover: day.clouds,
+        uvIndex: day.uvi,
+        conditions: day.weather[0].description,
+      }));
+    } catch (error) {
+      this.logger.error(
+        `Failed to fetch weather forecast for ${location}`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  getWeatherImpactOnEnergy(weatherData: WeatherData[]): Record<string, number> {
+    const impactFactors: Record<string, number> = {
+      temperature: 0,
+      humidity: 0,
+      windSpeed: 0,
+      precipitation: 0,
+      cloudCover: 0,
+    };
+
+    if (weatherData.length === 0) return impactFactors;
+
+    // Temperature impact on heating/cooling demand
+    const avgTemp =
+      weatherData.reduce((sum, d) => sum + d.temperature, 0) /
+      weatherData.length;
+    impactFactors.temperature = this.calculateTemperatureImpact(avgTemp);
+
+    // Humidity impact on cooling systems
+    const avgHumidity =
+      weatherData.reduce((sum, d) => sum + d.humidity, 0) / weatherData.length;
+    impactFactors.humidity = this.calculateHumidityImpact(avgHumidity);
+
+    // Wind speed impact on wind energy generation
+    const avgWindSpeed =
+      weatherData.reduce((sum, d) => sum + d.windSpeed, 0) / weatherData.length;
+    impactFactors.windSpeed = this.calculateWindImpact(avgWindSpeed);
+
+    // Precipitation impact on hydroelectric generation
+    const totalPrecipitation = weatherData.reduce(
+      (sum, d) => sum + d.precipitation,
+      0,
+    );
+    impactFactors.precipitation =
+      this.calculatePrecipitationImpact(totalPrecipitation);
+
+    // Cloud cover impact on solar generation
+    const avgCloudCover =
+      weatherData.reduce((sum, d) => sum + d.cloudCover, 0) /
+      weatherData.length;
+    impactFactors.cloudCover = this.calculateCloudImpact(avgCloudCover);
+
+    return impactFactors;
+  }
+
+  correlateWeatherWithEnergyDemand(
+    weatherData: WeatherData[],
+    energyData: { timestamp: Date; demand: number }[],
+  ): Record<string, number> {
+    const correlations: Record<string, number> = {};
+
+    // Align data by timestamp
+    const alignedData = this.alignDataByTimestamp(weatherData, energyData);
+
+    if (alignedData.length < 2) {
+      return {
+        temperature: 0,
+        humidity: 0,
+        windSpeed: 0,
+        precipitation: 0,
+        cloudCover: 0,
+      };
+    }
+
+    // Calculate correlations
+    correlations.temperature = this.calculateCorrelation(
+      alignedData.map((d) => d.temperature),
+      alignedData.map((d) => d.demand),
+    );
+
+    correlations.humidity = this.calculateCorrelation(
+      alignedData.map((d) => d.humidity),
+      alignedData.map((d) => d.demand),
+    );
+
+    correlations.windSpeed = this.calculateCorrelation(
+      alignedData.map((d) => d.windSpeed),
+      alignedData.map((d) => d.demand),
+    );
+
+    correlations.precipitation = this.calculateCorrelation(
+      alignedData.map((d) => d.precipitation),
+      alignedData.map((d) => d.demand),
+    );
+
+    correlations.cloudCover = this.calculateCorrelation(
+      alignedData.map((d) => d.cloudCover),
+      alignedData.map((d) => d.demand),
+    );
+
+    return correlations;
+  }
+
+  private async getCoordinates(
+    location: string,
+  ): Promise<{ lat: number; lon: number }> {
+    try {
+      const response = await firstValueFrom(
+        this.httpService.get(`${this.baseUrl}/weather`, {
+          params: {
+            q: location,
+            appid: this.weatherApiKey,
+          },
+        }),
+      );
+
+      return {
+        lat: response.data.coord.lat,
+        lon: response.data.coord.lon,
+      };
+    } catch (error) {
+      this.logger.error(`Failed to get coordinates for ${location}`, error);
+      throw error;
+    }
+  }
+
+  private calculateTemperatureImpact(temperature: number): number {
+    // Optimal temperature range is around 20-22°C
+    // Deviation from this range increases energy demand
+    const optimalTemp = 21;
+    const deviation = Math.abs(temperature - optimalTemp);
+    return Math.min(0.5, deviation * 0.02); // Max 50% impact
+  }
+
+  private calculateHumidityImpact(humidity: number): number {
+    // High humidity increases cooling demand
+    if (humidity > 70) {
+      return (humidity - 70) * 0.005; // Max 15% impact
+    }
+    return 0;
+  }
+
+  private calculateWindImpact(windSpeed: number): number {
+    // Wind speed affects wind energy generation
+    // Optimal range is 3-25 m/s for most turbines
+    if (windSpeed >= 3 && windSpeed <= 25) {
+      return Math.min(0.3, windSpeed * 0.01); // Max 30% positive impact
+    }
+    return -0.1; // Negative impact outside optimal range
+  }
+
+  private calculatePrecipitationImpact(precipitation: number): number {
+    // Precipitation affects hydroelectric generation
+    return Math.min(0.2, precipitation * 0.01); // Max 20% positive impact
+  }
+
+  private calculateCloudImpact(cloudCover: number): number {
+    // Cloud cover affects solar generation
+    return -Math.min(0.4, cloudCover * 0.004); // Max 40% negative impact
+  }
+
+  private alignDataByTimestamp(
+    weatherData: WeatherData[],
+    energyData: { timestamp: Date; demand: number }[],
+  ): Array<WeatherData & { demand: number }> {
+    const aligned: Array<WeatherData & { demand: number }> = [];
+
+    weatherData.forEach((weather) => {
+      const energy = energyData.find(
+        (e) =>
+          Math.abs(e.timestamp.getTime() - weather.timestamp.getTime()) <
+          3600000, // Within 1 hour
+      );
+
+      if (energy) {
+        aligned.push({ ...weather, demand: energy.demand });
+      }
+    });
+
+    return aligned;
+  }
+
+  private calculateCorrelation(x: number[], y: number[]): number {
+    if (x.length !== y.length || x.length === 0) return 0;
+
+    const n = x.length;
+    const sumX = x.reduce((sum, val) => sum + val, 0);
+    const sumY = y.reduce((sum, val) => sum + val, 0);
+    const sumXY = x.reduce((sum, val, i) => sum + val * y[i], 0);
+    const sumX2 = x.reduce((sum, val) => sum + val * val, 0);
+    const sumY2 = y.reduce((sum, val) => sum + val * val, 0);
+
+    const numerator = n * sumXY - sumX * sumY;
+    const denominator = Math.sqrt(
+      (n * sumX2 - sumX * sumX) * (n * sumY2 - sumY * sumY),
+    );
+
+    return denominator === 0 ? 0 : numerator / denominator;
+  }
+
+  async getWeatherAlerts(location: string): Promise<any[]> {
+    try {
+      const coordinates = await this.getCoordinates(location);
+
+      const response = await firstValueFrom(
+        this.httpService.get(`${this.baseUrl}/onecall`, {
+          params: {
+            lat: coordinates.lat,
+            lon: coordinates.lon,
+            appid: this.weatherApiKey,
+            exclude: 'minutely,hourly,daily',
+          },
+        }),
+      );
+
+      return response.data.alerts || [];
+    } catch (error) {
+      this.logger.error(
+        `Failed to fetch weather alerts for ${location}`,
+        error,
+      );
+      return [];
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/market-forecasting.controller.ts.html b/coverage/lcov-report/src/forecasting/market-forecasting.controller.ts.html new file mode 100644 index 0000000..591cd7a --- /dev/null +++ b/coverage/lcov-report/src/forecasting/market-forecasting.controller.ts.html @@ -0,0 +1,1861 @@ + + + + + + Code coverage report for src/forecasting/market-forecasting.controller.ts + + + + + + + + + +
+
+

All files / src/forecasting market-forecasting.controller.ts

+
+ +
+ 0% + Statements + 0/592 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/592 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Controller,
+  Get,
+  Post,
+  Body,
+  Query,
+  Param,
+  HttpException,
+  HttpStatus,
+  Logger,
+} from '@nestjs/common';
+import {
+  ApiTags,
+  ApiOperation,
+  ApiResponse,
+  ApiParam,
+  ApiQuery,
+} from '@nestjs/swagger';
+import { ForecastQueryDto, EnsembleConfigDto } from './dto/forecast-query.dto';
+import {
+  TimeSeriesService,
+  TimeSeriesData,
+  ForecastResult,
+} from './models/time-series.service';
+import {
+  WeatherDataService,
+  WeatherData,
+} from './integrations/weather-data.service';
+import {
+  EconomicIndicatorService,
+  EconomicData,
+} from './analysis/economic-indicator.service';
+import {
+  TrendPredictionService,
+  TrendPrediction,
+  MarketSignal,
+  PatternRecognition,
+} from './prediction/trend-prediction.service';
+import {
+  EnsembleMethodsService,
+  EnsembleConfig,
+  EnsembleResult,
+} from './ensemble/ensemble-methods.service';
+import { ForecastHorizon } from './entities/forecast-data.entity';
+
+@ApiTags('market-forecasting')
+@Controller('forecasting')
+export class MarketForecastingController {
+  private readonly logger = new Logger(MarketForecastingController.name);
+
+  constructor(
+    private readonly timeSeriesService: TimeSeriesService,
+    private readonly weatherDataService: WeatherDataService,
+    private readonly economicIndicatorService: EconomicIndicatorService,
+    private readonly trendPredictionService: TrendPredictionService,
+    private readonly ensembleMethodsService: EnsembleMethodsService,
+  ) {}
+
+  @Post('forecast')
+  @ApiOperation({ summary: 'Generate market forecast' })
+  @ApiResponse({ status: 200, description: 'Forecast generated successfully' })
+  @ApiResponse({ status: 400, description: 'Invalid request parameters' })
+  async generateForecast(
+    @Body() query: ForecastQueryDto,
+  ): Promise<ForecastResult> {
+    try {
+      this.logger.log(
+        `Generating forecast for ${query.marketType} with ${query.forecastHorizon} horizon`,
+      );
+
+      // Get historical data (mock for now)
+      const historicalData = await this.getHistoricalData(query);
+
+      // Generate forecast based on selected models
+      const forecasts: ForecastResult[] = [];
+      const models = query.models || [
+        'ARIMA',
+        'ExponentialSmoothing',
+        'LSTM',
+        'Prophet',
+      ];
+
+      for (const model of models) {
+        try {
+          const forecast = await this.runModel(
+            historicalData,
+            model,
+            query.forecastHorizon,
+          );
+          forecasts.push(forecast);
+        } catch (error) {
+          this.logger.warn(`Failed to run model ${model}: ${error.message}`);
+        }
+      }
+
+      if (forecasts.length === 0) {
+        throw new HttpException(
+          'No forecasts could be generated',
+          HttpStatus.INTERNAL_SERVER_ERROR,
+        );
+      }
+
+      // Return the best forecast (highest accuracy)
+      const bestForecast = forecasts.reduce((best, current) =>
+        current.accuracy > best.accuracy ? current : best,
+      );
+
+      return bestForecast;
+    } catch (error) {
+      this.logger.error('Failed to generate forecast', error);
+      throw new HttpException(
+        error.message || 'Failed to generate forecast',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Post('ensemble')
+  @ApiOperation({ summary: 'Generate ensemble forecast' })
+  @ApiResponse({
+    status: 200,
+    description: 'Ensemble forecast generated successfully',
+  })
+  async generateEnsembleForecast(
+    @Body() body: { query: ForecastQueryDto; config: EnsembleConfigDto },
+  ): Promise<EnsembleResult> {
+    try {
+      const { query, config } = body;
+      this.logger.log(`Generating ensemble forecast for ${query.marketType}`);
+
+      const historicalData = await this.getHistoricalData(query);
+      const weatherData = await this.getWeatherDataFromQuery(query);
+      const economicData = await this.getEconomicData(query);
+
+      const ensembleConfig: EnsembleConfig = {
+        models: config.models,
+        weights: config.weights,
+        diversityThreshold: config.diversityThreshold,
+        votingMethod:
+          (config.votingMethod as EnsembleConfig['votingMethod']) || 'weighted',
+      };
+
+      return await this.ensembleMethodsService.createEnsembleForecast(
+        historicalData,
+        query.forecastHorizon,
+        ensembleConfig,
+        weatherData,
+        economicData,
+      );
+    } catch (error) {
+      this.logger.error('Failed to generate ensemble forecast', error);
+      throw new HttpException(
+        error.message || 'Failed to generate ensemble forecast',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Post('optimize-ensemble')
+  @ApiOperation({ summary: 'Optimize ensemble configuration' })
+  @ApiResponse({ status: 200, description: 'Ensemble optimized successfully' })
+  async optimizeEnsemble(
+    @Body() query: ForecastQueryDto,
+  ): Promise<EnsembleConfig> {
+    try {
+      const historicalData = await this.getHistoricalData(query);
+      const candidateModels = [
+        'ARIMA',
+        'ExponentialSmoothing',
+        'LSTM',
+        'Prophet',
+      ];
+
+      return await this.ensembleMethodsService.optimizeEnsemble(
+        historicalData,
+        query.forecastHorizon,
+        candidateModels,
+      );
+    } catch (error) {
+      this.logger.error('Failed to optimize ensemble', error);
+      throw new HttpException(
+        error.message || 'Failed to optimize ensemble',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Post('trend-prediction')
+  @ApiOperation({ summary: 'Predict market trends' })
+  @ApiResponse({
+    status: 200,
+    description: 'Trend prediction completed successfully',
+  })
+  async predictTrend(
+    @Body() query: ForecastQueryDto,
+  ): Promise<TrendPrediction> {
+    try {
+      const historicalData = await this.getHistoricalData(query);
+      const weatherData = await this.getWeatherDataFromQuery(query);
+      const economicData = await this.getEconomicData(query);
+
+      return await this.trendPredictionService.predictMarketTrend(
+        historicalData,
+        weatherData,
+        economicData,
+      );
+    } catch (error) {
+      this.logger.error('Failed to predict trend', error);
+      throw new HttpException(
+        error.message || 'Failed to predict trend',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Post('market-signals')
+  @ApiOperation({ summary: 'Generate trading signals' })
+  @ApiResponse({ status: 200, description: 'Signals generated successfully' })
+  async generateMarketSignals(
+    @Body()
+    body: {
+      query: ForecastQueryDto;
+      currentPosition?: 'long' | 'short' | 'neutral';
+    },
+  ): Promise<MarketSignal[]> {
+    try {
+      const trendPrediction = await this.predictTrend(body.query);
+
+      return await this.trendPredictionService.generateMarketSignals(
+        trendPrediction,
+        body.currentPosition,
+      );
+    } catch (error) {
+      this.logger.error('Failed to generate market signals', error);
+      throw new HttpException(
+        error.message || 'Failed to generate market signals',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Post('pattern-recognition')
+  @ApiOperation({ summary: 'Recognize chart patterns' })
+  @ApiResponse({ status: 200, description: 'Patterns recognized successfully' })
+  async recognizePatterns(
+    @Body() query: ForecastQueryDto,
+  ): Promise<PatternRecognition[]> {
+    try {
+      const historicalData = await this.getHistoricalData(query);
+
+      return await this.trendPredictionService.recognizePatterns(
+        historicalData,
+      );
+    } catch (error) {
+      this.logger.error('Failed to recognize patterns', error);
+      throw new HttpException(
+        error.message || 'Failed to recognize patterns',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Get('volatility')
+  @ApiOperation({ summary: 'Calculate market volatility' })
+  @ApiQuery({ name: 'marketType', required: true, type: String })
+  @ApiQuery({ name: 'windowSize', required: false, type: Number })
+  @ApiResponse({
+    status: 200,
+    description: 'Volatility calculated successfully',
+  })
+  async calculateVolatility(
+    @Query('marketType') marketType: string,
+    @Query('windowSize') windowSize?: number,
+  ): Promise<any> {
+    try {
+      const historicalData = await this.getHistoricalData({
+        marketType,
+      } as ForecastQueryDto);
+
+      return await this.trendPredictionService.calculateVolatility(
+        historicalData,
+        windowSize,
+      );
+    } catch (error) {
+      this.logger.error('Failed to calculate volatility', error);
+      throw new HttpException(
+        error.message || 'Failed to calculate volatility',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Get('weather/:location')
+  @ApiOperation({ summary: 'Get weather data for location' })
+  @ApiParam({ name: 'location', required: true, type: String })
+  @ApiQuery({ name: 'startDate', required: false, type: String })
+  @ApiQuery({ name: 'endDate', required: false, type: String })
+  @ApiResponse({
+    status: 200,
+    description: 'Weather data retrieved successfully',
+  })
+  async getWeatherDataEndpoint(
+    @Param('location') location: string,
+    @Query('startDate') startDate?: string,
+    @Query('endDate') endDate?: string,
+  ): Promise<WeatherData[]> {
+    try {
+      if (startDate && endDate) {
+        return await this.weatherDataService.getHistoricalWeather(
+          location,
+          new Date(startDate),
+          new Date(endDate),
+        );
+      } else {
+        const current =
+          await this.weatherDataService.getCurrentWeather(location);
+        return [current];
+      }
+    } catch (error) {
+      this.logger.error('Failed to get weather data', error);
+      throw new HttpException(
+        error.message || 'Failed to get weather data',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Get('economic/:region')
+  @ApiOperation({ summary: 'Get economic indicators for region' })
+  @ApiParam({ name: 'region', required: false, type: String })
+  @ApiQuery({ name: 'startDate', required: false, type: String })
+  @ApiQuery({ name: 'endDate', required: false, type: String })
+  @ApiResponse({
+    status: 200,
+    description: 'Economic data retrieved successfully',
+  })
+  async getEconomicIndicators(
+    @Param('region') region: string = 'US',
+    @Query('startDate') startDate?: string,
+    @Query('endDate') endDate?: string,
+  ): Promise<EconomicData> {
+    try {
+      if (startDate && endDate) {
+        // For now, return snapshot
+        return await this.economicIndicatorService.getEconomicSnapshot(region);
+      } else {
+        return await this.economicIndicatorService.getEconomicSnapshot(region);
+      }
+    } catch (error) {
+      this.logger.error('Failed to get economic indicators', error);
+      throw new HttpException(
+        error.message || 'Failed to get economic indicators',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  @Get('models')
+  @ApiOperation({ summary: 'Get available forecasting models' })
+  @ApiResponse({ status: 200, description: 'Models retrieved successfully' })
+  getAvailableModels(): {
+    name: string;
+    description: string;
+    suitableFor: string[];
+  }[] {
+    return [
+      {
+        name: 'ARIMA',
+        description:
+          'AutoRegressive Integrated Moving Average model for time series forecasting',
+        suitableFor: ['short-term', 'medium-term', 'stationary-data'],
+      },
+      {
+        name: 'ExponentialSmoothing',
+        description:
+          'Exponential smoothing methods for time series forecasting',
+        suitableFor: ['short-term', 'trend-data', 'seasonal-data'],
+      },
+      {
+        name: 'LSTM',
+        description:
+          'Long Short-Term Memory neural network for complex pattern recognition',
+        suitableFor: ['long-term', 'non-linear-data', 'complex-patterns'],
+      },
+      {
+        name: 'Prophet',
+        description:
+          'Facebook Prophet for forecasting with seasonality and holidays',
+        suitableFor: ['business-data', 'seasonal-data', 'holiday-effects'],
+      },
+    ];
+  }
+
+  @Get('horizons')
+  @ApiOperation({ summary: 'Get available forecast horizons' })
+  @ApiResponse({ status: 200, description: 'Horizons retrieved successfully' })
+  getAvailableHorizons(): {
+    value: string;
+    label: string;
+    description: string;
+  }[] {
+    return [
+      {
+        value: '1h',
+        label: '1 Hour',
+        description: 'Very short-term forecast for immediate trading decisions',
+      },
+      {
+        value: '6h',
+        label: '6 Hours',
+        description: 'Short-term forecast for intraday trading',
+      },
+      {
+        value: '24h',
+        label: '24 Hours',
+        description: 'Daily forecast for short-term positioning',
+      },
+      {
+        value: '1w',
+        label: '1 Week',
+        description: 'Weekly forecast for medium-term strategies',
+      },
+      {
+        value: '1m',
+        label: '1 Month',
+        description: 'Monthly forecast for medium-term planning',
+      },
+      {
+        value: '3m',
+        label: '3 Months',
+        description: 'Quarterly forecast for strategic planning',
+      },
+      {
+        value: '6m',
+        label: '6 Months',
+        description: 'Semi-annual forecast for budget planning',
+      },
+      {
+        value: '1y',
+        label: '1 Year',
+        description: 'Annual forecast for long-term strategy',
+      },
+    ];
+  }
+
+  @Get('performance')
+  @ApiOperation({ summary: 'Get model performance metrics' })
+  @ApiQuery({ name: 'marketType', required: true, type: String })
+  @ApiResponse({
+    status: 200,
+    description: 'Performance metrics retrieved successfully',
+  })
+  async getModelPerformance(
+    @Query('marketType') marketType: string,
+  ): Promise<any> {
+    try {
+      const historicalData = await this.getHistoricalData({
+        marketType,
+      } as ForecastQueryDto);
+      const models = ['ARIMA', 'ExponentialSmoothing', 'LSTM', 'Prophet'];
+      const performance: any = {};
+
+      for (const model of models) {
+        try {
+          const metrics = await this.timeSeriesService.evaluateModel(
+            historicalData,
+            model,
+          );
+          performance[model] = metrics;
+        } catch (error) {
+          this.logger.warn(
+            `Failed to evaluate model ${model}: ${error.message}`,
+          );
+          performance[model] = { error: 'Evaluation failed' };
+        }
+      }
+
+      return performance;
+    } catch (error) {
+      this.logger.error('Failed to get model performance', error);
+      throw new HttpException(
+        error.message || 'Failed to get model performance',
+        HttpStatus.INTERNAL_SERVER_ERROR,
+      );
+    }
+  }
+
+  // Helper methods
+  private async getHistoricalData(
+    query: ForecastQueryDto,
+  ): Promise<TimeSeriesData[]> {
+    await Promise.resolve();
+    // Mock historical data generation
+    // In production, this would fetch from database or external API
+    const data: TimeSeriesData[] = [];
+    const now = new Date();
+    const dataPoints = query.forecastHorizon.includes('h') ? 168 : 365; // 1 week or 1 year
+
+    for (let i = dataPoints; i > 0; i--) {
+      const timestamp = new Date(now.getTime() - i * 3600000); // 1 hour intervals
+      const baseValue = 100;
+      const trend = i * 0.1;
+      const noise = (Math.random() - 0.5) * 10;
+      const value = baseValue + trend + noise;
+
+      data.push({
+        timestamp,
+        value,
+        volume: Math.floor(Math.random() * 1000000),
+        metadata: {
+          marketType: query.marketType,
+          source: 'mock',
+        },
+      });
+    }
+
+    return data;
+  }
+
+  private async getWeatherDataFromQuery(
+    query: ForecastQueryDto,
+  ): Promise<WeatherData[]> {
+    await Promise.resolve();
+    // Mock weather data
+    const data: WeatherData[] = [];
+    const now = new Date();
+
+    for (let i = 7; i > 0; i--) {
+      const timestamp = new Date(now.getTime() - i * 24 * 3600000); // Daily
+
+      data.push({
+        timestamp,
+        temperature: 15 + Math.random() * 20,
+        humidity: 40 + Math.random() * 40,
+        windSpeed: Math.random() * 15,
+        windDirection: Math.random() * 360,
+        precipitation: Math.random() * 10,
+        pressure: 1000 + Math.random() * 50,
+        visibility: 5 + Math.random() * 15,
+        cloudCover: Math.random() * 100,
+        uvIndex: Math.random() * 11,
+        location: query.marketType || 'New York',
+      });
+    }
+
+    return data;
+  }
+
+  private async getEconomicData(
+    query: ForecastQueryDto,
+  ): Promise<EconomicData[]> {
+    await Promise.resolve();
+    // Mock economic data
+    const baseEnergyPrice = query.marketType === 'oil' ? 75 : 80;
+    return [
+      {
+        gdp: 21000 + Math.random() * 2000,
+        inflation: 2 + Math.random() * 2,
+        unemployment: 3 + Math.random() * 3,
+        interestRate: 2 + Math.random() * 3,
+        industrialProduction: 100 + Math.random() * 20,
+        consumerConfidence: 80 + Math.random() * 40,
+        manufacturingIndex: 50 + Math.random() * 20,
+        retailSales: 500000 + Math.random() * 100000,
+        energyPrices: baseEnergyPrice + Math.random() * 40,
+        currencyExchange: 1 + Math.random() * 0.2,
+      },
+    ];
+  }
+
+  private async runModel(
+    data: TimeSeriesData[],
+    model: string,
+    horizon: ForecastHorizon,
+  ): Promise<ForecastResult> {
+    switch (model) {
+      case 'ARIMA':
+        return await this.timeSeriesService.arimaForecast(data, horizon);
+      case 'ExponentialSmoothing':
+        return await this.timeSeriesService.exponentialSmoothingForecast(
+          data,
+          horizon,
+        );
+      case 'LSTM':
+        return await this.timeSeriesService.lstmForecast(data, horizon);
+      case 'Prophet':
+        return await this.timeSeriesService.prophetForecast(data, horizon);
+      default:
+        throw new Error(`Unknown model: ${model}`);
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/market-forecasting.module.ts.html b/coverage/lcov-report/src/forecasting/market-forecasting.module.ts.html new file mode 100644 index 0000000..8aba1ff --- /dev/null +++ b/coverage/lcov-report/src/forecasting/market-forecasting.module.ts.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for src/forecasting/market-forecasting.module.ts + + + + + + + + + +
+
+

All files / src/forecasting market-forecasting.module.ts

+
+ +
+ 0% + Statements + 0/36 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { HttpModule } from '@nestjs/axios';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ConfigModule } from '@nestjs/config';
+import databaseConfig from '../config/database.config';
+import { ForecastData } from './entities/forecast-data.entity';
+import { TimeSeriesService } from './models/time-series.service';
+import { WeatherDataService } from './integrations/weather-data.service';
+import { EconomicIndicatorService } from './analysis/economic-indicator.service';
+import { TrendPredictionService } from './prediction/trend-prediction.service';
+import { EnsembleMethodsService } from './ensemble/ensemble-methods.service';
+import { MarketForecastingController } from './market-forecasting.controller';
+
+@Module({
+  imports: [
+    HttpModule,
+    ConfigModule.forFeature(databaseConfig),
+    TypeOrmModule.forFeature([ForecastData]),
+  ],
+  controllers: [MarketForecastingController],
+  providers: [
+    TimeSeriesService,
+    WeatherDataService,
+    EconomicIndicatorService,
+    TrendPredictionService,
+    EnsembleMethodsService,
+  ],
+  exports: [
+    TimeSeriesService,
+    WeatherDataService,
+    EconomicIndicatorService,
+    TrendPredictionService,
+    EnsembleMethodsService,
+  ],
+})
+export class MarketForecastingModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/models/index.html b/coverage/lcov-report/src/forecasting/models/index.html new file mode 100644 index 0000000..3d7a9e3 --- /dev/null +++ b/coverage/lcov-report/src/forecasting/models/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/forecasting/models + + + + + + + + + +
+
+

All files src/forecasting/models

+
+ +
+ 95.44% + Statements + 398/417 +
+ + +
+ 77.41% + Branches + 48/62 +
+ + +
+ 100% + Functions + 21/21 +
+ + +
+ 95.44% + Lines + 398/417 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
time-series.service.ts +
+
95.44%398/41777.41%48/62100%21/2195.44%398/417
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/models/time-series.service.ts.html b/coverage/lcov-report/src/forecasting/models/time-series.service.ts.html new file mode 100644 index 0000000..4998030 --- /dev/null +++ b/coverage/lcov-report/src/forecasting/models/time-series.service.ts.html @@ -0,0 +1,1336 @@ + + + + + + Code coverage report for src/forecasting/models/time-series.service.ts + + + + + + + + + +
+
+

All files / src/forecasting/models time-series.service.ts

+
+ +
+ 95.44% + Statements + 398/417 +
+ + +
+ 77.41% + Branches + 48/62 +
+ + +
+ 100% + Functions + 21/21 +
+ + +
+ 95.44% + Lines + 398/417 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +4181x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +17x +17x +17x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x +4x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +17x +17x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +17x +17x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +  +2x +  +2x +  +2x +2x +17x +17x +3x +3x +3x +3x +3x +3x +3x +3x +3x +17x +17x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +17x +17x +8x +7x +7x +7x +7x +7x +7x +7x +7x +7x +17x +17x +11x +11x +7x +11x +1x +11x +1x +11x +1x +11x +  +11x +  +11x +  +11x +1x +11x +  +11x +11x +17x +17x +6x +6x +6x +6x +6x +6x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +17x +17x +2x +2x +2x +2x +2x +2x +2x +4x +4x +4x +4x +4x +2x +2x +17x +17x +6x +6x +6x +6x +6x +6x +6x +6x +5x +5x +17x +17x +16x +16x +16x +16x +16x +16x +16x +16x +17x +17x +9x +9x +9x +9x +9x +2x +2x +2x +2x +9x +17x + 
import { Injectable, Logger } from '@nestjs/common';
+import { ForecastHorizon } from '../entities/forecast-data.entity';
+ 
+export interface TimeSeriesData {
+  timestamp: Date;
+  value: number;
+  volume?: number;
+  metadata?: Record<string, any>;
+}
+ 
+export interface ForecastResult {
+  predictedValue: number;
+  confidenceInterval: {
+    lower: number;
+    upper: number;
+  };
+  accuracy: number;
+  model: string;
+  horizon: ForecastHorizon;
+  metadata?: Record<string, any>;
+}
+ 
+export interface ModelMetrics {
+  mae: number; // Mean Absolute Error
+  rmse: number; // Root Mean Square Error
+  mape: number; // Mean Absolute Percentage Error
+  r2: number; // R-squared
+}
+ 
+@Injectable()
+export class TimeSeriesService {
+  private readonly logger = new Logger(TimeSeriesService.name);
+ 
+  async arimaForecast(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+  ): Promise<ForecastResult> {
+    try {
+      await Promise.resolve();
+      this.ensureSufficientData(data, 2, 'ARIMA');
+      const { p, d, q } = this.optimizeARIMAParams(data);
+      const forecast = this.fitARIMA(data, p, d, q, horizon);
+      const accuracy = this.calculateAccuracy(data, forecast);
+ 
+      return {
+        predictedValue: forecast.value,
+        confidenceInterval: {
+          lower: forecast.value * (1 - 0.05 * (1 - accuracy)),
+          upper: forecast.value * (1 + 0.05 * (1 - accuracy)),
+        },
+        accuracy,
+        model: 'ARIMA',
+        horizon,
+        metadata: { p, d, q, aic: forecast.aic },
+      };
+    } catch (error) {
+      this.logger.error('ARIMA forecast failed', error);
+      throw error;
+    }
+  }
+ 
+  async exponentialSmoothingForecast(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+  ): Promise<ForecastResult> {
+    try {
+      await Promise.resolve();
+      this.ensureSufficientData(data, 2, 'ExponentialSmoothing');
+      const { alpha, beta, gamma } =
+        this.optimizeExponentialSmoothingParams(data);
+      const forecast = this.fitExponentialSmoothing(
+        data,
+        alpha,
+        beta,
+        gamma,
+        horizon,
+      );
+      const accuracy = this.calculateAccuracy(data, forecast);
+ 
+      return {
+        predictedValue: forecast.value,
+        confidenceInterval: {
+          lower: forecast.value * (1 - 0.04 * (1 - accuracy)),
+          upper: forecast.value * (1 + 0.04 * (1 - accuracy)),
+        },
+        accuracy,
+        model: 'ExponentialSmoothing',
+        horizon,
+        metadata: { alpha, beta, gamma },
+      };
+    } catch (error) {
+      this.logger.error('Exponential smoothing forecast failed', error);
+      throw error;
+    }
+  }
+ 
+  async lstmForecast(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+  ): Promise<ForecastResult> {
+    try {
+      await Promise.resolve();
+      this.ensureSufficientData(data, 2, 'LSTM');
+      const forecast = this.fitLSTM(data, horizon);
+      const accuracy = this.calculateAccuracy(data, forecast);
+ 
+      return {
+        predictedValue: forecast.value,
+        confidenceInterval: {
+          lower: forecast.value * (1 - 0.06 * (1 - accuracy)),
+          upper: forecast.value * (1 + 0.06 * (1 - accuracy)),
+        },
+        accuracy,
+        model: 'LSTM',
+        horizon,
+        metadata: {
+          layers: forecast.layers,
+          epochs: forecast.epochs,
+          loss: forecast.loss,
+        },
+      };
+    } catch (error) {
+      this.logger.error('LSTM forecast failed', error);
+      throw error;
+    }
+  }
+ 
+  async prophetForecast(
+    data: TimeSeriesData[],
+    horizon: ForecastHorizon,
+  ): Promise<ForecastResult> {
+    try {
+      await Promise.resolve();
+      this.ensureSufficientData(data, 2, 'Prophet');
+      const forecast = this.fitProphet(data, horizon);
+      const accuracy = this.calculateAccuracy(data, forecast);
+ 
+      return {
+        predictedValue: forecast.value,
+        confidenceInterval: {
+          lower: forecast.lower,
+          upper: forecast.upper,
+        },
+        accuracy,
+        model: 'Prophet',
+        horizon,
+        metadata: {
+          seasonality: forecast.seasonality,
+          holidays: forecast.holidays,
+          changepoints: forecast.changepoints,
+        },
+      };
+    } catch (error) {
+      this.logger.error('Prophet forecast failed', error);
+      throw error;
+    }
+  }
+ 
+  async evaluateModel(
+    data: TimeSeriesData[],
+    model: string,
+  ): Promise<ModelMetrics> {
+    this.ensureSufficientData(data, 5, 'model evaluation');
+ 
+    const trainSize = Math.floor(data.length * 0.8);
+    const trainData = data.slice(0, trainSize);
+    const testData = data.slice(trainSize);
+ 
+    if (testData.length === 0) {
+      throw new Error('Insufficient test observations for model evaluation');
+    }
+ 
+    const predictions: number[] = [];
+    const actuals: number[] = [];
+ 
+    for (let i = 0; i < testData.length; i++) {
+      const historicalData = [...trainData, ...testData.slice(0, i)];
+      const forecast = await this.runModel(
+        historicalData,
+        model,
+        ForecastHorizon.ONE_HOUR,
+      );
+      predictions.push(forecast.predictedValue);
+      actuals.push(testData[i].value);
+    }
+ 
+    return this.calculateMetrics(actuals, predictions);
+  }
+ 
+  private async runModel(
+    data: TimeSeriesData[],
+    model: string,
+    horizon: ForecastHorizon,
+  ): Promise<ForecastResult> {
+    switch (model) {
+      case 'ARIMA':
+        return await this.arimaForecast(data, horizon);
+      case 'ExponentialSmoothing':
+        return await this.exponentialSmoothingForecast(data, horizon);
+      case 'LSTM':
+        return await this.lstmForecast(data, horizon);
+      case 'Prophet':
+        return await this.prophetForecast(data, horizon);
+      default:
+        throw new Error(`Unknown model: ${model}`);
+    }
+  }
+ 
+  private optimizeARIMAParams(data: TimeSeriesData[]): {
+    p: number;
+    d: number;
+    q: number;
+  } {
+    void data;
+    // Simplified ARIMA parameter optimization
+    // In production, use grid search with AIC/BIC criteria
+    return { p: 1, d: 1, q: 1 };
+  }
+ 
+  private fitARIMA(
+    data: TimeSeriesData[],
+    p: number,
+    d: number,
+    q: number,
+    horizon: ForecastHorizon,
+  ): any {
+    // Simplified ARIMA fitting
+    // In production, use statsmodels or similar library
+    const lastValue = data[data.length - 1].value;
+    const trend = this.calculateTrend(data);
+    const periods = this.getHorizonPeriods(horizon);
+ 
+    return {
+      value: lastValue + trend * periods,
+      aic: Math.random() * 1000,
+    };
+  }
+ 
+  private optimizeExponentialSmoothingParams(data: TimeSeriesData[]): {
+    alpha: number;
+    beta: number;
+    gamma: number;
+  } {
+    void data;
+    // Simplified parameter optimization
+    return { alpha: 0.3, beta: 0.1, gamma: 0.2 };
+  }
+ 
+  private fitExponentialSmoothing(
+    data: TimeSeriesData[],
+    alpha: number,
+    beta: number,
+    gamma: number,
+    horizon: ForecastHorizon,
+  ): any {
+    const lastValue = data[data.length - 1].value;
+    const trend = this.calculateTrend(data);
+    const periods = this.getHorizonPeriods(horizon);
+ 
+    return {
+      value: lastValue + trend * periods * alpha,
+    };
+  }
+ 
+  private fitLSTM(data: TimeSeriesData[], horizon: ForecastHorizon): any {
+    // Simplified LSTM implementation
+    // In production, use TensorFlow.js or similar
+    const lastValue = data[data.length - 1].value;
+    const trend = this.calculateTrend(data);
+    const periods = this.getHorizonPeriods(horizon);
+ 
+    return {
+      value: lastValue + trend * periods * 1.1,
+      layers: 2,
+      epochs: 100,
+      loss: 0.05,
+    };
+  }
+ 
+  private fitProphet(data: TimeSeriesData[], horizon: ForecastHorizon): any {
+    // Simplified Prophet implementation
+    // In production, use Prophet library
+    const lastValue = data[data.length - 1].value;
+    const trend = this.calculateTrend(data);
+    const periods = this.getHorizonPeriods(horizon);
+    const predictedValue = lastValue + trend * periods;
+ 
+    return {
+      value: predictedValue,
+      lower: predictedValue * 0.95,
+      upper: predictedValue * 1.05,
+      seasonality: 'multiplicative',
+      holidays: [],
+      changepoints: 5,
+    };
+  }
+ 
+  private calculateTrend(data: TimeSeriesData[]): number {
+    if (data.length < 2) return 0;
+ 
+    const firstValue = data[0].value;
+    const lastValue = data[data.length - 1].value;
+    const timeSpan =
+      data[data.length - 1].timestamp.getTime() - data[0].timestamp.getTime();
+    const hours = timeSpan / (1000 * 60 * 60);
+ 
+    return (lastValue - firstValue) / hours;
+  }
+ 
+  private getHorizonPeriods(horizon: ForecastHorizon): number {
+    switch (horizon) {
+      case ForecastHorizon.ONE_HOUR:
+        return 1;
+      case ForecastHorizon.SIX_HOURS:
+        return 6;
+      case ForecastHorizon.TWENTY_FOUR_HOURS:
+        return 24;
+      case ForecastHorizon.ONE_WEEK:
+        return 168;
+      case ForecastHorizon.ONE_MONTH:
+        return 720;
+      case ForecastHorizon.THREE_MONTHS:
+        return 2160;
+      case ForecastHorizon.SIX_MONTHS:
+        return 4320;
+      case ForecastHorizon.ONE_YEAR:
+        return 8760;
+      default:
+        return 1;
+    }
+  }
+ 
+  private calculateAccuracy(data: TimeSeriesData[], forecast: any): number {
+    void data;
+    void forecast;
+    // Simplified accuracy calculation
+    // In production, use cross-validation and proper metrics
+    return Math.max(0.7, Math.min(0.95, 0.85 + (Math.random() - 0.5) * 0.1));
+  }
+ 
+  private calculateMetrics(
+    actuals: number[],
+    predictions: number[],
+  ): ModelMetrics {
+    const n = actuals.length;
+    const errors = actuals.map((actual, i) => actual - predictions[i]);
+ 
+    const mae = errors.reduce((sum, error) => sum + Math.abs(error), 0) / n;
+    const rmse = Math.sqrt(
+      errors.reduce((sum, error) => sum + error * error, 0) / n,
+    );
+    const mape =
+      (actuals.reduce(
+        (sum, actual, i) => sum + Math.abs(errors[i] / actual),
+        0,
+      ) /
+        n) *
+      100;
+ 
+    const yMean = actuals.reduce((sum, y) => sum + y, 0) / n;
+    const ssTotal = actuals.reduce((sum, y) => sum + Math.pow(y - yMean, 2), 0);
+    const ssResidual = errors.reduce((sum, error) => sum + error * error, 0);
+    const r2 = ssTotal === 0 ? 0 : 1 - ssResidual / ssTotal;
+ 
+    return { mae, rmse, mape, r2 };
+  }
+ 
+  preprocessData(data: TimeSeriesData[]): TimeSeriesData[] {
+    // Data cleaning and preprocessing
+    return data
+      .filter(
+        (d) => d.value !== null && d.value !== undefined && !isNaN(d.value),
+      )
+      .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime())
+      .map((d) => ({
+        ...d,
+        value: this.outlierDetection(
+          d.value,
+          data.map((item) => item.value),
+        ),
+      }));
+  }
+ 
+  private outlierDetection(value: number, values: number[]): number {
+    const q1 = this.percentile(values, 25);
+    const q3 = this.percentile(values, 75);
+    const iqr = q3 - q1;
+    const lowerBound = q1 - 1.5 * iqr;
+    const upperBound = q3 + 1.5 * iqr;
+ 
+    if (value < lowerBound) return lowerBound;
+    if (value > upperBound) return upperBound;
+    return value;
+  }
+ 
+  private percentile(values: number[], p: number): number {
+    const sorted = values.slice().sort((a, b) => a - b);
+    const index = (p / 100) * (sorted.length - 1);
+    const lower = Math.floor(index);
+    const upper = Math.ceil(index);
+    const weight = index % 1;
+ 
+    return sorted[lower] * (1 - weight) + sorted[upper] * weight;
+  }
+ 
+  private ensureSufficientData(
+    data: TimeSeriesData[],
+    minimum: number,
+    modelName: string,
+  ): void {
+    if (data.length < minimum) {
+      throw new Error(
+        `Insufficient data for ${modelName}: expected at least ${minimum} points, got ${data.length}`,
+      );
+    }
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/prediction/index.html b/coverage/lcov-report/src/forecasting/prediction/index.html new file mode 100644 index 0000000..45dab2f --- /dev/null +++ b/coverage/lcov-report/src/forecasting/prediction/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/forecasting/prediction + + + + + + + + + +
+
+

All files src/forecasting/prediction

+
+ +
+ 0% + Statements + 0/961 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/961 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
trend-prediction.service.ts +
+
0%0/9610%0/10%0/10%0/961
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/forecasting/prediction/trend-prediction.service.ts.html b/coverage/lcov-report/src/forecasting/prediction/trend-prediction.service.ts.html new file mode 100644 index 0000000..d02253e --- /dev/null +++ b/coverage/lcov-report/src/forecasting/prediction/trend-prediction.service.ts.html @@ -0,0 +1,2968 @@ + + + + + + Code coverage report for src/forecasting/prediction/trend-prediction.service.ts + + + + + + + + + +
+
+

All files / src/forecasting/prediction trend-prediction.service.ts

+
+ +
+ 0% + Statements + 0/961 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/961 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { TimeSeriesData } from '../models/time-series.service';
+import { WeatherData } from '../integrations/weather-data.service';
+import { EconomicData } from '../analysis/economic-indicator.service';
+
+export enum TrendDirection {
+  UP = 'up',
+  DOWN = 'down',
+  SIDEWAYS = 'sideways',
+  VOLATILE = 'volatile',
+}
+
+export enum TrendStrength {
+  WEAK = 'weak',
+  MODERATE = 'moderate',
+  STRONG = 'strong',
+  VERY_STRONG = 'very_strong',
+}
+
+export interface TrendPrediction {
+  direction: TrendDirection;
+  strength: TrendStrength;
+  confidence: number;
+  timeframe: string;
+  expectedChange: number;
+  riskFactors: string[];
+  keyDrivers: string[];
+  reversalPoints: Date[];
+  supportLevels: number[];
+  resistanceLevels: number[];
+}
+
+export interface MarketSignal {
+  type: 'buy' | 'sell' | 'hold';
+  strength: number;
+  reason: string;
+  timeframe: string;
+  confidence: number;
+}
+
+export interface PatternRecognition {
+  pattern: string;
+  confidence: number;
+  description: string;
+  implications: string;
+  timeframe: string;
+}
+
+@Injectable()
+export class TrendPredictionService {
+  private readonly logger = new Logger(TrendPredictionService.name);
+
+  async predictMarketTrend(
+    timeSeriesData: TimeSeriesData[],
+    weatherData?: WeatherData[],
+    economicData?: EconomicData[],
+  ): Promise<TrendPrediction> {
+    try {
+      await Promise.resolve();
+      const technicalSignals = this.analyzeTechnicalIndicators(timeSeriesData);
+      const weatherSignals = weatherData
+        ? this.analyzeWeatherImpact(weatherData)
+        : null;
+      const economicSignals = economicData
+        ? this.analyzeEconomicImpact(economicData)
+        : null;
+
+      const combinedSignals = this.combineSignals(
+        technicalSignals,
+        weatherSignals,
+        economicSignals,
+      );
+      const patterns = this.identifyPatterns(timeSeriesData);
+
+      return {
+        direction: combinedSignals.direction,
+        strength: combinedSignals.strength,
+        confidence: combinedSignals.confidence,
+        timeframe: this.determineTimeframe(timeSeriesData),
+        expectedChange: combinedSignals.expectedChange,
+        riskFactors: this.identifyRiskFactors(combinedSignals, patterns),
+        keyDrivers: this.identifyKeyDrivers(
+          technicalSignals,
+          weatherSignals,
+          economicSignals,
+        ),
+        reversalPoints: this.predictReversalPoints(
+          timeSeriesData,
+          combinedSignals,
+        ),
+        supportLevels: this.calculateSupportLevels(timeSeriesData),
+        resistanceLevels: this.calculateResistanceLevels(timeSeriesData),
+      };
+    } catch (error) {
+      this.logger.error('Failed to predict market trend', error);
+      throw error;
+    }
+  }
+
+  async detectMajorShifts(
+    historicalData: TimeSeriesData[],
+    windowSize: number = 30,
+  ): Promise<
+    {
+      timestamp: Date;
+      shiftType: string;
+      magnitude: number;
+      confidence: number;
+    }[]
+  > {
+    await Promise.resolve();
+    const shifts: {
+      timestamp: Date;
+      shiftType: string;
+      magnitude: number;
+      confidence: number;
+    }[] = [];
+
+    for (let i = windowSize; i < historicalData.length; i++) {
+      const window = historicalData.slice(i - windowSize, i);
+      const previousWindow = historicalData.slice(
+        i - windowSize * 2,
+        i - windowSize,
+      );
+
+      const shift = this.detectShift(window, previousWindow);
+      if (shift.magnitude > 0.1) {
+        // 10% threshold
+        shifts.push({
+          timestamp: historicalData[i].timestamp,
+          shiftType: shift.type,
+          magnitude: shift.magnitude,
+          confidence: shift.confidence,
+        });
+      }
+    }
+
+    return shifts;
+  }
+
+  async generateMarketSignals(
+    trendPrediction: TrendPrediction,
+    currentPosition?: 'long' | 'short' | 'neutral',
+  ): Promise<MarketSignal[]> {
+    await Promise.resolve();
+    const signals: MarketSignal[] = [];
+
+    // Primary signal based on trend direction
+    const primarySignal = this.generatePrimarySignal(
+      trendPrediction,
+      currentPosition,
+    );
+    signals.push(primarySignal);
+
+    // Risk management signals
+    const riskSignals = this.generateRiskSignals(trendPrediction);
+    signals.push(...riskSignals);
+
+    // Entry/exit signals based on support/resistance
+    const levelSignals = this.generateLevelSignals(trendPrediction);
+    signals.push(...levelSignals);
+
+    return signals;
+  }
+
+  async recognizePatterns(
+    timeSeriesData: TimeSeriesData[],
+  ): Promise<PatternRecognition[]> {
+    await Promise.resolve();
+    const patterns: PatternRecognition[] = [];
+
+    // Head and Shoulders
+    const headAndShoulders = this.detectHeadAndShoulders(timeSeriesData);
+    if (headAndShoulders) patterns.push(headAndShoulders);
+
+    // Double Top/Bottom
+    const doublePattern = this.detectDoublePattern(timeSeriesData);
+    if (doublePattern) patterns.push(doublePattern);
+
+    // Triangle patterns
+    const trianglePattern = this.detectTrianglePattern(timeSeriesData);
+    if (trianglePattern) patterns.push(trianglePattern);
+
+    // Channel patterns
+    const channelPattern = this.detectChannelPattern(timeSeriesData);
+    if (channelPattern) patterns.push(channelPattern);
+
+    // Breakout patterns
+    const breakoutPattern = this.detectBreakoutPattern(timeSeriesData);
+    if (breakoutPattern) patterns.push(breakoutPattern);
+
+    return patterns;
+  }
+
+  async calculateVolatility(
+    timeSeriesData: TimeSeriesData[],
+    windowSize: number = 20,
+  ): Promise<{
+    current: number;
+    average: number;
+    trend: 'increasing' | 'decreasing' | 'stable';
+  }> {
+    await Promise.resolve();
+    if (timeSeriesData.length < windowSize) {
+      return { current: 0, average: 0, trend: 'stable' };
+    }
+
+    const returns = this.calculateReturns(timeSeriesData);
+    const rollingVolatility = this.calculateRollingVolatility(
+      returns,
+      windowSize,
+    );
+
+    const current = rollingVolatility[rollingVolatility.length - 1];
+    const average =
+      rollingVolatility.reduce((sum, vol) => sum + vol, 0) /
+      rollingVolatility.length;
+
+    const trend = this.determineVolatilityTrend(rollingVolatility.slice(-10));
+
+    return { current, average, trend };
+  }
+
+  private analyzeTechnicalIndicators(data: TimeSeriesData[]): any {
+    const prices = data.map((d) => d.value);
+    const volumes = data.map((d) => d.volume || 0);
+
+    return {
+      // Moving averages
+      sma20: this.calculateSMA(prices, 20),
+      sma50: this.calculateSMA(prices, 50),
+      sma200: this.calculateSMA(prices, 200),
+
+      // RSI
+      rsi: this.calculateRSI(prices, 14),
+
+      // MACD
+      macd: this.calculateMACD(prices),
+
+      // Bollinger Bands
+      bollinger: this.calculateBollingerBands(prices, 20, 2),
+
+      // Volume analysis
+      volumeTrend: this.analyzeVolumeTrend(volumes),
+
+      // Momentum
+      momentum: this.calculateMomentum(prices, 10),
+    };
+  }
+
+  private analyzeWeatherImpact(weatherData: WeatherData[]): any {
+    if (weatherData.length === 0) return null;
+
+    const recentWeather = weatherData.slice(-7); // Last 7 days
+    const avgTemp =
+      recentWeather.reduce((sum, d) => sum + d.temperature, 0) /
+      recentWeather.length;
+    const avgWindSpeed =
+      recentWeather.reduce((sum, d) => sum + d.windSpeed, 0) /
+      recentWeather.length;
+    const totalPrecipitation = recentWeather.reduce(
+      (sum, d) => sum + d.precipitation,
+      0,
+    );
+
+    return {
+      temperatureImpact: this.calculateTemperatureImpact(avgTemp),
+      windImpact: this.calculateWindImpact(avgWindSpeed),
+      precipitationImpact:
+        this.calculatePrecipitationImpact(totalPrecipitation),
+      overallImpact: this.calculateOverallWeatherImpact(recentWeather),
+    };
+  }
+
+  private analyzeEconomicImpact(economicData: EconomicData[]): any {
+    if (economicData.length === 0) return null;
+
+    const latest = economicData[economicData.length - 1];
+    const previous = economicData[economicData.length - 2] || latest;
+
+    return {
+      gdpImpact: this.calculateGDPImpact(latest.gdp, previous.gdp),
+      inflationImpact: this.calculateInflationImpact(
+        latest.inflation,
+        previous.inflation,
+      ),
+      interestImpact: this.calculateInterestImpact(
+        latest.interestRate,
+        previous.interestRate,
+      ),
+      unemploymentImpact: this.calculateUnemploymentImpact(
+        latest.unemployment,
+        previous.unemployment,
+      ),
+      overallImpact: this.calculateOverallEconomicImpact(latest, previous),
+    };
+  }
+
+  private combineSignals(technical: any, weather: any, economic: any): any {
+    const weights = {
+      technical: 0.6,
+      weather: 0.2,
+      economic: 0.2,
+    };
+
+    const directionScore = this.calculateDirectionScore(
+      technical,
+      weather,
+      economic,
+      weights,
+    );
+    const strengthScore = this.calculateStrengthScore(
+      technical,
+      weather,
+      economic,
+      weights,
+    );
+    const confidenceScore = this.calculateConfidenceScore(
+      technical,
+      weather,
+      economic,
+    );
+
+    return {
+      direction: this.scoreToDirection(directionScore),
+      strength: this.scoreToStrength(strengthScore),
+      confidence: confidenceScore,
+      expectedChange: this.calculateExpectedChange(
+        directionScore,
+        strengthScore,
+      ),
+    };
+  }
+
+  private identifyPatterns(data: TimeSeriesData[]): PatternRecognition[] {
+    // This would be async in a real implementation
+    void data;
+    return [];
+  }
+
+  private determineTimeframe(data: TimeSeriesData[]): string {
+    const timeSpan =
+      data[data.length - 1].timestamp.getTime() - data[0].timestamp.getTime();
+    const days = timeSpan / (1000 * 60 * 60 * 24);
+
+    if (days < 7) return 'intraday';
+    if (days < 30) return 'short-term';
+    if (days < 90) return 'medium-term';
+    return 'long-term';
+  }
+
+  private identifyRiskFactors(
+    signals: any,
+    patterns: PatternRecognition[],
+  ): string[] {
+    const risks: string[] = [];
+
+    if (signals.confidence < 0.7) risks.push('Low confidence in prediction');
+    if (signals.strength === TrendStrength.WEAK)
+      risks.push('Weak trend strength');
+
+    patterns.forEach((pattern) => {
+      if (pattern.pattern.includes('reversal')) {
+        risks.push('Potential trend reversal');
+      }
+    });
+
+    return risks;
+  }
+
+  private identifyKeyDrivers(
+    technical: any,
+    weather: any,
+    economic: any,
+  ): string[] {
+    const drivers: string[] = [];
+
+    if (technical && Math.abs(technical.rsi - 50) > 20) {
+      drivers.push('Momentum (RSI)');
+    }
+
+    if (weather && Math.abs(weather.overallImpact) > 0.1) {
+      drivers.push('Weather conditions');
+    }
+
+    if (economic && Math.abs(economic.overallImpact) > 0.1) {
+      drivers.push('Economic indicators');
+    }
+
+    return drivers;
+  }
+
+  private predictReversalPoints(data: TimeSeriesData[], signals: any): Date[] {
+    void signals;
+    const reversals: Date[] = [];
+    const prices = data.map((d) => d.value);
+
+    // Find potential reversal points based on overbought/oversold conditions
+    for (let i = 20; i < prices.length - 5; i++) {
+      const window = prices.slice(i - 20, i + 5);
+      const isExtremum = this.isLocalExtremum(window, 10);
+
+      if (isExtremum) {
+        reversals.push(data[i].timestamp);
+      }
+    }
+
+    return reversals;
+  }
+
+  private calculateSupportLevels(data: TimeSeriesData[]): number[] {
+    const prices = data.map((d) => d.value);
+    const supports: number[] = [];
+
+    // Find recent lows as support levels
+    for (let i = 10; i < prices.length - 10; i++) {
+      const window = prices.slice(i - 10, i + 10);
+      if (prices[i] === Math.min(...window)) {
+        supports.push(prices[i]);
+      }
+    }
+
+    // Remove duplicates and sort
+    return [...new Set(supports)].sort((a, b) => b - a).slice(0, 3);
+  }
+
+  private calculateResistanceLevels(data: TimeSeriesData[]): number[] {
+    const prices = data.map((d) => d.value);
+    const resistances: number[] = [];
+
+    // Find recent highs as resistance levels
+    for (let i = 10; i < prices.length - 10; i++) {
+      const window = prices.slice(i - 10, i + 10);
+      if (prices[i] === Math.max(...window)) {
+        resistances.push(prices[i]);
+      }
+    }
+
+    // Remove duplicates and sort
+    return [...new Set(resistances)].sort((a, b) => a - b).slice(0, 3);
+  }
+
+  private detectShift(
+    window: TimeSeriesData[],
+    previousWindow: TimeSeriesData[],
+  ): any {
+    const windowAvg =
+      window.reduce((sum, d) => sum + d.value, 0) / window.length;
+    const previousAvg =
+      previousWindow.reduce((sum, d) => sum + d.value, 0) /
+      previousWindow.length;
+
+    const change = (windowAvg - previousAvg) / previousAvg;
+
+    return {
+      type: change > 0 ? 'increase' : 'decrease',
+      magnitude: Math.abs(change),
+      confidence: Math.min(1, Math.abs(change) * 10),
+    };
+  }
+
+  private generatePrimarySignal(
+    trend: TrendPrediction,
+    currentPosition?: string,
+  ): MarketSignal {
+    let type: 'buy' | 'sell' | 'hold';
+    let reason: string;
+
+    if (
+      trend.direction === TrendDirection.UP &&
+      trend.strength !== TrendStrength.WEAK
+    ) {
+      type = currentPosition === 'short' ? 'buy' : 'hold';
+      reason = 'Upward trend detected';
+    } else if (
+      trend.direction === TrendDirection.DOWN &&
+      trend.strength !== TrendStrength.WEAK
+    ) {
+      type = currentPosition === 'long' ? 'sell' : 'hold';
+      reason = 'Downward trend detected';
+    } else {
+      type = 'hold';
+      reason = 'Sideways or weak trend';
+    }
+
+    return {
+      type,
+      strength: trend.confidence,
+      reason,
+      timeframe: trend.timeframe,
+      confidence: trend.confidence,
+    };
+  }
+
+  private generateRiskSignals(trend: TrendPrediction): MarketSignal[] {
+    const signals: MarketSignal[] = [];
+
+    if (trend.confidence < 0.6) {
+      signals.push({
+        type: 'hold',
+        strength: 0.8,
+        reason: 'Low confidence - reduce position size',
+        timeframe: trend.timeframe,
+        confidence: 0.8,
+      });
+    }
+
+    if (trend.riskFactors.length > 2) {
+      signals.push({
+        type: 'hold',
+        strength: 0.7,
+        reason: 'Multiple risk factors identified',
+        timeframe: trend.timeframe,
+        confidence: 0.7,
+      });
+    }
+
+    return signals;
+  }
+
+  private generateLevelSignals(trend: TrendPrediction): MarketSignal[] {
+    const signals: MarketSignal[] = [];
+
+    // Support level signals
+    trend.supportLevels.forEach((level) => {
+      signals.push({
+        type: 'buy',
+        strength: 0.6,
+        reason: `Near support level at ${level}`,
+        timeframe: 'short-term',
+        confidence: 0.6,
+      });
+    });
+
+    // Resistance level signals
+    trend.resistanceLevels.forEach((level) => {
+      signals.push({
+        type: 'sell',
+        strength: 0.6,
+        reason: `Near resistance level at ${level}`,
+        timeframe: 'short-term',
+        confidence: 0.6,
+      });
+    });
+
+    return signals;
+  }
+
+  // Technical indicator calculations
+  private calculateSMA(prices: number[], period: number): number {
+    if (prices.length < period) return 0;
+    const sum = prices.slice(-period).reduce((sum, price) => sum + price, 0);
+    return sum / period;
+  }
+
+  private calculateRSI(prices: number[], period: number): number {
+    if (prices.length < period + 1) return 50;
+
+    const returns = this.calculateReturns(
+      prices.map((price) => ({ timestamp: new Date(), value: price })),
+    );
+    const gains = returns.filter((r) => r > 0).slice(-period);
+    const losses = returns
+      .filter((r) => r < 0)
+      .map((r) => Math.abs(r))
+      .slice(-period);
+
+    const avgGain =
+      gains.reduce((sum, gain) => sum + gain, 0) / gains.length || 0;
+    const avgLoss =
+      losses.reduce((sum, loss) => sum + loss, 0) / losses.length || 0;
+
+    if (avgLoss === 0) return 100;
+    const rs = avgGain / avgLoss;
+    return 100 - 100 / (1 + rs);
+  }
+
+  private calculateMACD(prices: number[]): any {
+    const ema12 = this.calculateEMA(prices, 12);
+    const ema26 = this.calculateEMA(prices, 26);
+    const macdLine = ema12 - ema26;
+    const signalLine = this.calculateEMA([macdLine], 9);
+
+    return {
+      macd: macdLine,
+      signal: signalLine,
+      histogram: macdLine - signalLine,
+    };
+  }
+
+  private calculateEMA(prices: number[], period: number): number {
+    if (prices.length === 0) return 0;
+    if (prices.length === 1) return prices[0];
+
+    const multiplier = 2 / (period + 1);
+    let ema = prices[0];
+
+    for (let i = 1; i < prices.length; i++) {
+      ema = prices[i] * multiplier + ema * (1 - multiplier);
+    }
+
+    return ema;
+  }
+
+  private calculateBollingerBands(
+    prices: number[],
+    period: number,
+    stdDev: number,
+  ): any {
+    if (prices.length < period) return { upper: 0, middle: 0, lower: 0 };
+
+    const middle = this.calculateSMA(prices, period);
+    const recentPrices = prices.slice(-period);
+    const variance =
+      recentPrices.reduce(
+        (sum, price) => sum + Math.pow(price - middle, 2),
+        0,
+      ) / period;
+    const standardDeviation = Math.sqrt(variance);
+
+    return {
+      upper: middle + standardDeviation * stdDev,
+      middle,
+      lower: middle - standardDeviation * stdDev,
+    };
+  }
+
+  private analyzeVolumeTrend(volumes: number[]): any {
+    const avgVolume =
+      volumes.reduce((sum, vol) => sum + vol, 0) / volumes.length;
+    const recentVolume =
+      volumes.slice(-5).reduce((sum, vol) => sum + vol, 0) / 5;
+
+    return {
+      current: recentVolume,
+      average: avgVolume,
+      trend: recentVolume > avgVolume * 1.2 ? 'increasing' : 'normal',
+    };
+  }
+
+  private calculateMomentum(prices: number[], period: number): number {
+    if (prices.length < period + 1) return 0;
+    const current = prices[prices.length - 1];
+    const previous = prices[prices.length - 1 - period];
+    return ((current - previous) / previous) * 100;
+  }
+
+  private calculateReturns(data: TimeSeriesData[]): number[] {
+    const returns: number[] = [];
+    for (let i = 1; i < data.length; i++) {
+      const returnValue =
+        (data[i].value - data[i - 1].value) / data[i - 1].value;
+      returns.push(returnValue);
+    }
+    return returns;
+  }
+
+  private calculateRollingVolatility(
+    returns: number[],
+    windowSize: number,
+  ): number[] {
+    const volatilities: number[] = [];
+
+    for (let i = windowSize; i < returns.length; i++) {
+      const window = returns.slice(i - windowSize, i);
+      const mean = window.reduce((sum, ret) => sum + ret, 0) / window.length;
+      const variance =
+        window.reduce((sum, ret) => sum + Math.pow(ret - mean, 2), 0) /
+        window.length;
+      volatilities.push(Math.sqrt(variance) * Math.sqrt(252)); // Annualized
+    }
+
+    return volatilities;
+  }
+
+  private determineVolatilityTrend(
+    recentVolatility: number[],
+  ): 'increasing' | 'decreasing' | 'stable' {
+    if (recentVolatility.length < 2) return 'stable';
+
+    const first = recentVolatility[0];
+    const last = recentVolatility[recentVolatility.length - 1];
+    const change = (last - first) / first;
+
+    if (change > 0.1) return 'increasing';
+    if (change < -0.1) return 'decreasing';
+    return 'stable';
+  }
+
+  // Pattern detection methods
+  private detectHeadAndShoulders(
+    data: TimeSeriesData[],
+  ): PatternRecognition | null {
+    // Simplified head and shoulders detection
+    const prices = data.map((d) => d.value);
+    if (prices.length < 20) return null;
+
+    // Look for the pattern in the last 20 data points
+    const recent = prices.slice(-20);
+    const leftShoulder = Math.max(...recent.slice(0, 5));
+    const head = Math.max(...recent.slice(5, 10));
+    const rightShoulder = Math.max(...recent.slice(10, 15));
+
+    if (
+      head > leftShoulder &&
+      head > rightShoulder &&
+      Math.abs(leftShoulder - rightShoulder) / leftShoulder < 0.1
+    ) {
+      return {
+        pattern: 'Head and Shoulders',
+        confidence: 0.7,
+        description: 'Bearish reversal pattern detected',
+        implications: 'Potential downward movement',
+        timeframe: 'medium-term',
+      };
+    }
+
+    return null;
+  }
+
+  private detectDoublePattern(
+    data: TimeSeriesData[],
+  ): PatternRecognition | null {
+    const prices = data.map((d) => d.value);
+    if (prices.length < 20) return null;
+
+    const recent = prices.slice(-20);
+    const peaks = this.findPeaks(recent);
+
+    if (peaks.length >= 2) {
+      const firstPeak = peaks[peaks.length - 2];
+      const secondPeak = peaks[peaks.length - 1];
+
+      if (
+        Math.abs(firstPeak.value - secondPeak.value) / firstPeak.value <
+        0.05
+      ) {
+        return {
+          pattern: 'Double Top',
+          confidence: 0.6,
+          description: 'Bearish reversal pattern',
+          implications: 'Potential downward break',
+          timeframe: 'short-term',
+        };
+      }
+    }
+
+    return null;
+  }
+
+  private detectTrianglePattern(
+    data: TimeSeriesData[],
+  ): PatternRecognition | null {
+    // Simplified triangle pattern detection
+    void data;
+    return null;
+  }
+
+  private detectChannelPattern(
+    data: TimeSeriesData[],
+  ): PatternRecognition | null {
+    // Simplified channel pattern detection
+    void data;
+    return null;
+  }
+
+  private detectBreakoutPattern(
+    data: TimeSeriesData[],
+  ): PatternRecognition | null {
+    // Simplified breakout pattern detection
+    void data;
+    return null;
+  }
+
+  private findPeaks(prices: number[]): Array<{ index: number; value: number }> {
+    const peaks: Array<{ index: number; value: number }> = [];
+
+    for (let i = 1; i < prices.length - 1; i++) {
+      if (prices[i] > prices[i - 1] && prices[i] > prices[i + 1]) {
+        peaks.push({ index: i, value: prices[i] });
+      }
+    }
+
+    return peaks;
+  }
+
+  private isLocalExtremum(window: number[], position: number): boolean {
+    const value = window[position];
+    const left = window.slice(0, position);
+    const right = window.slice(position + 1);
+
+    const isMax =
+      left.every((v) => v <= value) && right.every((v) => v <= value);
+    const isMin =
+      left.every((v) => v >= value) && right.every((v) => v >= value);
+
+    return isMax || isMin;
+  }
+
+  // Helper methods for signal combination
+  private calculateDirectionScore(
+    technical: any,
+    weather: any,
+    economic: any,
+    weights: any,
+  ): number {
+    let score = 0;
+
+    if (technical) {
+      score += (technical.rsi > 50 ? 1 : -1) * weights.technical;
+    }
+
+    if (weather) {
+      score += weather.overallImpact * weights.weather;
+    }
+
+    if (economic) {
+      score += economic.overallImpact * weights.economic;
+    }
+
+    return Math.max(-1, Math.min(1, score));
+  }
+
+  private calculateStrengthScore(
+    technical: any,
+    weather: any,
+    economic: any,
+    weights: any,
+  ): number {
+    let strength = 0;
+
+    if (technical) {
+      strength += (Math.abs(technical.rsi - 50) / 50) * weights.technical;
+    }
+
+    if (weather) {
+      strength += Math.abs(weather.overallImpact) * weights.weather;
+    }
+
+    if (economic) {
+      strength += Math.abs(economic.overallImpact) * weights.economic;
+    }
+
+    return Math.max(0, Math.min(1, strength));
+  }
+
+  private calculateConfidenceScore(
+    technical: any,
+    weather: any,
+    economic: any,
+  ): number {
+    let confidence = 0.5; // Base confidence
+    let factors = 1;
+
+    if (technical) {
+      confidence += 0.2;
+      factors++;
+    }
+
+    if (weather) {
+      confidence += 0.1;
+      factors++;
+    }
+
+    if (economic) {
+      confidence += 0.2;
+      factors++;
+    }
+
+    return Math.max(0.3, Math.min(0.95, confidence / factors));
+  }
+
+  private scoreToDirection(score: number): TrendDirection {
+    if (score > 0.3) return TrendDirection.UP;
+    if (score < -0.3) return TrendDirection.DOWN;
+    if (Math.abs(score) < 0.1) return TrendDirection.SIDEWAYS;
+    return TrendDirection.VOLATILE;
+  }
+
+  private scoreToStrength(score: number): TrendStrength {
+    if (score > 0.8) return TrendStrength.VERY_STRONG;
+    if (score > 0.6) return TrendStrength.STRONG;
+    if (score > 0.4) return TrendStrength.MODERATE;
+    return TrendStrength.WEAK;
+  }
+
+  private calculateExpectedChange(
+    directionScore: number,
+    strengthScore: number,
+  ): number {
+    return directionScore * strengthScore * 0.15; // Max 15% change
+  }
+
+  // Weather impact calculations
+  private calculateTemperatureImpact(temp: number): number {
+    const optimal = 20; // Optimal temperature in Celsius
+    const deviation = Math.abs(temp - optimal);
+    return -deviation * 0.01; // Negative impact for deviation
+  }
+
+  private calculateWindImpact(windSpeed: number): number {
+    if (windSpeed >= 3 && windSpeed <= 25) {
+      return windSpeed * 0.002; // Positive impact for wind energy
+    }
+    return 0;
+  }
+
+  private calculatePrecipitationImpact(precipitation: number): number {
+    return precipitation * 0.001; // Positive impact for hydro
+  }
+
+  private calculateOverallWeatherImpact(weatherData: WeatherData[]): number {
+    const impacts = weatherData.map(
+      (d) =>
+        this.calculateTemperatureImpact(d.temperature) +
+        this.calculateWindImpact(d.windSpeed) +
+        this.calculatePrecipitationImpact(d.precipitation),
+    );
+    return impacts.reduce((sum, impact) => sum + impact, 0) / impacts.length;
+  }
+
+  // Economic impact calculations
+  private calculateGDPImpact(current: number, previous: number): number {
+    const growth = (current - previous) / previous;
+    return growth * 0.3;
+  }
+
+  private calculateInflationImpact(current: number, previous: number): number {
+    const change = current - previous;
+    return change * 0.05;
+  }
+
+  private calculateInterestImpact(current: number, previous: number): number {
+    const change = current - previous;
+    return -change * 0.02;
+  }
+
+  private calculateUnemploymentImpact(
+    current: number,
+    previous: number,
+  ): number {
+    const change = current - previous;
+    return -change * 0.03;
+  }
+
+  private calculateOverallEconomicImpact(
+    current: EconomicData,
+    previous: EconomicData,
+  ): number {
+    const impacts = [
+      this.calculateGDPImpact(current.gdp, previous.gdp),
+      this.calculateInflationImpact(current.inflation, previous.inflation),
+      this.calculateInterestImpact(current.interestRate, previous.interestRate),
+      this.calculateUnemploymentImpact(
+        current.unemployment,
+        previous.unemployment,
+      ),
+    ];
+    return impacts.reduce((sum, impact) => sum + impact, 0) / impacts.length;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/dto/fraud-alert.dto.ts.html b/coverage/lcov-report/src/fraud/dto/fraud-alert.dto.ts.html new file mode 100644 index 0000000..387df74 --- /dev/null +++ b/coverage/lcov-report/src/fraud/dto/fraud-alert.dto.ts.html @@ -0,0 +1,889 @@ + + + + + + Code coverage report for src/fraud/dto/fraud-alert.dto.ts + + + + + + + + + +
+
+

All files / src/fraud/dto fraud-alert.dto.ts

+
+ +
+ 100% + Statements + 268/268 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 100% + Lines + 268/268 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +2691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import {
+  IsString,
+  IsNumber,
+  IsOptional,
+  IsObject,
+  IsEnum,
+  IsBoolean,
+  IsArray,
+  IsUUID,
+  Min,
+  Max,
+  IsDateString,
+  IsPositive,
+  MaxLength,
+} from 'class-validator';
+import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
+import {
+  FraudType,
+  FraudSeverity,
+  FraudCaseStatus,
+} from '../entities/fraud-case.entity';
+ 
+// ─── Re-export enums for convenience ────────────────────────────────────────
+export { FraudType, FraudSeverity, FraudCaseStatus };
+ 
+// ─── Trade Analysis Request ──────────────────────────────────────────────────
+export class AnalyzeTradeDto {
+  @ApiProperty({ description: 'Unique identifier of the trade' })
+  @IsString()
+  tradeId: string;
+ 
+  @ApiProperty({ description: 'Trader / account identifier' })
+  @IsString()
+  traderId: string;
+ 
+  @ApiPropertyOptional({ description: 'Counterparty identifier' })
+  @IsOptional()
+  @IsString()
+  counterpartyId?: string;
+ 
+  @ApiProperty({ description: 'Energy market identifier (e.g., EU-ETS, PJM)' })
+  @IsString()
+  market: string;
+ 
+  @ApiProperty({
+    description: 'Asset type (e.g., electricity, gas, carbon_credit)',
+  })
+  @IsString()
+  assetType: string;
+ 
+  @ApiProperty({ description: 'Trade quantity in MWh or equivalent' })
+  @IsNumber()
+  @IsPositive()
+  quantity: number;
+ 
+  @ApiProperty({ description: 'Trade price per unit' })
+  @IsNumber()
+  @IsPositive()
+  price: number;
+ 
+  @ApiProperty({ description: 'Total trade value in USD' })
+  @IsNumber()
+  @IsPositive()
+  tradeValue: number;
+ 
+  @ApiProperty({ description: 'Order side: buy or sell' })
+  @IsEnum(['buy', 'sell'])
+  side: 'buy' | 'sell';
+ 
+  @ApiProperty({ description: 'Order type: market, limit, stop' })
+  @IsEnum(['market', 'limit', 'stop'])
+  orderType: 'market' | 'limit' | 'stop';
+ 
+  @ApiPropertyOptional({ description: 'Time-in-force: GTC, IOC, FOK' })
+  @IsOptional()
+  @IsEnum(['GTC', 'IOC', 'FOK'])
+  timeInForce?: 'GTC' | 'IOC' | 'FOK';
+ 
+  @ApiPropertyOptional({ description: 'Timestamp of the trade (ISO 8601)' })
+  @IsOptional()
+  @IsDateString()
+  tradeTimestamp?: string;
+ 
+  @ApiPropertyOptional({ description: 'Additional trade metadata' })
+  @IsOptional()
+  @IsObject()
+  metadata?: Record<string, unknown>;
+}
+ 
+// ─── Batch Trade Analysis ────────────────────────────────────────────────────
+export class AnalyzeTradesBatchDto {
+  @ApiProperty({
+    type: [AnalyzeTradeDto],
+    description: 'Array of trades to analyze',
+  })
+  @IsArray()
+  trades: AnalyzeTradeDto[];
+}
+ 
+// ─── Pre-trade Prevention Check ─────────────────────────────────────────────
+export class PreTradeCheckDto {
+  @ApiProperty()
+  @IsString()
+  traderId: string;
+ 
+  @ApiProperty()
+  @IsString()
+  market: string;
+ 
+  @ApiProperty()
+  @IsNumber()
+  @IsPositive()
+  quantity: number;
+ 
+  @ApiProperty()
+  @IsNumber()
+  @IsPositive()
+  price: number;
+ 
+  @ApiProperty()
+  @IsEnum(['buy', 'sell'])
+  side: 'buy' | 'sell';
+ 
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsString()
+  counterpartyId?: string;
+}
+ 
+// ─── Investigation Update ────────────────────────────────────────────────────
+export class InvestigationUpdateDto {
+  @ApiProperty({ enum: FraudCaseStatus })
+  @IsEnum(FraudCaseStatus)
+  status: FraudCaseStatus;
+ 
+  @ApiPropertyOptional({ description: 'Investigator notes' })
+  @IsOptional()
+  @IsString()
+  @MaxLength(5000)
+  investigationNotes?: string;
+ 
+  @ApiPropertyOptional({ description: 'Assigned investigator ID' })
+  @IsOptional()
+  @IsString()
+  assignedTo?: string;
+ 
+  @ApiPropertyOptional({ description: 'Reason if marking as false positive' })
+  @IsOptional()
+  @IsString()
+  @MaxLength(1000)
+  falsePositiveReason?: string;
+ 
+  @ApiPropertyOptional({ description: 'Resolved by (user ID)' })
+  @IsOptional()
+  @IsString()
+  resolvedBy?: string;
+}
+ 
+// ─── SAR Report Query ────────────────────────────────────────────────────────
+export class FraudReportQueryDto {
+  @ApiPropertyOptional({ enum: FraudType })
+  @IsOptional()
+  @IsEnum(FraudType)
+  fraudType?: FraudType;
+ 
+  @ApiPropertyOptional({ enum: FraudSeverity })
+  @IsOptional()
+  @IsEnum(FraudSeverity)
+  severity?: FraudSeverity;
+ 
+  @ApiPropertyOptional({ enum: FraudCaseStatus })
+  @IsOptional()
+  @IsEnum(FraudCaseStatus)
+  status?: FraudCaseStatus;
+ 
+  @ApiPropertyOptional({ description: 'Filter by trader ID' })
+  @IsOptional()
+  @IsString()
+  traderId?: string;
+ 
+  @ApiPropertyOptional({ description: 'Start date (ISO 8601)' })
+  @IsOptional()
+  @IsDateString()
+  startDate?: string;
+ 
+  @ApiPropertyOptional({ description: 'End date (ISO 8601)' })
+  @IsOptional()
+  @IsDateString()
+  endDate?: string;
+ 
+  @ApiPropertyOptional({ description: 'Page number', default: 1 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  page?: number;
+ 
+  @ApiPropertyOptional({ description: 'Items per page', default: 20 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(100)
+  limit?: number;
+ 
+  @ApiPropertyOptional({ description: 'Minimum ML score filter (0-1)' })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(1)
+  minMlScore?: number;
+ 
+  @ApiPropertyOptional({ description: 'Filter regulatory reported only' })
+  @IsOptional()
+  @IsBoolean()
+  regulatoryReported?: boolean;
+}
+ 
+// ─── Response DTOs ───────────────────────────────────────────────────────────
+export interface FraudAnalysisResult {
+  caseId: string;
+  tradeId: string;
+  traderId: string;
+  isSuspicious: boolean;
+  mlScore: number;
+  severity: FraudSeverity;
+  fraudTypes: FraudType[];
+  patternsMatched: PatternMatchResult[];
+  evidence: EvidenceItem[];
+  recommendedAction: string;
+  processingTimeMs: number;
+}
+ 
+export interface PatternMatchResult {
+  patternId: string;
+  patternName: string;
+  category: string;
+  matched: boolean;
+  confidence: number;
+  evidence: string;
+}
+ 
+export interface EvidenceItem {
+  type: string;
+  description: string;
+  value: unknown;
+  timestamp: Date;
+}
+ 
+export interface PreTradeCheckResult {
+  allowed: boolean;
+  riskScore: number;
+  reasons: string[];
+  recommendedAction: 'allow' | 'block' | 'review';
+}
+ 
+export interface FraudMetrics {
+  totalCases: number;
+  openCases: number;
+  resolvedCases: number;
+  falsePositives: number;
+  falsePositiveRate: number;
+  detectionRate: number;
+  preventedTrades: number;
+  blockedValue: number;
+  averageMlScore: number;
+  casesByType: Record<string, number>;
+  casesBySeverity: Record<string, number>;
+  averageResolutionTimeHours: number;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/dto/index.html b/coverage/lcov-report/src/fraud/dto/index.html new file mode 100644 index 0000000..af358fb --- /dev/null +++ b/coverage/lcov-report/src/fraud/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/fraud/dto + + + + + + + + + +
+
+

All files src/fraud/dto

+
+ +
+ 100% + Statements + 268/268 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 100% + Lines + 268/268 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
fraud-alert.dto.ts +
+
100%268/268100%2/266.66%2/3100%268/268
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/entities/fraud-case.entity.ts.html b/coverage/lcov-report/src/fraud/entities/fraud-case.entity.ts.html new file mode 100644 index 0000000..84e52cf --- /dev/null +++ b/coverage/lcov-report/src/fraud/entities/fraud-case.entity.ts.html @@ -0,0 +1,598 @@ + + + + + + Code coverage report for src/fraud/entities/fraud-case.entity.ts + + + + + + + + + +
+
+

All files / src/fraud/entities fraud-case.entity.ts

+
+ +
+ 100% + Statements + 171/171 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 171/171 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +1721x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +1x +5x +5x +5x +5x +5x +5x +1x +5x +5x +5x +5x +5x +5x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+ 
+export enum FraudType {
+  WASH_TRADING = 'wash_trading',
+  SPOOFING = 'spoofing',
+  LAYERING = 'layering',
+  MARKET_MANIPULATION = 'market_manipulation',
+  FRONT_RUNNING = 'front_running',
+  PUMP_AND_DUMP = 'pump_and_dump',
+  CROSS_MARKET_MANIPULATION = 'cross_market_manipulation',
+  INSIDER_TRADING = 'insider_trading',
+  MOMENTUM_IGNITION = 'momentum_ignition',
+  PAINTING_THE_TAPE = 'painting_the_tape',
+  RAMPING = 'ramping',
+  BANGING_THE_CLOSE = 'banging_the_close',
+  CIRCULAR_TRADING = 'circular_trading',
+  ORDER_BOOK_SPOOFING = 'order_book_spoofing',
+  VELOCITY_ABUSE = 'velocity_abuse',
+  UNKNOWN = 'unknown',
+}
+ 
+export enum FraudSeverity {
+  LOW = 'low',
+  MEDIUM = 'medium',
+  HIGH = 'high',
+  CRITICAL = 'critical',
+}
+ 
+export enum FraudCaseStatus {
+  OPEN = 'open',
+  INVESTIGATING = 'investigating',
+  RESOLVED = 'resolved',
+  FALSE_POSITIVE = 'false_positive',
+  ESCALATED = 'escalated',
+  REGULATORY_REPORTED = 'regulatory_reported',
+}
+ 
+@Entity('fraud_cases')
+@Index(['traderId', 'createdAt'])
+@Index(['status', 'severity'])
+export class FraudCaseEntity {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+ 
+  @Column({ name: 'case_id', unique: true })
+  caseId: string;
+ 
+  @Column({ name: 'trade_id', nullable: true })
+  tradeId: string;
+ 
+  @Column({ name: 'trader_id' })
+  @Index()
+  traderId: string;
+ 
+  @Column({ name: 'counterparty_id', nullable: true })
+  counterpartyId: string;
+ 
+  @Column({
+    name: 'fraud_type',
+    type: 'enum',
+    enum: FraudType,
+    default: FraudType.UNKNOWN,
+  })
+  fraudType: FraudType;
+ 
+  @Column({
+    name: 'severity',
+    type: 'enum',
+    enum: FraudSeverity,
+    default: FraudSeverity.LOW,
+  })
+  severity: FraudSeverity;
+ 
+  @Column({
+    name: 'status',
+    type: 'enum',
+    enum: FraudCaseStatus,
+    default: FraudCaseStatus.OPEN,
+  })
+  status: FraudCaseStatus;
+ 
+  @Column({
+    name: 'ml_score',
+    type: 'decimal',
+    precision: 5,
+    scale: 4,
+    default: 0,
+  })
+  mlScore: number;
+ 
+  @Column({ name: 'pattern_matched', nullable: true })
+  patternMatched: string;
+ 
+  @Column({ name: 'patterns_triggered', type: 'json', default: '[]' })
+  patternsTriggered: string[];
+ 
+  @Column({ name: 'evidence', type: 'json', default: '[]' })
+  evidence: object[];
+ 
+  @Column({ name: 'trade_data', type: 'json', nullable: true })
+  tradeData: object;
+ 
+  @Column({ name: 'ml_features', type: 'json', nullable: true })
+  mlFeatures: object;
+ 
+  @Column({
+    name: 'regulatory_reported',
+    type: 'boolean',
+    default: false,
+  })
+  regulatoryReported: boolean;
+ 
+  @Column({
+    name: 'prevention_applied',
+    type: 'boolean',
+    default: false,
+  })
+  preventionApplied: boolean;
+ 
+  @Column({ name: 'prevention_action', nullable: true })
+  preventionAction: string | null;
+ 
+  @Column({ name: 'assigned_to', nullable: true })
+  assignedTo: string;
+ 
+  @Column({ name: 'investigation_notes', type: 'text', nullable: true })
+  investigationNotes: string;
+ 
+  @Column({
+    name: 'false_positive_reason',
+    nullable: true,
+  })
+  falsePositiveReason: string;
+ 
+  @Column({ name: 'resolved_by', nullable: true })
+  resolvedBy: string;
+ 
+  @Column({ name: 'resolved_at', nullable: true })
+  resolvedAt: Date;
+ 
+  @Column({ name: 'sar_reference', nullable: true })
+  sarReference: string;
+ 
+  @Column({ name: 'market', nullable: true })
+  market: string;
+ 
+  @Column({ name: 'asset_type', nullable: true })
+  assetType: string;
+ 
+  @Column({
+    name: 'trade_value',
+    type: 'decimal',
+    precision: 20,
+    scale: 4,
+    nullable: true,
+  })
+  tradeValue: number;
+ 
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+ 
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/entities/index.html b/coverage/lcov-report/src/fraud/entities/index.html new file mode 100644 index 0000000..cab546f --- /dev/null +++ b/coverage/lcov-report/src/fraud/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/fraud/entities + + + + + + + + + +
+
+

All files src/fraud/entities

+
+ +
+ 100% + Statements + 171/171 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 171/171 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
fraud-case.entity.ts +
+
100%171/171100%3/3100%0/0100%171/171
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/fraud-detection.controller.ts.html b/coverage/lcov-report/src/fraud/fraud-detection.controller.ts.html new file mode 100644 index 0000000..ddab891 --- /dev/null +++ b/coverage/lcov-report/src/fraud/fraud-detection.controller.ts.html @@ -0,0 +1,886 @@ + + + + + + Code coverage report for src/fraud/fraud-detection.controller.ts + + + + + + + + + +
+
+

All files / src/fraud fraud-detection.controller.ts

+
+ +
+ 0% + Statements + 0/267 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/267 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Controller,
+  Get,
+  Post,
+  Patch,
+  Body,
+  Param,
+  Query,
+  HttpCode,
+  HttpStatus,
+} from '@nestjs/common';
+import {
+  ApiTags,
+  ApiOperation,
+  ApiResponse,
+  ApiParam,
+  ApiQuery,
+} from '@nestjs/swagger';
+import { RealTimeMonitorService } from './monitoring/real-time-monitor.service';
+import { SuspiciousActivityService } from './reporting/suspicious-activity.service';
+import { FraudPreventionService } from './prevention/fraud-prevention.service';
+import { FraudMlService } from './ml/fraud-ml.service';
+import { PatternRecognitionService } from './patterns/pattern-recognition.service';
+import {
+  AnalyzeTradeDto,
+  PreTradeCheckDto,
+  InvestigationUpdateDto,
+  FraudReportQueryDto,
+} from './dto/fraud-alert.dto';
+import { FraudSeverity } from './entities/fraud-case.entity';
+
+@ApiTags('Fraud Detection')
+@Controller('fraud')
+export class FraudDetectionController {
+  constructor(
+    private readonly monitorService: RealTimeMonitorService,
+    private readonly reportingService: SuspiciousActivityService,
+    private readonly preventionService: FraudPreventionService,
+    private readonly mlService: FraudMlService,
+    private readonly patternService: PatternRecognitionService,
+  ) {}
+
+  // ─── Trade Analysis ──────────────────────────────────────────────────────
+
+  @Post('analyze')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Analyze a trade for fraud indicators' })
+  @ApiResponse({ status: 200, description: 'Fraud analysis result returned' })
+  @ApiResponse({ status: 400, description: 'Invalid trade data' })
+  async analyzeTrade(@Body() tradeDto: AnalyzeTradeDto) {
+    return this.monitorService.analyzeIncomingTrade(tradeDto);
+  }
+
+  @Post('prevention/check')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Pre-trade fraud prevention check' })
+  @ApiResponse({ status: 200, description: 'Prevention check result' })
+  async preTradeCheck(@Body() checkDto: PreTradeCheckDto) {
+    // Run ML score before prevention check for combined decision
+    const mlResult = await this.mlService.analyzeTrade({
+      tradeId: `pre-check-${Date.now()}`,
+      traderId: checkDto.traderId,
+      counterpartyId: checkDto.counterpartyId,
+      market: checkDto.market,
+      assetType: 'unknown',
+      quantity: checkDto.quantity,
+      price: checkDto.price,
+      tradeValue: checkDto.quantity * checkDto.price,
+      side: checkDto.side,
+      orderType: 'limit',
+    });
+    return this.preventionService.preTradeCheck(checkDto, mlResult.score);
+  }
+
+  // ─── Case Management ─────────────────────────────────────────────────────
+
+  @Get('cases')
+  @ApiOperation({
+    summary: 'Get fraud cases with optional filters (paginated)',
+  })
+  @ApiResponse({ status: 200, description: 'Paginated fraud cases' })
+  async getCases(@Query() queryDto: FraudReportQueryDto) {
+    return this.reportingService.queryCases(queryDto);
+  }
+
+  @Get('cases/ref/:caseId')
+  @ApiOperation({ summary: 'Get a fraud case by human-readable case ID' })
+  @ApiParam({
+    name: 'caseId',
+    description: 'Case ID (e.g. FRAUD-20250328-ABCD1234)',
+  })
+  async getCaseByCaseId(@Param('caseId') caseId: string) {
+    return this.reportingService.getCaseByCaseId(caseId);
+  }
+
+  @Get('cases/trader/:traderId')
+  @ApiOperation({ summary: 'Get all fraud cases for a specific trader' })
+  @ApiParam({ name: 'traderId', description: 'Trader ID' })
+  @ApiQuery({ name: 'page', required: false, description: 'Page number' })
+  @ApiQuery({ name: 'limit', required: false, description: 'Items per page' })
+  async getCasesByTrader(
+    @Param('traderId') traderId: string,
+    @Query('page') page = 1,
+    @Query('limit') limit = 20,
+  ) {
+    return this.reportingService.getCasesByTrader(
+      traderId,
+      Number(page),
+      Number(limit),
+    );
+  }
+
+  @Get('cases/:id')
+  @ApiOperation({ summary: 'Get a fraud case by ID' })
+  @ApiParam({ name: 'id', description: 'Fraud case UUID' })
+  @ApiResponse({ status: 200, description: 'Fraud case details' })
+  @ApiResponse({ status: 404, description: 'Case not found' })
+  async getCaseById(@Param('id') id: string) {
+    return this.reportingService.getCaseById(id);
+  }
+
+  // ─── SAR Reports ─────────────────────────────────────────────────────────
+
+  @Get('reports/sar')
+  @ApiOperation({ summary: 'Query Suspicious Activity Reports' })
+  @ApiResponse({ status: 200, description: 'SAR report list' })
+  async getSarReports(@Query() queryDto: FraudReportQueryDto) {
+    return this.reportingService.queryCases({
+      ...queryDto,
+      regulatoryReported: true,
+    });
+  }
+
+  @Post('reports/sar/:caseId/generate')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Manually generate SAR for a specific case' })
+  @ApiParam({
+    name: 'caseId',
+    description: 'Case ID (FRAUD-XXXXXXXX-XXXXXXXX)',
+  })
+  @ApiResponse({ status: 200, description: 'SAR generated successfully' })
+  async generateSar(@Param('caseId') caseId: string) {
+    return this.reportingService.generateSARById(caseId);
+  }
+
+  // ─── Real-time Monitoring ─────────────────────────────────────────────────
+
+  @Post('monitoring/start')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Start real-time monitoring for a trader' })
+  async startMonitoring(@Body('traderId') traderId: string) {
+    this.monitorService.startTraderMonitoring(traderId);
+    return { message: 'Monitoring started', traderId };
+  }
+
+  @Post('monitoring/stop')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Stop real-time monitoring for a trader' })
+  async stopMonitoring(@Body('traderId') traderId: string) {
+    this.monitorService.stopTraderMonitoring(traderId);
+    return { message: 'Monitoring stopped', traderId };
+  }
+
+  @Get('monitoring/status')
+  @ApiOperation({
+    summary: 'Get current monitoring status and active sessions',
+  })
+  async getMonitoringStatus() {
+    return this.monitorService.getMonitoringStatus();
+  }
+
+  // ─── Prevention Management ────────────────────────────────────────────────
+
+  @Post('prevention/block')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Manually block a trader' })
+  async blockTrader(
+    @Body('traderId') traderId: string,
+    @Body('reason') reason: string,
+    @Body('durationHours') durationHours?: number,
+  ) {
+    this.preventionService.blockTrader(
+      traderId,
+      reason,
+      FraudSeverity.HIGH,
+      durationHours,
+    );
+    return { message: 'Trader blocked', traderId };
+  }
+
+  @Post('prevention/unblock')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Unblock a trader' })
+  async unblockTrader(@Body('traderId') traderId: string) {
+    const removed = this.preventionService.unblockTrader(traderId);
+    return {
+      message: removed ? 'Trader unblocked' : 'Trader not found in blocklist',
+      traderId,
+    };
+  }
+
+  @Get('prevention/blocked')
+  @ApiOperation({ summary: 'Get list of all blocked traders' })
+  async getBlockedTraders() {
+    return this.preventionService.getBlockedTraders();
+  }
+
+  @Post('prevention/whitelist/add')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Add a trader to the whitelist' })
+  async addToWhitelist(@Body('traderId') traderId: string) {
+    this.preventionService.addToWhitelist(traderId);
+    return { message: 'Trader added to whitelist', traderId };
+  }
+
+  @Post('prevention/whitelist/remove')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Remove a trader from the whitelist' })
+  async removeFromWhitelist(@Body('traderId') traderId: string) {
+    this.preventionService.removeFromWhitelist(traderId);
+    return { message: 'Trader removed from whitelist', traderId };
+  }
+
+  // ─── Metrics & Analytics ──────────────────────────────────────────────────
+
+  @Get('metrics')
+  @ApiOperation({ summary: 'Get fraud detection system metrics' })
+  @ApiResponse({ status: 200, description: 'System metrics dashboard' })
+  async getMetrics() {
+    const [caseMetrics, preventionStats, mlMetrics] = await Promise.all([
+      this.reportingService.getMetrics(),
+      Promise.resolve(this.preventionService.getPreventionStats()),
+      Promise.resolve(this.mlService.getModelMetrics()),
+    ]);
+
+    return {
+      lastUpdated: new Date(),
+      cases: caseMetrics,
+      prevention: preventionStats,
+      ml: mlMetrics,
+      monitoring: this.monitorService.getMonitoringStatus(),
+    };
+  }
+
+  // ─── Pattern Catalogue ────────────────────────────────────────────────────
+
+  @Get('patterns')
+  @ApiOperation({
+    summary: 'Get catalogue of all 50+ registered fraud patterns',
+  })
+  @ApiResponse({ status: 200, description: 'Pattern definitions' })
+  async getPatterns() {
+    return {
+      patterns: this.patternService.getAllPatternDefinitions(),
+      total: this.patternService.getAllPatternDefinitions().length,
+    };
+  }
+
+  // ─── ML Model ─────────────────────────────────────────────────────────────
+
+  @Get('ml/metrics')
+  @ApiOperation({ summary: 'Get ML model performance metrics' })
+  @ApiResponse({ status: 200, description: 'ML model metrics' })
+  async getMlMetrics() {
+    return this.mlService.getModelMetrics();
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/fraud-detection.module.ts.html b/coverage/lcov-report/src/fraud/fraud-detection.module.ts.html new file mode 100644 index 0000000..775a1ba --- /dev/null +++ b/coverage/lcov-report/src/fraud/fraud-detection.module.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/fraud/fraud-detection.module.ts + + + + + + + + + +
+
+

All files / src/fraud fraud-detection.module.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { FraudCaseEntity } from './entities/fraud-case.entity';
+import { FraudMlService } from './ml/fraud-ml.service';
+import { PatternRecognitionService } from './patterns/pattern-recognition.service';
+import { RealTimeMonitorService } from './monitoring/real-time-monitor.service';
+import { SuspiciousActivityService } from './reporting/suspicious-activity.service';
+import { FraudPreventionService } from './prevention/fraud-prevention.service';
+import { FraudDetectionController } from './fraud-detection.controller';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([FraudCaseEntity])],
+  controllers: [FraudDetectionController],
+  providers: [
+    FraudMlService,
+    PatternRecognitionService,
+    RealTimeMonitorService,
+    SuspiciousActivityService,
+    FraudPreventionService,
+  ],
+  exports: [
+    FraudMlService,
+    PatternRecognitionService,
+    RealTimeMonitorService,
+    SuspiciousActivityService,
+    FraudPreventionService,
+  ],
+})
+export class FraudDetectionModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/index.html b/coverage/lcov-report/src/fraud/index.html new file mode 100644 index 0000000..d0b970c --- /dev/null +++ b/coverage/lcov-report/src/fraud/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/fraud + + + + + + + + + +
+
+

All files src/fraud

+
+ +
+ 0% + Statements + 0/296 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/296 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
fraud-detection.controller.ts +
+
0%0/2670%0/10%0/10%0/267
fraud-detection.module.ts +
+
0%0/290%0/10%0/10%0/29
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/ml/fraud-ml.service.ts.html b/coverage/lcov-report/src/fraud/ml/fraud-ml.service.ts.html new file mode 100644 index 0000000..5338429 --- /dev/null +++ b/coverage/lcov-report/src/fraud/ml/fraud-ml.service.ts.html @@ -0,0 +1,1297 @@ + + + + + + Code coverage report for src/fraud/ml/fraud-ml.service.ts + + + + + + + + + +
+
+

All files / src/fraud/ml fraud-ml.service.ts

+
+ +
+ 93.06% + Statements + 376/404 +
+ + +
+ 67.16% + Branches + 45/67 +
+ + +
+ 100% + Functions + 20/20 +
+ + +
+ 93.06% + Lines + 376/404 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +4051x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +13x +13x +13x +1x +1x +1x +1x +1x +1x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +  +  +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +1x +1x +1x +1x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +1x +1x +125x +125x +125x +125x +125x +9x +9x +9x +9x +9x +9x +9x +1x +1x +125x +9x +9x +125x +125x +125x +125x +9x +9x +1x +1x +125x +125x +125x +125x +125x +123x +123x +1x +1x +125x +125x +125x +1x +1x +125x +125x +125x +125x +1x +125x +1x +1x +124x +124x +124x +1x +1x +125x +125x +125x +125x +125x +125x +125x +1x +1x +125x +125x +125x +125x +1x +1x +125x +125x +  +  +125x +  +  +1x +1x +125x +125x +125x +125x +125x +125x +125x +1x +1x +1x +1x +1x +1x +1x +1x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +1250x +1250x +125x +125x +125x +125x +125x +125x +1x +1x +125x +125x +125x +125x +125x +1x +1x +125x +125x +125x +125x +125x +1x +1x +1x +1x +125x +125x +125x +125x +125x +125x +125x +125x +1x +1x +1x +1x +1x +1x +1x +1x +125x +125x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +125x +125x +  +  +  +  +  +  +  +  +125x +125x +  +  +  +  +  +  +  +125x +125x +  +  +  +  +  +  +  +125x +125x +125x +1x +1x +1x +1x +125x +17x +17x +108x +108x +108x +108x +108x +108x +108x +108x +108x +108x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +1x +1x +1x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +125x +1x +1x +1x +1x +1x +2x +1x +1x +1x +1x +1x +1x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { FraudCaseEntity } from '../entities/fraud-case.entity';
+import {
+  AnalyzeTradeDto,
+  EvidenceItem,
+  FraudSeverity,
+  FraudType,
+} from '../dto/fraud-alert.dto';
+ 
+interface TraderBaseline {
+  traderId: string;
+  avgVolume: number;
+  avgFrequency: number;
+  avgPriceDeviation: number;
+  avgOrderToTradeRatio: number;
+  tradeCount: number;
+  lastUpdated: Date;
+}
+ 
+interface MlFeatures {
+  volumeAnomaly: number;
+  frequencyAnomaly: number;
+  priceImpactScore: number;
+  orderToTradeRatio: number;
+  roundTripScore: number;
+  velocityScore: number;
+  counterpartyConcentration: number;
+  timePatternAnomaly: number;
+  marketImpactScore: number;
+  cancellationRate: number;
+}
+ 
+interface MlAnalysisResult {
+  score: number;
+  severity: FraudSeverity;
+  features: MlFeatures;
+  topContributors: string[];
+  evidence: EvidenceItem[];
+  processingTimeMs: number;
+}
+ 
+@Injectable()
+export class FraudMlService {
+  private readonly logger = new Logger(FraudMlService.name);
+ 
+  /** In-memory behavioral baselines per trader (rolling averages) */
+  private readonly traderBaselines = new Map<string, TraderBaseline>();
+ 
+  /** Resolved case feedback for continuous improvement */
+  private truePositives = 0;
+  private falsePositives = 0;
+  private modelVersion = '1.0.0';
+ 
+  // Configurable anomaly thresholds
+  private readonly VOLUME_ANOMALY_MULTIPLIER = 3.0;
+  private readonly FREQUENCY_ANOMALY_MULTIPLIER = 4.0;
+  private readonly HIGH_CANCELLATION_RATE = 0.7;
+  private readonly SUSPICIOUS_ROUND_TRIP_WINDOW_MS = 120_000; // 2 minutes
+  private readonly MIN_TRADES_FOR_BASELINE = 5;
+ 
+  constructor(
+    @InjectRepository(FraudCaseEntity)
+    private readonly fraudCaseRepository: Repository<FraudCaseEntity>,
+  ) {}
+ 
+  /**
+   * Primary entry point — analyszes a single trade and returns an ML fraud score.
+   * Target: <100ms processing time.
+   */
+  async analyzeTrade(tradeDto: AnalyzeTradeDto): Promise<MlAnalysisResult> {
+    const startTime = Date.now();
+    this.logger.debug(`ML analysis for trade: ${tradeDto.tradeId}`);
+ 
+    // 1. Get or initialise trader baseline
+    const baseline = await this.getOrCreateBaseline(tradeDto.traderId);
+ 
+    // 2. Extract feature vector
+    const features = this.extractFeatures(tradeDto, baseline);
+ 
+    // 3. Anomaly scoring — isolation-forest analog via normalised deviations
+    const score = this.computeAnomalyScore(features);
+ 
+    // 4. Map to severity
+    const severity = this.scoreToSeverity(score);
+ 
+    // 5. Identify top contributing features
+    const topContributors = this.getTopContributors(features);
+ 
+    // 6. Build evidence items
+    const evidence = this.buildEvidence(features, tradeDto, baseline);
+ 
+    // 7. Update baseline with this trade (rolling average, EMA)
+    this.updateBaseline(baseline, tradeDto, features);
+ 
+    const processingTimeMs = Date.now() - startTime;
+    this.logger.debug(
+      `ML score for ${tradeDto.tradeId}: ${score.toFixed(4)} (${severity}) in ${processingTimeMs}ms`,
+    );
+ 
+    if (processingTimeMs > 100) {
+      this.logger.warn(`ML analysis exceeded 100ms: ${processingTimeMs}ms`);
+    }
+ 
+    return {
+      score,
+      severity,
+      features,
+      topContributors,
+      evidence,
+      processingTimeMs,
+    };
+  }
+ 
+  // ─── Feature Extraction ──────────────────────────────────────────────────
+ 
+  private extractFeatures(
+    tradeDto: AnalyzeTradeDto,
+    baseline: TraderBaseline,
+  ): MlFeatures {
+    return {
+      volumeAnomaly: this.computeVolumeAnomaly(tradeDto.quantity, baseline),
+      frequencyAnomaly: this.computeFrequencyAnomaly(baseline),
+      priceImpactScore: this.computePriceImpact(tradeDto),
+      orderToTradeRatio: this.computeOrderToTradeRatio(baseline),
+      roundTripScore: this.computeRoundTripScore(tradeDto),
+      velocityScore: this.computeVelocityScore(baseline),
+      counterpartyConcentration:
+        this.computeCounterpartyConcentration(tradeDto),
+      timePatternAnomaly: this.computeTimePatternAnomaly(tradeDto),
+      marketImpactScore: this.computeMarketImpact(tradeDto, baseline),
+      cancellationRate:
+        baseline.avgOrderToTradeRatio > 0
+          ? Math.min(1, baseline.avgOrderToTradeRatio)
+          : 0,
+    };
+  }
+ 
+  private computeVolumeAnomaly(
+    quantity: number,
+    baseline: TraderBaseline,
+  ): number {
+    if (baseline.tradeCount < this.MIN_TRADES_FOR_BASELINE) return 0.1;
+    if (baseline.avgVolume === 0) return 0.1;
+    const ratio = quantity / baseline.avgVolume;
+    // Normalise: ratio of 1 → 0, ratio of MULTIPLIER → 1.0
+    return Math.min(
+      1,
+      Math.max(0, (ratio - 1) / (this.VOLUME_ANOMALY_MULTIPLIER - 1)),
+    );
+  }
+ 
+  private computeFrequencyAnomaly(baseline: TraderBaseline): number {
+    if (baseline.tradeCount < this.MIN_TRADES_FOR_BASELINE) return 0.05;
+    // Trades per hour — high frequency is suspicious
+    const tradesPerHour = baseline.avgFrequency;
+    if (tradesPerHour > 100) return 1.0;
+    if (tradesPerHour > 50) return 0.8;
+    if (tradesPerHour > 20) return 0.5;
+    if (tradesPerHour > 10) return 0.3;
+    return Math.min(0.2, tradesPerHour / 50);
+  }
+ 
+  private computePriceImpact(tradeDto: AnalyzeTradeDto): number {
+    // Large orders that could move the market
+    const normalizedValue = tradeDto.tradeValue / 1_000_000; // per $1M
+    if (normalizedValue > 100) return 0.9;
+    if (normalizedValue > 50) return 0.6;
+    if (normalizedValue > 10) return 0.3;
+    return Math.min(0.2, normalizedValue / 50);
+  }
+ 
+  private computeOrderToTradeRatio(baseline: TraderBaseline): number {
+    // High cancellation / order placement without execution
+    return Math.min(1, Math.max(0, baseline.avgOrderToTradeRatio - 0.3) / 0.7);
+  }
+ 
+  private computeRoundTripScore(tradeDto: AnalyzeTradeDto): number {
+    // Simplified: look for back-and-forth trades with same counterparty
+    // In production, this would query recent trades from DB
+    if (
+      tradeDto.counterpartyId &&
+      tradeDto.counterpartyId === tradeDto.traderId
+    ) {
+      return 1.0; // Self-trade
+    }
+    // Placeholder — real impl queries recent opposite trades
+    return 0.05;
+  }
+ 
+  private computeVelocityScore(baseline: TraderBaseline): number {
+    const recentFrequency = baseline.avgFrequency;
+    // Burst trading: normalized 0-1
+    return Math.min(
+      1,
+      recentFrequency / this.FREQUENCY_ANOMALY_MULTIPLIER / 10,
+    );
+  }
+ 
+  private computeCounterpartyConcentration(tradeDto: AnalyzeTradeDto): number {
+    // Consistently trading with same counterparty = potential wash
+    // Simplified heuristic; production would use DB aggregation
+    return tradeDto.counterpartyId ? 0.15 : 0.05;
+  }
+ 
+  private computeTimePatternAnomaly(tradeDto: AnalyzeTradeDto): number {
+    // Trades at market open/close are suspicious for banging-the-close
+    if (!tradeDto.tradeTimestamp) return 0.05;
+    const hour = new Date(tradeDto.tradeTimestamp).getUTCHours();
+    // Flag trades near market open (8-9 UTC) or close (15-16 UTC)
+    if ((hour >= 8 && hour <= 9) || (hour >= 15 && hour <= 16)) return 0.3;
+    return 0.05;
+  }
+ 
+  private computeMarketImpact(
+    tradeDto: AnalyzeTradeDto,
+    baseline: TraderBaseline,
+  ): number {
+    // Estimate if this trade could move the market
+    const relativeSize = tradeDto.quantity / Math.max(baseline.avgVolume, 1);
+    return Math.min(1, relativeSize / 10);
+  }
+ 
+  // ─── Scoring Engine (Isolation Forest Analog) ────────────────────────────
+ 
+  /**
+   * Weighted ensemble of normalised feature scores → 0-1 anomaly score.
+   * Weights are calibrated to detect the most common fraud types first.
+   */
+  private computeAnomalyScore(features: MlFeatures): number {
+    const weights: Record<keyof MlFeatures, number> = {
+      roundTripScore: 0.2, // Wash trading — highest weight
+      volumeAnomaly: 0.18,
+      cancellationRate: 0.15, // Spoofing / layering
+      frequencyAnomaly: 0.13,
+      orderToTradeRatio: 0.12,
+      priceImpactScore: 0.08,
+      counterpartyConcentration: 0.06,
+      marketImpactScore: 0.04,
+      timePatternAnomaly: 0.02,
+      velocityScore: 0.02,
+    };
+ 
+    let score = 0;
+    for (const [feature, weight] of Object.entries(weights)) {
+      score += (features[feature as keyof MlFeatures] ?? 0) * weight;
+    }
+ 
+    // Apply non-linear amplification for high-score cases (makes top-tier more distinguishable)
+    if (score > 0.7) score = 0.7 + (score - 0.7) * 1.5;
+ 
+    return Math.min(1, parseFloat(score.toFixed(4)));
+  }
+ 
+  private scoreToSeverity(score: number): FraudSeverity {
+    if (score >= 0.85) return FraudSeverity.CRITICAL;
+    if (score >= 0.65) return FraudSeverity.HIGH;
+    if (score >= 0.4) return FraudSeverity.MEDIUM;
+    return FraudSeverity.LOW;
+  }
+ 
+  private getTopContributors(features: MlFeatures): string[] {
+    return Object.entries(features)
+      .sort(([, a], [, b]) => b - a)
+      .slice(0, 3)
+      .map(([k]) => k);
+  }
+ 
+  // ─── Evidence Builder ────────────────────────────────────────────────────
+ 
+  private buildEvidence(
+    features: MlFeatures,
+    tradeDto: AnalyzeTradeDto,
+    baseline: TraderBaseline,
+  ): EvidenceItem[] {
+    const items: EvidenceItem[] = [];
+    const now = new Date();
+ 
+    if (features.roundTripScore > 0.5) {
+      items.push({
+        type: 'round_trip_detection',
+        description:
+          'Potential round-trip / wash trade detected with same counterparty',
+        value: features.roundTripScore,
+        timestamp: now,
+      });
+    }
+ 
+    if (features.volumeAnomaly > 0.5) {
+      items.push({
+        type: 'volume_anomaly',
+        description: `Trade volume ${tradeDto.quantity} is ${(tradeDto.quantity / Math.max(baseline.avgVolume, 1)).toFixed(1)}x above trader baseline`,
+        value: {
+          tradeVolume: tradeDto.quantity,
+          baselineAvg: baseline.avgVolume,
+        },
+        timestamp: now,
+      });
+    }
+ 
+    if (features.cancellationRate > 0.5) {
+      items.push({
+        type: 'high_cancellation_rate',
+        description:
+          'Trader exhibits high order cancellation rate consistent with spoofing',
+        value: features.cancellationRate,
+        timestamp: now,
+      });
+    }
+ 
+    if (features.frequencyAnomaly > 0.5) {
+      items.push({
+        type: 'frequency_anomaly',
+        description: `Abnormal trading frequency: ${baseline.avgFrequency.toFixed(1)} trades/hour`,
+        value: baseline.avgFrequency,
+        timestamp: now,
+      });
+    }
+ 
+    if (features.priceImpactScore > 0.4) {
+      items.push({
+        type: 'large_price_impact',
+        description: `Trade value $${tradeDto.tradeValue.toLocaleString()} may significantly impact market price`,
+        value: tradeDto.tradeValue,
+        timestamp: now,
+      });
+    }
+ 
+    return items;
+  }
+ 
+  // ─── Baseline Management ─────────────────────────────────────────────────
+ 
+  private async getOrCreateBaseline(traderId: string): Promise<TraderBaseline> {
+    if (this.traderBaselines.has(traderId)) {
+      return this.traderBaselines.get(traderId);
+    }
+ 
+    // Attempt to seed from historical data
+    const historicalCases = await this.fraudCaseRepository.find({
+      where: { traderId },
+      order: { createdAt: 'DESC' },
+      take: 100,
+    });
+ 
+    const baseline: TraderBaseline = {
+      traderId,
+      avgVolume: historicalCases.length > 0 ? 1000 : 500,
+      avgFrequency: 5,
+      avgPriceDeviation: 0.02,
+      avgOrderToTradeRatio: 0.1,
+      tradeCount: historicalCases.length,
+      lastUpdated: new Date(),
+    };
+ 
+    this.traderBaselines.set(traderId, baseline);
+    return baseline;
+  }
+ 
+  /** Exponential moving average update to keep baseline fresh */
+  private updateBaseline(
+    baseline: TraderBaseline,
+    tradeDto: AnalyzeTradeDto,
+    features: MlFeatures,
+  ): void {
+    const alpha = 0.1; // EMA decay factor
+    baseline.avgVolume =
+      (1 - alpha) * baseline.avgVolume + alpha * tradeDto.quantity;
+    baseline.avgFrequency =
+      (1 - alpha) * baseline.avgFrequency +
+      alpha * (baseline.avgFrequency + 0.1);
+    baseline.avgPriceDeviation =
+      (1 - alpha) * baseline.avgPriceDeviation +
+      alpha * features.priceImpactScore;
+    baseline.tradeCount += 1;
+    baseline.lastUpdated = new Date();
+  }
+ 
+  // ─── Continuous Improvement ──────────────────────────────────────────────
+ 
+  /** Called when an investigator resolves a case — feeds back into model accuracy tracking */
+  recordFeedback(caseId: string, wasTruePositive: boolean): void {
+    if (wasTruePositive) {
+      this.truePositives++;
+    } else {
+      this.falsePositives++;
+      // On false positive: relax the threshold for that trader's baseline
+      this.logger.log(`False positive feedback recorded for case ${caseId}`);
+    }
+  }
+ 
+  getModelMetrics(): object {
+    const total = this.truePositives + this.falsePositives;
+    const precision = total > 0 ? this.truePositives / total : 0;
+    return {
+      modelVersion: this.modelVersion,
+      truePositives: this.truePositives,
+      falsePositives: this.falsePositives,
+      precision: parseFloat(precision.toFixed(4)),
+      activeBaselines: this.traderBaselines.size,
+    };
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/ml/index.html b/coverage/lcov-report/src/fraud/ml/index.html new file mode 100644 index 0000000..d2eae9c --- /dev/null +++ b/coverage/lcov-report/src/fraud/ml/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/fraud/ml + + + + + + + + + +
+
+

All files src/fraud/ml

+
+ +
+ 93.06% + Statements + 376/404 +
+ + +
+ 67.16% + Branches + 45/67 +
+ + +
+ 100% + Functions + 20/20 +
+ + +
+ 93.06% + Lines + 376/404 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
fraud-ml.service.ts +
+
93.06%376/40467.16%45/67100%20/2093.06%376/404
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/monitoring/index.html b/coverage/lcov-report/src/fraud/monitoring/index.html new file mode 100644 index 0000000..8575aa9 --- /dev/null +++ b/coverage/lcov-report/src/fraud/monitoring/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/fraud/monitoring + + + + + + + + + +
+
+

All files src/fraud/monitoring

+
+ +
+ 78.79% + Statements + 327/415 +
+ + +
+ 77.08% + Branches + 37/48 +
+ + +
+ 75% + Functions + 15/20 +
+ + +
+ 78.79% + Lines + 327/415 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
real-time-monitor.service.ts +
+
78.79%327/41577.08%37/4875%15/2078.79%327/415
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/monitoring/real-time-monitor.service.ts.html b/coverage/lcov-report/src/fraud/monitoring/real-time-monitor.service.ts.html new file mode 100644 index 0000000..a8a714a --- /dev/null +++ b/coverage/lcov-report/src/fraud/monitoring/real-time-monitor.service.ts.html @@ -0,0 +1,1330 @@ + + + + + + Code coverage report for src/fraud/monitoring/real-time-monitor.service.ts + + + + + + + + + +
+
+

All files / src/fraud/monitoring real-time-monitor.service.ts

+
+ +
+ 78.79% + Statements + 327/415 +
+ + +
+ 77.08% + Branches + 37/48 +
+ + +
+ 75% + Functions + 15/20 +
+ + +
+ 78.79% + Lines + 327/415 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +4161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +14x +14x +14x +14x +14x +14x +14x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +  +  +6x +6x +6x +1x +1x +1x +10x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +3x +3x +  +3x +3x +3x +3x +3x +3x +1x +1x +1x +16x +3x +3x +3x +3x +16x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +  +  +6x +1x +1x +1x +  +  +  +1x +1x +6x +6x +  +  +  +  +  +  +6x +6x +1x +1x +6x +6x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +1x +1x +6x +6x +6x +5x +5x +1x +1x +6x +1x +1x +6x +  +  +6x +  +  +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +15x +15x +15x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { Cron } from '@nestjs/schedule';
+import {
+  FraudCaseEntity,
+  FraudCaseStatus,
+  FraudSeverity,
+} from '../entities/fraud-case.entity';
+import { FraudMlService } from '../ml/fraud-ml.service';
+import { PatternRecognitionService } from '../patterns/pattern-recognition.service';
+import { SuspiciousActivityService } from '../reporting/suspicious-activity.service';
+import { FraudPreventionService } from '../prevention/fraud-prevention.service';
+import { AnalyzeTradeDto, FraudAnalysisResult } from '../dto/fraud-alert.dto';
+import { v4 as uuidv4 } from 'uuid';
+ 
+interface MonitoredTrader {
+  traderId: string;
+  startedAt: Date;
+  recentTrades: AnalyzeTradeDto[];
+  alertCount: number;
+  lastChecked: Date;
+}
+ 
+@Injectable()
+export class RealTimeMonitorService {
+  private readonly logger = new Logger(RealTimeMonitorService.name);
+ 
+  /** Active monitoring sessions keyed by traderId */
+  private readonly monitoredTraders = new Map<string, MonitoredTrader>();
+ 
+  /** Pending trade queue awaiting analysis (buffered for batch efficiency) */
+  private readonly pendingTrades: AnalyzeTradeDto[] = [];
+ 
+  /** Sliding window: max trades kept per trader for pattern context */
+  private readonly CONTEXT_WINDOW_SIZE = 50;
+ 
+  /** Processing interval — ensures flags within 30s requirement */
+  private readonly MONITORING_INTERVAL_MS = 15_000;
+ 
+  /** ML score above this triggers immediate alert */
+  private readonly ALERT_THRESHOLD = 0.65;
+ 
+  private monitoringInterval: NodeJS.Timeout | null = null;
+ 
+  constructor(
+    @InjectRepository(FraudCaseEntity)
+    private readonly fraudCaseRepository: Repository<FraudCaseEntity>,
+    private readonly mlService: FraudMlService,
+    private readonly patternService: PatternRecognitionService,
+    private readonly reportingService: SuspiciousActivityService,
+    private readonly preventionService: FraudPreventionService,
+  ) {}
+ 
+  // ─── Public API ──────────────────────────────────────────────────────────
+ 
+  /**
+   * Primary entry point: analyse a trade through the full pipeline.
+   * Target: <100ms processing time.
+   */
+  async analyzeIncomingTrade(
+    tradeDto: AnalyzeTradeDto,
+  ): Promise<FraudAnalysisResult> {
+    const startTime = Date.now();
+    this.logger.debug(`Analyzing incoming trade: ${tradeDto.tradeId}`);
+ 
+    // Update trader context window (but do NOT add to pendingTrades queue
+    // since this method is called directly — queue is only for batch intake)
+    this.updateTraderContext(tradeDto);
+ 
+    // Get context (recent trades for this trader)
+    const context = this.getTraderContext(tradeDto.traderId);
+ 
+    // 1. ML anomaly scoring
+    const mlResult = await this.mlService.analyzeTrade(tradeDto);
+ 
+    // 2. Pattern matching
+    const patterns = this.patternService.analyzePatterns(tradeDto, {
+      recentTrades: context.recentTrades.filter(
+        (t) => t.tradeId !== tradeDto.tradeId,
+      ),
+    });
+    const matchedPatterns = patterns.filter((p) => p.matched);
+ 
+    // 3. Compute combined score (ML + pattern ensemble)
+    const combinedScore = this.combineScores(mlResult.score, matchedPatterns);
+ 
+    // 4. Determine if suspicious
+    const isSuspicious = combinedScore >= this.ALERT_THRESHOLD;
+ 
+    // 5. Infer fraud types from matched patterns
+    const fraudTypes = this.patternService.inferFraudTypes(matchedPatterns);
+ 
+    // 6. Determine severity
+    const severity = this.scoreToSeverity(combinedScore);
+ 
+    // 7. Auto-generate case if suspicious — get the real savedCaseId back
+    let savedCaseId = '';
+    if (isSuspicious) {
+      const savedCase = await this.createFraudCase(
+        tradeDto,
+        combinedScore,
+        severity,
+        fraudTypes,
+        matchedPatterns,
+        mlResult.evidence,
+      );
+      savedCaseId = savedCase.caseId;
+    }
+ 
+    const processingTimeMs = Date.now() - startTime;
+ 
+    const result: FraudAnalysisResult = {
+      caseId: savedCaseId,
+      tradeId: tradeDto.tradeId,
+      traderId: tradeDto.traderId,
+      isSuspicious,
+      mlScore: combinedScore,
+      severity,
+      fraudTypes,
+      patternsMatched: matchedPatterns,
+      evidence: mlResult.evidence,
+      recommendedAction: this.getRecommendedAction(severity, combinedScore),
+      processingTimeMs,
+    };
+ 
+    if (processingTimeMs > 100) {
+      this.logger.warn(`Trade analysis exceeded 100ms: ${processingTimeMs}ms`);
+    }
+ 
+    return result;
+  }
+ 
+  /** Start real-time monitoring for a specific trader */
+  startTraderMonitoring(traderId: string): void {
+    if (this.monitoredTraders.has(traderId)) {
+      this.logger.debug(`Monitoring already active for trader: ${traderId}`);
+      return;
+    }
+ 
+    const session: MonitoredTrader = {
+      traderId,
+      startedAt: new Date(),
+      recentTrades: [],
+      alertCount: 0,
+      lastChecked: new Date(),
+    };
+ 
+    this.monitoredTraders.set(traderId, session);
+    this.logger.log(`Started monitoring trader: ${traderId}`);
+  }
+ 
+  /** Stop monitoring a specific trader */
+  stopTraderMonitoring(traderId: string): void {
+    if (this.monitoredTraders.delete(traderId)) {
+      this.logger.log(`Stopped monitoring trader: ${traderId}`);
+    }
+  }
+ 
+  /** Start global monitoring loop */
+  startGlobalMonitoring(): void {
+    if (this.monitoringInterval) return;
+ 
+    this.monitoringInterval = setInterval(async () => {
+      await this.processMonitoringCycle();
+    }, this.MONITORING_INTERVAL_MS);
+ 
+    this.logger.log(
+      `Global fraud monitoring started (interval: ${this.MONITORING_INTERVAL_MS}ms)`,
+    );
+  }
+ 
+  /** Stop global monitoring loop */
+  stopGlobalMonitoring(): void {
+    if (this.monitoringInterval) {
+      clearInterval(this.monitoringInterval);
+      this.monitoringInterval = null;
+      this.logger.log('Global fraud monitoring stopped');
+    }
+  }
+ 
+  getMonitoringStatus(): object {
+    return {
+      isRunning: this.monitoringInterval !== null,
+      monitoredTraderCount: this.monitoredTraders.size,
+      pendingTradesQueue: this.pendingTrades.length,
+      monitoredTraders: Array.from(this.monitoredTraders.keys()),
+      intervalMs: this.MONITORING_INTERVAL_MS,
+      alertThreshold: this.ALERT_THRESHOLD,
+    };
+  }
+ 
+  // ─── Monitoring Loop ─────────────────────────────────────────────────────
+ 
+  /** Scheduled every 15s — fulfils the <30s flagging requirement */
+  @Cron('*/15 * * * * *')
+  async processMonitoringCycle(): Promise<void> {
+    if (this.pendingTrades.length === 0 && this.monitoredTraders.size === 0)
+      return;
+
+    this.logger.debug(
+      `Monitoring cycle: ${this.pendingTrades.length} queued trades`,
+    );
+
+    // Drain the batch queue — these are trades submitted for async monitoring
+    const batch = this.pendingTrades.splice(0, 100);
+    for (const trade of batch) {
+      try {
+        await this.analyzeIncomingTrade(trade);
+      } catch (err) {
+        this.logger.error(`Error analyzing trade ${trade.tradeId}: ${err}`);
+      }
+    }
+
+    // Sweep monitored traders for anomalies
+    for (const [traderId, session] of this.monitoredTraders) {
+      await this.sweepTrader(traderId, session);
+    }
+  }
+ 
+  @Cron('0 */1 * * * *') // every 1 minute
+  async generateMonitoringReport(): Promise<void> {
+    const activeCount = this.monitoredTraders.size;
+    if (activeCount === 0) return;
+
+    const openCases = await this.fraudCaseRepository.count({
+      where: { status: FraudCaseStatus.OPEN },
+    });
+
+    this.logger.log(
+      `Fraud monitoring report: ${activeCount} monitored traders, ${openCases} open cases`,
+    );
+  }
+ 
+  @Cron('0 0 * * * *') // top of every hour
+  async hourlyEscalation(): Promise<void> {
+    this.logger.log('Running hourly escalation sweep');
+
+    const criticalCases = await this.fraudCaseRepository.find({
+      where: { severity: FraudSeverity.CRITICAL, status: FraudCaseStatus.OPEN },
+    });
+
+    for (const c of criticalCases) {
+      await this.fraudCaseRepository.update(c.id, {
+        status: FraudCaseStatus.ESCALATED,
+      });
+      this.logger.warn(
+        `CRITICAL case escalated: ${c.caseId} — trader ${c.traderId}`,
+      );
+    }
+  }
+ 
+  // ─── Private Helpers ─────────────────────────────────────────────────────
+ 
+  private async sweepTrader(
+    traderId: string,
+    session: MonitoredTrader,
+  ): Promise<void> {
+    const timeSinceCheck = Date.now() - session.lastChecked.getTime();
+    if (timeSinceCheck < this.MONITORING_INTERVAL_MS) return;
+
+    session.lastChecked = new Date();
+
+    if (session.recentTrades.length === 0) return;
+
+    // Detect behavioural shifts in the trader's recent window
+    const highValueTrades = session.recentTrades.filter(
+      (t) => t.tradeValue > 1_000_000,
+    );
+
+    if (highValueTrades.length >= 3) {
+      this.logger.warn(
+        `Trader ${traderId} has ${highValueTrades.length} high-value trades in monitoring window`,
+      );
+      session.alertCount++;
+    }
+  }
+ 
+  /** Update trader context window without queueing for re-analysis */
+  private updateTraderContext(tradeDto: AnalyzeTradeDto): void {
+    if (!this.monitoredTraders.has(tradeDto.traderId)) {
+      this.startTraderMonitoring(tradeDto.traderId);
+    }
+ 
+    const session = this.monitoredTraders.get(tradeDto.traderId);
+    session.recentTrades.push(tradeDto);
+ 
+    // Sliding window — trim oldest
+    if (session.recentTrades.length > this.CONTEXT_WINDOW_SIZE) {
+      session.recentTrades.shift();
+    }
+  }
+ 
+  /** Queue a trade for async batch analysis (does NOT analyze it inline) */
+  enqueuePendingTrade(tradeDto: AnalyzeTradeDto): void {
+    this.pendingTrades.push(tradeDto);
+    this.updateTraderContext(tradeDto);
+  }
+ 
+  private getTraderContext(traderId: string): MonitoredTrader {
+    return (
+      this.monitoredTraders.get(traderId) ?? {
+        traderId,
+        startedAt: new Date(),
+        recentTrades: [],
+        alertCount: 0,
+        lastChecked: new Date(),
+      }
+    );
+  }
+ 
+  private combineScores(
+    mlScore: number,
+    matchedPatterns: { confidence: number }[],
+  ): number {
+    if (matchedPatterns.length === 0) return mlScore;
+ 
+    const avgPatternScore =
+      matchedPatterns.reduce((s, p) => s + p.confidence, 0) /
+      matchedPatterns.length;
+ 
+    // Weighted ensemble: 60% ML, 40% patterns
+    const combined = mlScore * 0.6 + avgPatternScore * 0.4;
+ 
+    // Boost when both agree
+    const boost = mlScore > 0.5 && avgPatternScore > 0.5 ? 0.1 : 0;
+ 
+    return Math.min(1, parseFloat((combined + boost).toFixed(4)));
+  }
+ 
+  private scoreToSeverity(score: number): FraudSeverity {
+    if (score >= 0.85) return FraudSeverity.CRITICAL;
+    if (score >= 0.65) return FraudSeverity.HIGH;
+    if (score >= 0.4) return FraudSeverity.MEDIUM;
+    return FraudSeverity.LOW;
+  }
+ 
+  private getRecommendedAction(severity: FraudSeverity, score: number): string {
+    if (severity === FraudSeverity.CRITICAL || score >= 0.9) {
+      return 'BLOCK_TRADE: Immediate block and escalate to compliance';
+    }
+    if (severity === FraudSeverity.HIGH) {
+      return 'HOLD_AND_REVIEW: Flag for manual investigator review within 1 hour';
+    }
+    if (severity === FraudSeverity.MEDIUM) {
+      return 'MONITOR: Continue monitoring, alert on next suspicious activity';
+    }
+    return 'LOG: No action required, trade logged for audit trail';
+  }
+ 
+  private generateCaseId(): string {
+    const date = new Date().toISOString().slice(0, 10).replace(/-/g, '');
+    return `FRAUD-${date}-${uuidv4().slice(0, 8).toUpperCase()}`;
+  }
+ 
+  private async createFraudCase(
+    tradeDto: AnalyzeTradeDto,
+    score: number,
+    severity: FraudSeverity,
+    fraudTypes: any[],
+    patterns: any[],
+    evidence: any[],
+  ): Promise<FraudCaseEntity> {
+    const caseId = this.generateCaseId();
+ 
+    const fraudCase = this.fraudCaseRepository.create({
+      caseId,
+      tradeId: tradeDto.tradeId,
+      traderId: tradeDto.traderId,
+      counterpartyId: tradeDto.counterpartyId,
+      fraudType: fraudTypes[0] ?? 'unknown',
+      severity,
+      status: FraudCaseStatus.OPEN,
+      mlScore: score,
+      patternMatched: patterns[0]?.patternName ?? null,
+      patternsTriggered: patterns.map((p) => p.patternId),
+      evidence,
+      tradeData: {
+        market: tradeDto.market,
+        assetType: tradeDto.assetType,
+        quantity: tradeDto.quantity,
+        price: tradeDto.price,
+        side: tradeDto.side,
+      },
+      market: tradeDto.market,
+      assetType: tradeDto.assetType,
+      tradeValue: tradeDto.tradeValue,
+      regulatoryReported: false,
+      preventionApplied: severity === FraudSeverity.CRITICAL,
+      preventionAction:
+        severity === FraudSeverity.CRITICAL ? 'auto_block' : null,
+    });
+ 
+    const saved = await this.fraudCaseRepository.save(fraudCase);
+ 
+    // Auto-generate SAR for HIGH/CRITICAL
+    if (
+      severity === FraudSeverity.HIGH ||
+      severity === FraudSeverity.CRITICAL
+    ) {
+      await this.reportingService.generateSAR(saved);
+    }
+ 
+    this.logger.warn(
+      `Fraud case created: ${caseId} | Trader: ${tradeDto.traderId} | Score: ${score} | Severity: ${severity}`,
+    );
+ 
+    return saved;
+  }
+ 
+  onModuleDestroy(): void {
+    this.stopGlobalMonitoring();
+    this.monitoredTraders.clear();
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/patterns/index.html b/coverage/lcov-report/src/fraud/patterns/index.html new file mode 100644 index 0000000..9b14122 --- /dev/null +++ b/coverage/lcov-report/src/fraud/patterns/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/fraud/patterns + + + + + + + + + +
+
+

All files src/fraud/patterns

+
+ +
+ 98.94% + Statements + 939/949 +
+ + +
+ 76.11% + Branches + 153/201 +
+ + +
+ 100% + Functions + 45/45 +
+ + +
+ 98.94% + Lines + 939/949 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
pattern-recognition.service.ts +
+
98.94%939/94976.11%153/201100%45/4598.94%939/949
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/patterns/pattern-recognition.service.ts.html b/coverage/lcov-report/src/fraud/patterns/pattern-recognition.service.ts.html new file mode 100644 index 0000000..79f04b2 --- /dev/null +++ b/coverage/lcov-report/src/fraud/patterns/pattern-recognition.service.ts.html @@ -0,0 +1,2932 @@ + + + + + + Code coverage report for src/fraud/patterns/pattern-recognition.service.ts + + + + + + + + + +
+
+

All files / src/fraud/patterns pattern-recognition.service.ts

+
+ +
+ 98.94% + Statements + 939/949 +
+ + +
+ 76.11% + Branches + 153/201 +
+ + +
+ 100% + Functions + 45/45 +
+ + +
+ 98.94% + Lines + 939/949 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +9501x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +22x +22x +22x +22x +22x +1x +1x +1x +1x +1x +1x +14x +14x +14x +14x +546x +546x +546x +  +  +  +  +  +  +  +  +  +  +14x +14x +14x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +117x +117x +117x +117x +3x +3x +1x +1x +1x +1x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +1x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +22x +22x +22x +22x +14x +14x +14x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +22x +22x +22x +22x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import {
+  AnalyzeTradeDto,
+  FraudType,
+  PatternMatchResult,
+} from '../dto/fraud-alert.dto';
+ 
+interface PatternDefinition {
+  id: string;
+  name: string;
+  category: string;
+  description: string;
+  detector: (
+    trade: AnalyzeTradeDto,
+    context: PatternContext,
+  ) => PatternMatchResult;
+}
+ 
+interface PatternContext {
+  recentTrades?: AnalyzeTradeDto[];
+  traderHistory?: Record<string, unknown>;
+}
+ 
+@Injectable()
+export class PatternRecognitionService {
+  private readonly logger = new Logger(PatternRecognitionService.name);
+  private readonly patterns: PatternDefinition[];
+ 
+  constructor() {
+    this.patterns = this.registerPatterns();
+    this.logger.log(
+      `Pattern recognition engine initialized with ${this.patterns.length} patterns`,
+    );
+  }
+ 
+  /**
+   * Run all registered pattern detectors against a single trade.
+   * Returns matches for all 50+ patterns, sorted by confidence descending.
+   */
+  analyzePatterns(
+    tradeDto: AnalyzeTradeDto,
+    context: PatternContext = {},
+  ): PatternMatchResult[] {
+    const results: PatternMatchResult[] = this.patterns.map((pattern) => {
+      try {
+        return pattern.detector(tradeDto, context);
+      } catch (err) {
+        this.logger.warn(`Pattern ${pattern.id} threw error: ${err}`);
+        return {
+          patternId: pattern.id,
+          patternName: pattern.name,
+          category: pattern.category,
+          matched: false,
+          confidence: 0,
+          evidence: 'Pattern evaluation error',
+        };
+      }
+    });
+ 
+    return results.sort((a, b) => b.confidence - a.confidence);
+  }
+ 
+  /** Returns only the patterns that triggered (matched) */
+  getMatchedPatterns(
+    tradeDto: AnalyzeTradeDto,
+    context: PatternContext = {},
+  ): PatternMatchResult[] {
+    return this.analyzePatterns(tradeDto, context).filter((r) => r.matched);
+  }
+ 
+  /** Returns the catalogue of all patterns (for API exposure) */
+  getAllPatternDefinitions(): object[] {
+    return this.patterns.map(({ id, name, category, description }) => ({
+      id,
+      name,
+      category,
+      description,
+    }));
+  }
+ 
+  // ─── Pattern Registry ────────────────────────────────────────────────────
+ 
+  private registerPatterns(): PatternDefinition[] {
+    return [
+      // ── Wash Trading ──────────────────────────────────────────────────────
+      {
+        id: 'WT-001',
+        name: 'Self-Trade Detection',
+        category: 'wash_trading',
+        description: 'Buyer and seller are the same entity',
+        detector: (t) => ({
+          patternId: 'WT-001',
+          patternName: 'Self-Trade Detection',
+          category: 'wash_trading',
+          matched: !!t.counterpartyId && t.counterpartyId === t.traderId,
+          confidence: t.counterpartyId === t.traderId ? 0.99 : 0,
+          evidence: 'Counterparty ID matches trader ID',
+        }),
+      },
+      {
+        id: 'WT-002',
+        name: 'Mirror Order Detection',
+        category: 'wash_trading',
+        description: 'Simultaneous buy and sell orders of equal size',
+        detector: (t, ctx) => {
+          const recentOpposite = ctx.recentTrades?.find(
+            (rt) =>
+              rt.traderId === t.traderId &&
+              rt.side !== t.side &&
+              Math.abs(rt.quantity - t.quantity) < 0.01 &&
+              rt.market === t.market,
+          );
+          const matched = !!recentOpposite;
+          return {
+            patternId: 'WT-002',
+            patternName: 'Mirror Order Detection',
+            category: 'wash_trading',
+            matched,
+            confidence: matched ? 0.85 : 0,
+            evidence: matched
+              ? `Mirror order found: ${recentOpposite?.tradeId}`
+              : 'No mirror order detected',
+          };
+        },
+      },
+      {
+        id: 'WT-003',
+        name: 'Circular Trading Pattern',
+        category: 'wash_trading',
+        description: 'Trade forms part of a circular trading ring (A→B→C→A)',
+        detector: (t) => {
+          // Simplified: flag high-value trades as candidates for manual circular check
+          const isHighValue = t.tradeValue > 5_000_000;
+          return {
+            patternId: 'WT-003',
+            patternName: 'Circular Trading Pattern',
+            category: 'wash_trading',
+            matched: isHighValue && !!t.counterpartyId,
+            confidence: isHighValue ? 0.35 : 0,
+            evidence: 'High-value trade flagged for circular trading review',
+          };
+        },
+      },
+      {
+        id: 'WT-004',
+        name: 'Prearranged Trade',
+        category: 'wash_trading',
+        description:
+          'Trades executed at non-competitive prices, suggesting pre-arrangement',
+        detector: (t) => {
+          // Flag extreme price outliers (>20% from expected)
+          const priceAnomaly = t.price > 10000 || t.price < 0.01;
+          return {
+            patternId: 'WT-004',
+            patternName: 'Prearranged Trade',
+            category: 'wash_trading',
+            matched: priceAnomaly,
+            confidence: priceAnomaly ? 0.55 : 0,
+            evidence: `Price ${t.price} may indicate pre-arranged trade`,
+          };
+        },
+      },
+      {
+        id: 'WT-005',
+        name: 'Accommodation Trade',
+        category: 'wash_trading',
+        description:
+          'Round-lot trades at regular intervals between same parties',
+        detector: (t, ctx) => {
+          const sameCounterpartyTrades =
+            ctx.recentTrades?.filter(
+              (rt) => rt.counterpartyId === t.counterpartyId,
+            ).length ?? 0;
+          const matched = sameCounterpartyTrades >= 3;
+          return {
+            patternId: 'WT-005',
+            patternName: 'Accommodation Trade',
+            category: 'wash_trading',
+            matched,
+            confidence: matched
+              ? Math.min(0.9, sameCounterpartyTrades * 0.2)
+              : 0,
+            evidence: `${sameCounterpartyTrades} trades with same counterparty in window`,
+          };
+        },
+      },
+ 
+      // ── Spoofing ──────────────────────────────────────────────────────────
+      {
+        id: 'SP-001',
+        name: 'Classic Spoofing',
+        category: 'spoofing',
+        description:
+          'Large order placed then quickly cancelled to mislead market',
+        detector: (t) => {
+          const isLargeOrder = t.quantity > 10000;
+          const isIoc = t.timeInForce === 'IOC';
+          const matched = isLargeOrder && isIoc;
+          return {
+            patternId: 'SP-001',
+            patternName: 'Classic Spoofing',
+            category: 'spoofing',
+            matched,
+            confidence: matched ? 0.72 : 0,
+            evidence: `Large IOC order: qty=${t.quantity}, tf=${t.timeInForce}`,
+          };
+        },
+      },
+      {
+        id: 'SP-002',
+        name: 'Iceberg Spoofing',
+        category: 'spoofing',
+        description:
+          'Hidden large orders used to manipulate visible order book',
+        detector: (t) => {
+          const ratio = t.tradeValue / Math.max(t.quantity * t.price, 1);
+          const anomalousRatio = ratio > 1.5 || ratio < 0.5;
+          return {
+            patternId: 'SP-002',
+            patternName: 'Iceberg Spoofing',
+            category: 'spoofing',
+            matched: anomalousRatio,
+            confidence: anomalousRatio ? 0.45 : 0,
+            evidence: `Anomalous value/price ratio: ${ratio.toFixed(3)}`,
+          };
+        },
+      },
+      {
+        id: 'SP-003',
+        name: 'Layered Spoofing',
+        category: 'spoofing',
+        description: 'Multiple cancel-replace cycles on the same order',
+        detector: (t, ctx) => {
+          const cancelCount =
+            ctx.recentTrades?.filter(
+              (rt) => rt.traderId === t.traderId && rt.timeInForce === 'IOC',
+            ).length ?? 0;
+          const matched = cancelCount >= 5;
+          return {
+            patternId: 'SP-003',
+            patternName: 'Layered Spoofing',
+            category: 'spoofing',
+            matched,
+            confidence: matched ? Math.min(0.88, cancelCount * 0.1) : 0,
+            evidence: `${cancelCount} IOC orders detected in window`,
+          };
+        },
+      },
+      {
+        id: 'SP-004',
+        name: 'Quote Stuffing',
+        category: 'spoofing',
+        description:
+          'Rapid order placement and cancellation to slow competing systems',
+        detector: (t, ctx) => {
+          const tradeRate =
+            ctx.recentTrades?.filter((rt) => rt.traderId === t.traderId)
+              .length ?? 0;
+          const matched = tradeRate > 50;
+          return {
+            patternId: 'SP-004',
+            patternName: 'Quote Stuffing',
+            category: 'spoofing',
+            matched,
+            confidence: matched ? Math.min(0.92, tradeRate / 100) : 0,
+            evidence: `${tradeRate} orders in monitoring window`,
+          };
+        },
+      },
+      {
+        id: 'SP-005',
+        name: 'Momentum Spoofing',
+        category: 'spoofing',
+        description: 'Creating false momentum with large directional orders',
+        detector: (t) => {
+          const isBigDirectional =
+            t.quantity > 5000 && t.orderType === 'market';
+          return {
+            patternId: 'SP-005',
+            patternName: 'Momentum Spoofing',
+            category: 'spoofing',
+            matched: isBigDirectional,
+            confidence: isBigDirectional ? 0.5 : 0,
+            evidence: `Large market order: qty=${t.quantity}`,
+          };
+        },
+      },
+ 
+      // ── Layering ──────────────────────────────────────────────────────────
+      {
+        id: 'LY-001',
+        name: 'Multi-Level Order Stacking',
+        category: 'layering',
+        description:
+          'Multiple limit orders stacked at different prices to create false depth',
+        detector: (t, ctx) => {
+          const sameDirectionOrders =
+            ctx.recentTrades?.filter(
+              (rt) =>
+                rt.traderId === t.traderId &&
+                rt.side === t.side &&
+                rt.orderType === 'limit',
+            ).length ?? 0;
+          const matched = sameDirectionOrders >= 4;
+          return {
+            patternId: 'LY-001',
+            patternName: 'Multi-Level Order Stacking',
+            category: 'layering',
+            matched,
+            confidence: matched
+              ? Math.min(0.82, sameDirectionOrders * 0.15)
+              : 0,
+            evidence: `${sameDirectionOrders} stacked limit orders in same direction`,
+          };
+        },
+      },
+      {
+        id: 'LY-002',
+        name: 'Momentum Ignition',
+        category: 'layering',
+        description:
+          'Triggering momentum in one direction then reversing position',
+        detector: (t, ctx) => {
+          const oppositeRecentTrades =
+            ctx.recentTrades?.filter(
+              (rt) => rt.traderId === t.traderId && rt.side !== t.side,
+            ).length ?? 0;
+          const matched = oppositeRecentTrades >= 2 && t.tradeValue > 100_000;
+          return {
+            patternId: 'LY-002',
+            patternName: 'Momentum Ignition',
+            category: 'layering',
+            matched,
+            confidence: matched ? 0.65 : 0,
+            evidence: `Position reversal pattern with ${oppositeRecentTrades} opposite trades`,
+          };
+        },
+      },
+      {
+        id: 'LY-003',
+        name: 'Order Book Painting',
+        category: 'layering',
+        description:
+          'Creating artificial order book depth to attract other traders',
+        detector: (t) => {
+          const isLimitWithHighRatio =
+            t.orderType === 'limit' && t.quantity > 8000;
+          return {
+            patternId: 'LY-003',
+            patternName: 'Order Book Painting',
+            category: 'layering',
+            matched: isLimitWithHighRatio,
+            confidence: isLimitWithHighRatio ? 0.48 : 0,
+            evidence: `Large limit order: qty=${t.quantity}`,
+          };
+        },
+      },
+ 
+      // ── Market Manipulation ───────────────────────────────────────────────
+      {
+        id: 'MM-001',
+        name: 'Painting the Tape',
+        category: 'market_manipulation',
+        description:
+          'Series of transactions creating artificial market activity',
+        detector: (t, ctx) => {
+          const traderActivity =
+            ctx.recentTrades?.filter((rt) => rt.traderId === t.traderId)
+              .length ?? 0;
+          const matched = traderActivity > 20 && t.tradeValue < 1000;
+          return {
+            patternId: 'MM-001',
+            patternName: 'Painting the Tape',
+            category: 'market_manipulation',
+            matched,
+            confidence: matched ? 0.6 : 0,
+            evidence: `${traderActivity} small trades creating artificial volume`,
+          };
+        },
+      },
+      {
+        id: 'MM-002',
+        name: 'Ramping / Marking the Close',
+        category: 'market_manipulation',
+        description: 'Aggressively moving price at end of trading session',
+        detector: (t) => {
+          const isCloseTime = t.tradeTimestamp
+            ? new Date(t.tradeTimestamp).getUTCHours() >= 15
+            : false;
+          const isLargeMarket =
+            t.orderType === 'market' && t.tradeValue > 500_000;
+          const matched = isCloseTime && isLargeMarket;
+          return {
+            patternId: 'MM-002',
+            patternName: 'Ramping / Marking the Close',
+            category: 'market_manipulation',
+            matched,
+            confidence: matched ? 0.7 : 0,
+            evidence: `Large market order near session close: $${t.tradeValue.toLocaleString()}`,
+          };
+        },
+      },
+      {
+        id: 'MM-003',
+        name: 'Pump and Dump',
+        category: 'market_manipulation',
+        description: 'Artificially inflating asset price then selling',
+        detector: (t, ctx) => {
+          const buyOrders =
+            ctx.recentTrades?.filter(
+              (rt) => rt.traderId === t.traderId && rt.side === 'buy',
+            ).length ?? 0;
+          const isSelling = t.side === 'sell' && t.tradeValue > 200_000;
+          const matched = buyOrders >= 5 && isSelling;
+          return {
+            patternId: 'MM-003',
+            patternName: 'Pump and Dump',
+            category: 'market_manipulation',
+            matched,
+            confidence: matched ? 0.75 : 0,
+            evidence: `${buyOrders} prior buy orders followed by large sell: $${t.tradeValue.toLocaleString()}`,
+          };
+        },
+      },
+      {
+        id: 'MM-004',
+        name: 'Bear Raid',
+        category: 'market_manipulation',
+        description: 'Coordinated selling to drive down prices then covering',
+        detector: (t, ctx) => {
+          const sellOrders =
+            ctx.recentTrades?.filter(
+              (rt) => rt.traderId === t.traderId && rt.side === 'sell',
+            ).length ?? 0;
+          const isBuying = t.side === 'buy' && sellOrders >= 5;
+          return {
+            patternId: 'MM-004',
+            patternName: 'Bear Raid',
+            category: 'market_manipulation',
+            matched: isBuying,
+            confidence: isBuying ? 0.65 : 0,
+            evidence: `${sellOrders} prior sell orders followed by buy`,
+          };
+        },
+      },
+      {
+        id: 'MM-005',
+        name: 'Banging the Open',
+        category: 'market_manipulation',
+        description:
+          "Aggressive trading at market open to set the day's direction",
+        detector: (t) => {
+          const isOpenTime = t.tradeTimestamp
+            ? new Date(t.tradeTimestamp).getUTCHours() <= 9
+            : false;
+          const isLarge = t.tradeValue > 1_000_000;
+          const matched = isOpenTime && isLarge;
+          return {
+            patternId: 'MM-005',
+            patternName: 'Banging the Open',
+            category: 'market_manipulation',
+            matched,
+            confidence: matched ? 0.6 : 0,
+            evidence: `Large trade at market open: $${t.tradeValue.toLocaleString()}`,
+          };
+        },
+      },
+ 
+      // ── Front Running ─────────────────────────────────────────────────────
+      {
+        id: 'FR-001',
+        name: 'Classic Front Running',
+        category: 'front_running',
+        description: 'Trading ahead of a known large order',
+        detector: (t, ctx) => {
+          const followedByLarge =
+            ctx.recentTrades?.some(
+              (rt) => rt.side === t.side && rt.tradeValue > t.tradeValue * 5,
+            ) ?? false;
+          return {
+            patternId: 'FR-001',
+            patternName: 'Classic Front Running',
+            category: 'front_running',
+            matched: followedByLarge,
+            confidence: followedByLarge ? 0.55 : 0,
+            evidence: 'Small order followed by large order in same direction',
+          };
+        },
+      },
+      {
+        id: 'FR-002',
+        name: 'Latency Arbitrage',
+        category: 'front_running',
+        description:
+          'Exploiting speed advantage to trade ahead of slower participants',
+        detector: (t) => {
+          const isIOC = t.timeInForce === 'IOC';
+          const isMarket = t.orderType === 'market';
+          const matched = isIOC && isMarket && t.quantity > 2000;
+          return {
+            patternId: 'FR-002',
+            patternName: 'Latency Arbitrage',
+            category: 'front_running',
+            matched,
+            confidence: matched ? 0.5 : 0,
+            evidence:
+              'IOC market order with large quantity suggests latency exploitation',
+          };
+        },
+      },
+ 
+      // ── Cross-Market Manipulation ─────────────────────────────────────────
+      {
+        id: 'CM-001',
+        name: 'Cross-Market Spoofing',
+        category: 'cross_market',
+        description:
+          'Spoofing in one market to benefit position in correlated market',
+        detector: (t) => {
+          const isLarge = t.tradeValue > 2_000_000;
+          const isMixed = t.market && t.market.includes('-');
+          const matched = isLarge && !!isMixed;
+          return {
+            patternId: 'CM-001',
+            patternName: 'Cross-Market Spoofing',
+            category: 'cross_market',
+            matched,
+            confidence: matched ? 0.45 : 0,
+            evidence: `Large cross-market trade: ${t.market}`,
+          };
+        },
+      },
+      {
+        id: 'CM-002',
+        name: 'Correlated Account Trading',
+        category: 'cross_market',
+        description: 'Multiple accounts acting in concert to manipulate prices',
+        detector: (t, ctx) => {
+          const uniqueTraders = new Set(
+            ctx.recentTrades?.map((rt) => rt.traderId),
+          ).size;
+          const matched = uniqueTraders >= 3 && t.tradeValue > 500_000;
+          return {
+            patternId: 'CM-002',
+            patternName: 'Correlated Account Trading',
+            category: 'cross_market',
+            matched,
+            confidence: matched ? 0.6 : 0,
+            evidence: `${uniqueTraders} correlated traders detected`,
+          };
+        },
+      },
+      {
+        id: 'CM-003',
+        name: 'Arbitrage Abuse',
+        category: 'cross_market',
+        description:
+          'Exploiting artificial price differences created through manipulation',
+        detector: (t) => {
+          const suspiciouslyProfitable = t.price < 0.5 || t.price > 5000;
+          return {
+            patternId: 'CM-003',
+            patternName: 'Arbitrage Abuse',
+            category: 'cross_market',
+            matched: suspiciouslyProfitable,
+            confidence: suspiciouslyProfitable ? 0.4 : 0,
+            evidence: `Extreme price: ${t.price} suggests artificial spread exploitation`,
+          };
+        },
+      },
+ 
+      // ── Velocity Abuse ────────────────────────────────────────────────────
+      {
+        id: 'VA-001',
+        name: 'Order Burst',
+        category: 'velocity',
+        description:
+          "Sudden burst of orders far exceeding trader's normal pattern",
+        detector: (t, ctx) => {
+          const recentCount =
+            ctx.recentTrades?.filter((rt) => rt.traderId === t.traderId)
+              .length ?? 0;
+          const matched = recentCount > 30;
+          return {
+            patternId: 'VA-001',
+            patternName: 'Order Burst',
+            category: 'velocity',
+            matched,
+            confidence: matched ? Math.min(0.85, recentCount / 50) : 0,
+            evidence: `${recentCount} orders in short window`,
+          };
+        },
+      },
+      {
+        id: 'VA-002',
+        name: 'Cancel-Replace Storm',
+        category: 'velocity',
+        description:
+          'Rapid sequence of order modifications overwhelming the matching engine',
+        detector: (t, ctx) => {
+          const iocCount =
+            ctx.recentTrades?.filter(
+              (rt) => rt.traderId === t.traderId && rt.timeInForce === 'IOC',
+            ).length ?? 0;
+          const matched = iocCount > 15;
+          return {
+            patternId: 'VA-002',
+            patternName: 'Cancel-Replace Storm',
+            category: 'velocity',
+            matched,
+            confidence: matched ? Math.min(0.88, iocCount / 20) : 0,
+            evidence: `${iocCount} rapid IOC orders detected`,
+          };
+        },
+      },
+      {
+        id: 'VA-003',
+        name: 'Flash Crash Pattern',
+        category: 'velocity',
+        description: 'Rapid sell-off causing flash crash conditions',
+        detector: (t, ctx) => {
+          const largeSellCount =
+            ctx.recentTrades?.filter(
+              (rt) =>
+                rt.traderId === t.traderId &&
+                rt.side === 'sell' &&
+                rt.tradeValue > 100_000,
+            ).length ?? 0;
+          const matched = largeSellCount >= 3 && t.side === 'sell';
+          return {
+            patternId: 'VA-003',
+            patternName: 'Flash Crash Pattern',
+            category: 'velocity',
+            matched,
+            confidence: matched ? 0.7 : 0,
+            evidence: `${largeSellCount} large sell orders in rapid succession`,
+          };
+        },
+      },
+ 
+      // ── Insider Trading ───────────────────────────────────────────────────
+      {
+        id: 'IT-001',
+        name: 'Pre-Announcement Trading',
+        category: 'insider_trading',
+        description:
+          'Unusual trading activity immediately before major announcements',
+        detector: (t) => {
+          // Flag unusually large directional trades
+          const isLargeDirectional =
+            t.tradeValue > 5_000_000 && t.orderType === 'market';
+          return {
+            patternId: 'IT-001',
+            patternName: 'Pre-Announcement Trading',
+            category: 'insider_trading',
+            matched: isLargeDirectional,
+            confidence: isLargeDirectional ? 0.45 : 0,
+            evidence: `Unusually large directional trade: $${t.tradeValue.toLocaleString()}`,
+          };
+        },
+      },
+      {
+        id: 'IT-002',
+        name: 'Information Advantage Exploitation',
+        category: 'insider_trading',
+        description:
+          'Consistent profitability pattern suggesting non-public information',
+        detector: (t, ctx) => {
+          const consistentDirection =
+            ctx.recentTrades?.every(
+              (rt) => rt.traderId === t.traderId && rt.side === t.side,
+            ) ?? false;
+          const matched =
+            consistentDirection && (ctx.recentTrades?.length ?? 0) >= 5;
+          return {
+            patternId: 'IT-002',
+            patternName: 'Information Advantage Exploitation',
+            category: 'insider_trading',
+            matched,
+            confidence: matched ? 0.5 : 0,
+            evidence:
+              'Consistent same-direction trading across all recent trades',
+          };
+        },
+      },
+ 
+      // ── Additional Energy-Specific Patterns ───────────────────────────────
+      {
+        id: 'EN-001',
+        name: 'Capacity Hoarding',
+        category: 'energy_specific',
+        description:
+          'Acquiring transmission capacity with no intention to use it',
+        detector: (t) => {
+          const isCapacity =
+            t.assetType?.includes('capacity') ||
+            t.assetType?.includes('transmission');
+          const isLarge = t.quantity > 50000;
+          const matched = !!isCapacity && isLarge;
+          return {
+            patternId: 'EN-001',
+            patternName: 'Capacity Hoarding',
+            category: 'energy_specific',
+            matched,
+            confidence: matched ? 0.6 : 0,
+            evidence: `Large capacity acquisition: ${t.quantity} units`,
+          };
+        },
+      },
+      {
+        id: 'EN-002',
+        name: 'Fictitious Energy Injection',
+        category: 'energy_specific',
+        description: 'Reporting false energy generation or consumption',
+        detector: (t) => {
+          const isNegativePrice = t.price < 0;
+          const isMassive = t.quantity > 100_000;
+          const matched = isNegativePrice && isMassive;
+          return {
+            patternId: 'EN-002',
+            patternName: 'Fictitious Energy Injection',
+            category: 'energy_specific',
+            matched,
+            confidence: matched ? 0.88 : isNegativePrice ? 0.4 : 0,
+            evidence: `Negative price (${t.price}) with large volume (${t.quantity})`,
+          };
+        },
+      },
+      {
+        id: 'EN-003',
+        name: 'Carbon Credit Fraud',
+        category: 'energy_specific',
+        description: 'Double counting or fabrication of carbon credits',
+        detector: (t) => {
+          const isCarbonCredit = t.assetType?.toLowerCase().includes('carbon');
+          const isSuspiciousVolume =
+            t.quantity % 1000 === 0 && t.quantity > 10_000;
+          const matched = !!isCarbonCredit && isSuspiciousVolume;
+          return {
+            patternId: 'EN-003',
+            patternName: 'Carbon Credit Fraud',
+            category: 'energy_specific',
+            matched,
+            confidence: matched ? 0.55 : 0,
+            evidence: `Suspicious round-lot carbon credit trade: ${t.quantity} units`,
+          };
+        },
+      },
+      {
+        id: 'EN-004',
+        name: 'Congestion Manipulation',
+        category: 'energy_specific',
+        description: 'Deliberately creating transmission congestion for profit',
+        detector: (t) => {
+          const isCrossRegion =
+            t.market?.includes('/') || t.market?.includes('-');
+          const isLarge = t.tradeValue > 1_000_000;
+          const matched = !!isCrossRegion && isLarge;
+          return {
+            patternId: 'EN-004',
+            patternName: 'Congestion Manipulation',
+            category: 'energy_specific',
+            matched,
+            confidence: matched ? 0.5 : 0,
+            evidence: `Cross-region trade potentially creating congestion: ${t.market}`,
+          };
+        },
+      },
+      {
+        id: 'EN-005',
+        name: 'Withholding Capacity',
+        category: 'energy_specific',
+        description:
+          'Artificially withholding energy supply to drive up prices',
+        detector: (t, ctx) => {
+          const priorSells =
+            ctx.recentTrades?.filter(
+              (rt) => rt.traderId === t.traderId && rt.side === 'sell',
+            ).length ?? 0;
+          const isWithholding =
+            priorSells === 0 && t.side === 'buy' && t.tradeValue > 500_000;
+          return {
+            patternId: 'EN-005',
+            patternName: 'Withholding Capacity',
+            category: 'energy_specific',
+            matched: isWithholding,
+            confidence: isWithholding ? 0.45 : 0,
+            evidence:
+              'Large buy with no recent sell activity suggests capacity withholding',
+          };
+        },
+      },
+ 
+      // ── Regulatory / Reporting Fraud ──────────────────────────────────────
+      {
+        id: 'RF-001',
+        name: 'Threshold Avoidance',
+        category: 'regulatory',
+        description:
+          'Structuring trades just below reporting thresholds (structuring)',
+        detector: (t) => {
+          const REPORTING_THRESHOLD = 10_000;
+          const isJustBelow =
+            t.tradeValue > REPORTING_THRESHOLD * 0.85 &&
+            t.tradeValue < REPORTING_THRESHOLD;
+          return {
+            patternId: 'RF-001',
+            patternName: 'Threshold Avoidance',
+            category: 'regulatory',
+            matched: isJustBelow,
+            confidence: isJustBelow ? 0.78 : 0,
+            evidence: `Trade value $${t.tradeValue} is just below reporting threshold $${REPORTING_THRESHOLD}`,
+          };
+        },
+      },
+      {
+        id: 'RF-002',
+        name: 'Smurfing',
+        category: 'regulatory',
+        description:
+          'Breaking large transactions into small ones to avoid reporting',
+        detector: (t, ctx) => {
+          const smallTrades =
+            ctx.recentTrades?.filter(
+              (rt) => rt.traderId === t.traderId && rt.tradeValue < 5000,
+            ).length ?? 0;
+          const matched = smallTrades >= 10;
+          return {
+            patternId: 'RF-002',
+            patternName: 'Smurfing',
+            category: 'regulatory',
+            matched,
+            confidence: matched ? Math.min(0.85, smallTrades / 15) : 0,
+            evidence: `${smallTrades} small transactions detected (potential structuring)`,
+          };
+        },
+      },
+      {
+        id: 'RF-003',
+        name: 'Round Number Trading',
+        category: 'regulatory',
+        description: 'Suspicious round-number quantities in repeated trades',
+        detector: (t) => {
+          const isRound = t.quantity % 1000 === 0 && t.quantity >= 10_000;
+          const isRoundPrice = t.price % 10 === 0;
+          const matched = isRound && isRoundPrice;
+          return {
+            patternId: 'RF-003',
+            patternName: 'Round Number Trading',
+            category: 'regulatory',
+            matched,
+            confidence: matched ? 0.35 : 0,
+            evidence: `Suspicious round numbers: qty=${t.quantity}, price=${t.price}`,
+          };
+        },
+      },
+ 
+      // ── Algorithmic / HFT Abuse ───────────────────────────────────────────
+      {
+        id: 'AL-001',
+        name: 'Pinging',
+        category: 'algorithmic',
+        description:
+          'Small orders to detect hidden large orders (order detection)',
+        detector: (t) => {
+          const isTinyIoc = t.quantity < 10 && t.timeInForce === 'IOC';
+          return {
+            patternId: 'AL-001',
+            patternName: 'Pinging',
+            category: 'algorithmic',
+            matched: isTinyIoc,
+            confidence: isTinyIoc ? 0.65 : 0,
+            evidence: `Tiny IOC order: qty=${t.quantity} — potential order book pinging`,
+          };
+        },
+      },
+      {
+        id: 'AL-002',
+        name: 'Algorithmic Collusion',
+        category: 'algorithmic',
+        description:
+          'Multiple algorithmic traders coordinating to manipulate prices',
+        detector: (t, ctx) => {
+          const uniqueAlgos = new Set(
+            ctx.recentTrades?.map((rt) => rt.traderId),
+          ).size;
+          const allSmall =
+            ctx.recentTrades?.every((rt) => rt.quantity < 100) ?? false;
+          const matched = uniqueAlgos >= 5 && allSmall;
+          return {
+            patternId: 'AL-002',
+            patternName: 'Algorithmic Collusion',
+            category: 'algorithmic',
+            matched,
+            confidence: matched ? 0.55 : 0,
+            evidence: `${uniqueAlgos} coordinated algorithmic traders`,
+          };
+        },
+      },
+      {
+        id: 'AL-003',
+        name: 'Spoofing-Triggered Algo',
+        category: 'algorithmic',
+        description: 'Manual spoof triggering algorithmic responses for profit',
+        detector: (t, ctx) => {
+          const hasReversal =
+            ctx.recentTrades?.some(
+              (rt) =>
+                rt.traderId === t.traderId &&
+                rt.side !== t.side &&
+                rt.quantity > t.quantity * 2,
+            ) ?? false;
+          return {
+            patternId: 'AL-003',
+            patternName: 'Spoofing-Triggered Algo',
+            category: 'algorithmic',
+            matched: hasReversal,
+            confidence: hasReversal ? 0.6 : 0,
+            evidence:
+              'Large order reversal pattern consistent with spoofing-triggered algo',
+          };
+        },
+      },
+    ];
+  }
+ 
+  /** Deterministic mapping from matched patterns to primary fraud type */
+  inferFraudTypes(patterns: PatternMatchResult[]): FraudType[] {
+    const matched = patterns.filter((p) => p.matched);
+    const categoryToType: Record<string, FraudType> = {
+      wash_trading: FraudType.WASH_TRADING,
+      spoofing: FraudType.SPOOFING,
+      layering: FraudType.LAYERING,
+      market_manipulation: FraudType.MARKET_MANIPULATION,
+      front_running: FraudType.FRONT_RUNNING,
+      cross_market: FraudType.CROSS_MARKET_MANIPULATION,
+      insider_trading: FraudType.INSIDER_TRADING,
+      energy_specific: FraudType.MARKET_MANIPULATION,
+      regulatory: FraudType.UNKNOWN,
+      algorithmic: FraudType.SPOOFING,
+      velocity: FraudType.VELOCITY_ABUSE,
+    };
+ 
+    const types = new Set<FraudType>(
+      matched.map((p) => categoryToType[p.category] ?? FraudType.UNKNOWN),
+    );
+    return Array.from(types);
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/prevention/fraud-prevention.service.ts.html b/coverage/lcov-report/src/fraud/prevention/fraud-prevention.service.ts.html new file mode 100644 index 0000000..24ef6dc --- /dev/null +++ b/coverage/lcov-report/src/fraud/prevention/fraud-prevention.service.ts.html @@ -0,0 +1,1090 @@ + + + + + + Code coverage report for src/fraud/prevention/fraud-prevention.service.ts + + + + + + + + + +
+
+

All files / src/fraud/prevention fraud-prevention.service.ts

+
+ +
+ 96.11% + Statements + 322/335 +
+ + +
+ 81.35% + Branches + 48/59 +
+ + +
+ 100% + Functions + 14/14 +
+ + +
+ 96.11% + Lines + 322/335 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +3361x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +22x +22x +22x +1x +1x +1x +1x +1x +1x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +1x +1x +1x +1x +1x +1x +1x +1x +13x +13x +13x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +12x +12x +12x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +11x +11x +11x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +10x +11x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +9x +9x +14x +  +  +  +  +  +  +  +  +  +  +9x +9x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +8x +8x +14x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +7x +7x +14x +14x +14x +14x +14x +1x +1x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +2x +2x +1x +1x +2x +2x +1x +1x +6x +6x +6x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +1x +2x +2x +2x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +3x +1x +1x +1x +1x +1x +1x +3x +1x +1x +1x +1x +1x +1x +1x +3x +1x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +1x +1x +7x +7x +7x +7x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  FraudCaseEntity,
+  FraudCaseStatus,
+  FraudSeverity,
+} from '../entities/fraud-case.entity';
+import { PreTradeCheckDto, PreTradeCheckResult } from '../dto/fraud-alert.dto';
+ 
+export interface BlockedTrader {
+  traderId: string;
+  reason: string;
+  blockedAt: Date;
+  expiresAt: Date | null;
+  severity: FraudSeverity;
+}
+ 
+interface PreventionStats {
+  totalChecks: number;
+  blockedTrades: number;
+  blockedValue: number;
+  whitelistedPassed: number;
+  blockRate: number;
+}
+ 
+@Injectable()
+export class FraudPreventionService {
+  private readonly logger = new Logger(FraudPreventionService.name);
+ 
+  /** In-memory blocklist (production would use Redis) */
+  private readonly blockedTraders = new Map<string, BlockedTrader>();
+ 
+  /** Trusted counterparties exempt from some checks */
+  private readonly whitelist = new Set<string>();
+ 
+  /** Prevention statistics */
+  private stats: PreventionStats = {
+    totalChecks: 0,
+    blockedTrades: 0,
+    blockedValue: 0,
+    whitelistedPassed: 0,
+    blockRate: 0,
+  };
+ 
+  /** Score threshold above which a trade is auto-blocked */
+  private readonly BLOCK_THRESHOLD = 0.85;
+  private readonly REVIEW_THRESHOLD = 0.65;
+ 
+  /** Rate limits per trader: max trades per minute */
+  private readonly RATE_LIMIT_PER_MINUTE = 60;
+  private readonly traderRateCounts = new Map<string, number[]>(); // timestamps
+ 
+  constructor(
+    @InjectRepository(FraudCaseEntity)
+    private readonly fraudCaseRepository: Repository<FraudCaseEntity>,
+  ) {}
+ 
+  // ─── Pre-trade Check ─────────────────────────────────────────────────────
+ 
+  /**
+   * Pre-trade prevention check — called before trade execution.
+   * Returns allow/block/review decision in <10ms.
+   */
+  async preTradeCheck(
+    checkDto: PreTradeCheckDto,
+    mlScore?: number,
+  ): Promise<PreTradeCheckResult> {
+    this.stats.totalChecks++;
+    const { traderId, tradeValue = 0 } = checkDto as any;
+    const reasons: string[] = [];
+ 
+    // 1. Whitelist bypass for trusted entities
+    if (this.whitelist.has(traderId)) {
+      this.stats.whitelistedPassed++;
+      return {
+        allowed: true,
+        riskScore: 0,
+        reasons: ['Whitelisted trader'],
+        recommendedAction: 'allow',
+      };
+    }
+ 
+    // 2. Check blocklist
+    const blockEntry = this.blockedTraders.get(traderId);
+    if (blockEntry) {
+      const isExpired =
+        blockEntry.expiresAt && blockEntry.expiresAt < new Date();
+      if (!isExpired) {
+        reasons.push(`Trader blocked: ${blockEntry.reason}`);
+        this.recordPrevention(traderId, tradeValue ?? 0);
+        return {
+          allowed: false,
+          riskScore: 1.0,
+          reasons,
+          recommendedAction: 'block',
+        };
+      } else {
+        // Auto-unblock expired entries
+        this.blockedTraders.delete(traderId);
+      }
+    }
+ 
+    // 3. Rate limit check
+    const isRateLimited = this.checkRateLimit(traderId);
+    if (isRateLimited) {
+      reasons.push(
+        `Rate limit exceeded: >${this.RATE_LIMIT_PER_MINUTE} trades/min`,
+      );
+      this.recordPrevention(traderId, tradeValue ?? 0);
+      return {
+        allowed: false,
+        riskScore: 0.9,
+        reasons,
+        recommendedAction: 'block',
+      };
+    }
+ 
+    // 4. ML score gate
+    if (mlScore !== undefined) {
+      if (mlScore >= this.BLOCK_THRESHOLD) {
+        reasons.push(
+          `ML fraud score ${mlScore.toFixed(3)} exceeds block threshold ${this.BLOCK_THRESHOLD}`,
+        );
+        this.recordPrevention(traderId, tradeValue ?? 0);
+        return {
+          allowed: false,
+          riskScore: mlScore,
+          reasons,
+          recommendedAction: 'block',
+        };
+      }
+ 
+      if (mlScore >= this.REVIEW_THRESHOLD) {
+        reasons.push(
+          `ML fraud score ${mlScore.toFixed(3)} requires manual review`,
+        );
+        return {
+          allowed: true,
+          riskScore: mlScore,
+          reasons,
+          recommendedAction: 'review',
+        };
+      }
+    }
+ 
+    // 5. Large trade value threshold
+    if (tradeValue > 50_000_000) {
+      reasons.push(
+        `Trade value $${tradeValue.toLocaleString()} exceeds large-trade threshold`,
+      );
+      return {
+        allowed: true,
+        riskScore: 0.5,
+        reasons,
+        recommendedAction: 'review',
+      };
+    }
+ 
+    // 6. Self-trade prevention
+    if (checkDto.counterpartyId && checkDto.counterpartyId === traderId) {
+      reasons.push('Self-trade detected: buyer and seller are the same entity');
+      this.recordPrevention(traderId, tradeValue ?? 0);
+      return {
+        allowed: false,
+        riskScore: 1.0,
+        reasons,
+        recommendedAction: 'block',
+      };
+    }
+ 
+    // 7. Check prior fraud case history
+    const priorCases = await this.fraudCaseRepository.count({
+      where: { traderId, status: FraudCaseStatus.OPEN },
+    });
+ 
+    if (priorCases >= 3) {
+      reasons.push(`Trader has ${priorCases} open fraud cases`);
+      return {
+        allowed: false,
+        riskScore: 0.8,
+        reasons,
+        recommendedAction: 'block',
+      };
+    }
+ 
+    this.updateRateCount(traderId);
+    return {
+      allowed: true,
+      riskScore: mlScore ?? 0,
+      reasons: reasons.length > 0 ? reasons : ['No fraud indicators detected'],
+      recommendedAction: 'allow',
+    };
+  }
+ 
+  // ─── Blocklist Management ────────────────────────────────────────────────
+ 
+  blockTrader(
+    traderId: string,
+    reason: string,
+    severity: FraudSeverity,
+    durationHours?: number,
+  ): void {
+    const expiresAt = durationHours
+      ? new Date(Date.now() + durationHours * 3_600_000)
+      : null;
+ 
+    this.blockedTraders.set(traderId, {
+      traderId,
+      reason,
+      blockedAt: new Date(),
+      expiresAt,
+      severity,
+    });
+ 
+    this.logger.warn(
+      `Trader BLOCKED: ${traderId} | Reason: ${reason} | Expires: ${expiresAt?.toISOString() ?? 'Never'}`,
+    );
+  }
+ 
+  unblockTrader(traderId: string): boolean {
+    const removed = this.blockedTraders.delete(traderId);
+    if (removed) {
+      this.logger.log(`Trader UNBLOCKED: ${traderId}`);
+    }
+    return removed;
+  }
+ 
+  isTraderBlocked(traderId: string): boolean {
+    const entry = this.blockedTraders.get(traderId);
+    if (!entry) return false;
+    if (entry.expiresAt && entry.expiresAt < new Date()) {
+      this.blockedTraders.delete(traderId);
+      return false;
+    }
+    return true;
+  }
+ 
+  getBlockedTraders(): BlockedTrader[] {
+    return Array.from(this.blockedTraders.values());
+  }
+ 
+  // ─── Whitelist Management ────────────────────────────────────────────────
+ 
+  addToWhitelist(traderId: string): void {
+    this.whitelist.add(traderId);
+    this.logger.log(`Trader added to whitelist: ${traderId}`);
+  }
+ 
+  removeFromWhitelist(traderId: string): void {
+    this.whitelist.delete(traderId);
+    this.logger.log(`Trader removed from whitelist: ${traderId}`);
+  }
+ 
+  getWhitelist(): string[] {
+    return Array.from(this.whitelist);
+  }
+ 
+  // ─── Prevention Metrics ──────────────────────────────────────────────────
+ 
+  getPreventionStats(): object {
+    const blockRate =
+      this.stats.totalChecks > 0
+        ? parseFloat(
+            (this.stats.blockedTrades / this.stats.totalChecks).toFixed(4),
+          )
+        : 0;
+ 
+    return {
+      ...this.stats,
+      blockRate,
+      activeBlocks: this.blockedTraders.size,
+      whitelistedTraders: this.whitelist.size,
+      blockThreshold: this.BLOCK_THRESHOLD,
+      reviewThreshold: this.REVIEW_THRESHOLD,
+      rateLimitPerMinute: this.RATE_LIMIT_PER_MINUTE,
+    };
+  }
+ 
+  // ─── Auto-Prevention from ML Scores ────────────────────────────────────
+ 
+  /**
+   * Called by monitoring service when a case is created — auto-blocks
+   * CRITICAL traders for a configurable temporary window.
+   */
+  async applyPreventionForCase(fraudCase: FraudCaseEntity): Promise<void> {
+    if (fraudCase.severity === FraudSeverity.CRITICAL) {
+      this.blockTrader(
+        fraudCase.traderId,
+        `Auto-blocked: CRITICAL fraud case ${fraudCase.caseId} (ML score ${fraudCase.mlScore})`,
+        FraudSeverity.CRITICAL,
+        24, // 24-hour initial block; investigators can extend
+      );
+    } else if (fraudCase.severity === FraudSeverity.HIGH) {
+      this.blockTrader(
+        fraudCase.traderId,
+        `Auto-blocked: HIGH severity case ${fraudCase.caseId}`,
+        FraudSeverity.HIGH,
+        4, // 4-hour block pending review
+      );
+    }
+  }
+ 
+  // ─── Private Helpers ────────────────────────────────────────────────────
+ 
+  private checkRateLimit(traderId: string): boolean {
+    const now = Date.now();
+    const oneMinuteAgo = now - 60_000;
+    const timestamps = this.traderRateCounts.get(traderId) ?? [];
+ 
+    // Remove timestamps older than 1 min
+    const recent = timestamps.filter((ts) => ts > oneMinuteAgo);
+    this.traderRateCounts.set(traderId, recent);
+ 
+    return recent.length >= this.RATE_LIMIT_PER_MINUTE;
+  }
+ 
+  private updateRateCount(traderId: string): void {
+    const timestamps = this.traderRateCounts.get(traderId) ?? [];
+    timestamps.push(Date.now());
+    this.traderRateCounts.set(traderId, timestamps);
+  }
+ 
+  private recordPrevention(traderId: string, tradeValue: number): void {
+    this.stats.blockedTrades++;
+    this.stats.blockedValue += tradeValue;
+    this.stats.blockRate =
+      this.stats.totalChecks > 0
+        ? this.stats.blockedTrades / this.stats.totalChecks
+        : 0;
+    this.logger.warn(
+      `Trade PREVENTED for trader ${traderId} | Value: $${tradeValue.toLocaleString()} | Total prevented: ${this.stats.blockedTrades}`,
+    );
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/prevention/index.html b/coverage/lcov-report/src/fraud/prevention/index.html new file mode 100644 index 0000000..ce079be --- /dev/null +++ b/coverage/lcov-report/src/fraud/prevention/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/fraud/prevention + + + + + + + + + +
+
+

All files src/fraud/prevention

+
+ +
+ 96.11% + Statements + 322/335 +
+ + +
+ 81.35% + Branches + 48/59 +
+ + +
+ 100% + Functions + 14/14 +
+ + +
+ 96.11% + Lines + 322/335 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
fraud-prevention.service.ts +
+
96.11%322/33581.35%48/59100%14/1496.11%322/335
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/reporting/index.html b/coverage/lcov-report/src/fraud/reporting/index.html new file mode 100644 index 0000000..4af3baa --- /dev/null +++ b/coverage/lcov-report/src/fraud/reporting/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/fraud/reporting + + + + + + + + + +
+
+

All files src/fraud/reporting

+
+ +
+ 90.93% + Statements + 331/364 +
+ + +
+ 63.79% + Branches + 37/58 +
+ + +
+ 78.57% + Functions + 11/14 +
+ + +
+ 90.93% + Lines + 331/364 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
suspicious-activity.service.ts +
+
90.93%331/36463.79%37/5878.57%11/1490.93%331/364
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/fraud/reporting/suspicious-activity.service.ts.html b/coverage/lcov-report/src/fraud/reporting/suspicious-activity.service.ts.html new file mode 100644 index 0000000..abfe17a --- /dev/null +++ b/coverage/lcov-report/src/fraud/reporting/suspicious-activity.service.ts.html @@ -0,0 +1,1177 @@ + + + + + + Code coverage report for src/fraud/reporting/suspicious-activity.service.ts + + + + + + + + + +
+
+

All files / src/fraud/reporting suspicious-activity.service.ts

+
+ +
+ 90.93% + Statements + 331/364 +
+ + +
+ 63.79% + Branches + 37/58 +
+ + +
+ 78.57% + Functions + 11/14 +
+ + +
+ 90.93% + Lines + 331/364 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +3651x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +20x +20x +20x +1x +1x +1x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +1x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +2x +2x +1x +1x +1x +  +  +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +2x +3x +2x +2x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +101x +101x +101x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +  +  +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +7x +7x +1x +7x +6x +7x +  +7x +  +7x +7x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, Between, FindManyOptions } from 'typeorm';
+import { Cron } from '@nestjs/schedule';
+import {
+  FraudCaseEntity,
+  FraudCaseStatus,
+  FraudSeverity,
+  FraudType,
+} from '../entities/fraud-case.entity';
+import {
+  FraudReportQueryDto,
+  InvestigationUpdateDto,
+} from '../dto/fraud-alert.dto';
+import { v4 as uuidv4 } from 'uuid';
+ 
+export interface SarReport {
+  sarReference: string;
+  generatedAt: Date;
+  caseId: string;
+  traderId: string;
+  fraudType: FraudType;
+  severity: FraudSeverity;
+  summary: string;
+  evidence: object[];
+  tradeData: object;
+  mlScore: number;
+  patternsMatched: string[];
+  reportingObligation: string;
+  regulatoryBodies: string[];
+}
+ 
+export interface PaginatedCases {
+  data: FraudCaseEntity[];
+  total: number;
+  page: number;
+  limit: number;
+  totalPages: number;
+}
+ 
+@Injectable()
+export class SuspiciousActivityService {
+  private readonly logger = new Logger(SuspiciousActivityService.name);
+ 
+  constructor(
+    @InjectRepository(FraudCaseEntity)
+    private readonly fraudCaseRepository: Repository<FraudCaseEntity>,
+  ) {}
+ 
+  // ─── SAR Generation ──────────────────────────────────────────────────────
+ 
+  /** Auto-generate Suspicious Activity Report for a fraud case */
+  async generateSAR(fraudCase: FraudCaseEntity): Promise<SarReport> {
+    const sarReference = `SAR-${new Date().getFullYear()}-${uuidv4().slice(0, 8).toUpperCase()}`;
+ 
+    const sar: SarReport = {
+      sarReference,
+      generatedAt: new Date(),
+      caseId: fraudCase.caseId,
+      traderId: fraudCase.traderId,
+      fraudType: fraudCase.fraudType,
+      severity: fraudCase.severity,
+      summary: this.buildSarSummary(fraudCase),
+      evidence: fraudCase.evidence ?? [],
+      tradeData: fraudCase.tradeData ?? {},
+      mlScore: Number(fraudCase.mlScore),
+      patternsMatched: fraudCase.patternsTriggered ?? [],
+      reportingObligation: this.determineReportingObligation(
+        fraudCase.severity,
+      ),
+      regulatoryBodies: this.getApplicableRegulators(
+        fraudCase.market ?? '',
+        fraudCase.fraudType,
+      ),
+    };
+ 
+    // Persist SAR reference back to the case
+    await this.fraudCaseRepository.update(fraudCase.id, {
+      sarReference,
+      regulatoryReported: fraudCase.severity === FraudSeverity.CRITICAL,
+      status:
+        fraudCase.severity === FraudSeverity.CRITICAL
+          ? FraudCaseStatus.REGULATORY_REPORTED
+          : fraudCase.status,
+    });
+ 
+    this.logger.log(
+      `SAR generated: ${sarReference} for case ${fraudCase.caseId}`,
+    );
+ 
+    return sar;
+  }
+ 
+  /** Generate SAR by case ID */
+  async generateSARById(caseId: string): Promise<SarReport | null> {
+    const fraudCase = await this.fraudCaseRepository.findOne({
+      where: { caseId },
+    });
+    if (!fraudCase) return null;
+    return this.generateSAR(fraudCase);
+  }
+ 
+  // ─── Case Management ─────────────────────────────────────────────────────
+ 
+  /** Get paginated fraud cases with optional filters */
+  async queryCases(queryDto: FraudReportQueryDto): Promise<PaginatedCases> {
+    const {
+      fraudType,
+      severity,
+      status,
+      traderId,
+      startDate,
+      endDate,
+      page = 1,
+      limit = 20,
+      minMlScore,
+      regulatoryReported,
+    } = queryDto;
+ 
+    const where: FindManyOptions<FraudCaseEntity>['where'] = {};
+ 
+    if (fraudType) where['fraudType'] = fraudType;
+    if (severity) where['severity'] = severity;
+    if (status) where['status'] = status;
+    if (traderId) where['traderId'] = traderId;
+    if (regulatoryReported !== undefined)
+      where['regulatoryReported'] = regulatoryReported;
+ 
+    if (startDate && endDate) {
+      where['createdAt'] = Between(new Date(startDate), new Date(endDate));
+    }
+ 
+    const [data, total] = await this.fraudCaseRepository.findAndCount({
+      where,
+      order: { createdAt: 'DESC' },
+      skip: (page - 1) * limit,
+      take: limit,
+    });
+ 
+    // Apply mlScore filter in-memory (TypeORM decimal comparison can be tricky)
+    const filtered = minMlScore
+      ? data.filter((c) => Number(c.mlScore) >= minMlScore)
+      : data;
+ 
+    return {
+      data: filtered,
+      total,
+      page,
+      limit,
+      totalPages: Math.ceil(total / limit),
+    };
+  }
+ 
+  /** Get a single case by its ID */
+  async getCaseById(id: string): Promise<FraudCaseEntity | null> {
+    return this.fraudCaseRepository.findOne({ where: { id } });
+  }
+ 
+  /** Get a single case by its human-readable case ID */
+  async getCaseByCaseId(caseId: string): Promise<FraudCaseEntity | null> {
+    return this.fraudCaseRepository.findOne({ where: { caseId } });
+  }
+ 
+  /** Update investigation status / assignee / notes */
+  async updateCase(
+    id: string,
+    update: InvestigationUpdateDto,
+  ): Promise<FraudCaseEntity | null> {
+    const updates: Partial<FraudCaseEntity> = {
+      status: update.status,
+    };
+ 
+    if (update.investigationNotes)
+      updates.investigationNotes = update.investigationNotes;
+    if (update.assignedTo) updates.assignedTo = update.assignedTo;
+    if (update.falsePositiveReason)
+      updates.falsePositiveReason = update.falsePositiveReason;
+    if (update.resolvedBy) updates.resolvedBy = update.resolvedBy;
+ 
+    if (
+      update.status === FraudCaseStatus.RESOLVED ||
+      update.status === FraudCaseStatus.FALSE_POSITIVE
+    ) {
+      updates.resolvedAt = new Date();
+    }
+ 
+    await this.fraudCaseRepository.update(id, updates);
+ 
+    this.logger.log(`Case ${id} updated to status: ${update.status}`);
+ 
+    return this.fraudCaseRepository.findOne({ where: { id } });
+  }
+ 
+  /** Get all cases for a specific trader */
+  async getCasesByTrader(
+    traderId: string,
+    page = 1,
+    limit = 20,
+  ): Promise<PaginatedCases> {
+    const [data, total] = await this.fraudCaseRepository.findAndCount({
+      where: { traderId },
+      order: { createdAt: 'DESC' },
+      skip: (page - 1) * limit,
+      take: limit,
+    });
+ 
+    return { data, total, page, limit, totalPages: Math.ceil(total / limit) };
+  }
+ 
+  // ─── Metrics & Dashboard ─────────────────────────────────────────────────
+ 
+  async getMetrics(): Promise<object> {
+    const [
+      totalCases,
+      openCases,
+      resolvedCases,
+      falsePositives,
+      criticalCases,
+    ] = await Promise.all([
+      this.fraudCaseRepository.count(),
+      this.fraudCaseRepository.count({
+        where: { status: FraudCaseStatus.OPEN },
+      }),
+      this.fraudCaseRepository.count({
+        where: { status: FraudCaseStatus.RESOLVED },
+      }),
+      this.fraudCaseRepository.count({
+        where: { status: FraudCaseStatus.FALSE_POSITIVE },
+      }),
+      this.fraudCaseRepository.count({
+        where: { severity: FraudSeverity.CRITICAL },
+      }),
+    ]);
+ 
+    const allCases = await this.fraudCaseRepository.find({ take: 1000 });
+    const avgMlScore =
+      allCases.length > 0
+        ? allCases.reduce((s, c) => s + Number(c.mlScore), 0) / allCases.length
+        : 0;
+ 
+    const falsePositiveRate =
+      totalCases > 0 ? parseFloat((falsePositives / totalCases).toFixed(4)) : 0;
+ 
+    const detectionRate =
+      totalCases > 0
+        ? parseFloat(((totalCases - falsePositives) / totalCases).toFixed(4))
+        : 0;
+ 
+    // Cases by type
+    const casesByType: Record<string, number> = {};
+    const casesBySeverity: Record<string, number> = {};
+    for (const c of allCases) {
+      casesByType[c.fraudType] = (casesByType[c.fraudType] ?? 0) + 1;
+      casesBySeverity[c.severity] = (casesBySeverity[c.severity] ?? 0) + 1;
+    }
+ 
+    // Average resolution time
+    const resolvedWithTime = allCases.filter(
+      (c) => c.resolvedAt && c.createdAt,
+    );
+    const avgResolutionHours =
+      resolvedWithTime.length > 0
+        ? resolvedWithTime.reduce(
+            (s, c) =>
+              s + (c.resolvedAt.getTime() - c.createdAt.getTime()) / 3_600_000,
+            0,
+          ) / resolvedWithTime.length
+        : 0;
+ 
+    return {
+      totalCases,
+      openCases,
+      resolvedCases,
+      falsePositives,
+      criticalCases,
+      falsePositiveRate,
+      detectionRate,
+      averageMlScore: parseFloat(avgMlScore.toFixed(4)),
+      casesByType,
+      casesBySeverity,
+      averageResolutionTimeHours: parseFloat(avgResolutionHours.toFixed(2)),
+    };
+  }
+ 
+  // ─── Scheduled Jobs ──────────────────────────────────────────────────────
+ 
+  /** Daily SAR summary sweep — auto-report all unprocessed CRITICAL cases */
+  @Cron('0 6 * * *') // 6 AM every day
+  async dailySarSweep(): Promise<void> {
+    this.logger.log('Running daily SAR sweep for unprocessed critical cases');
+
+    const unreported = await this.fraudCaseRepository.find({
+      where: {
+        severity: FraudSeverity.CRITICAL,
+        regulatoryReported: false,
+        status: FraudCaseStatus.OPEN,
+      },
+    });
+
+    for (const fraudCase of unreported) {
+      await this.generateSAR(fraudCase);
+    }
+
+    this.logger.log(
+      `Daily SAR sweep complete: processed ${unreported.length} cases`,
+    );
+  }
+ 
+  /** Weekly compliance report */
+  @Cron('0 8 * * 1') // Monday 8 AM
+  async weeklyComplianceReport(): Promise<void> {
+    const metrics = await this.getMetrics();
+    this.logger.log(
+      `Weekly Fraud Compliance Report: ${JSON.stringify(metrics, null, 2)}`,
+    );
+  }
+ 
+  // ─── Private Helpers ─────────────────────────────────────────────────────
+ 
+  private buildSarSummary(fraudCase: FraudCaseEntity): string {
+    return (
+      `Suspicious Activity Report: ${fraudCase.fraudType.replace(/_/g, ' ').toUpperCase()} ` +
+      `detected for trader ${fraudCase.traderId}. ` +
+      `ML confidence score: ${Number(fraudCase.mlScore).toFixed(2)}. ` +
+      `Severity: ${fraudCase.severity.toUpperCase()}. ` +
+      `Patterns triggered: ${(fraudCase.patternsTriggered ?? []).join(', ')}. ` +
+      `Market: ${fraudCase.market ?? 'Unknown'}. ` +
+      `Trade value: $${Number(fraudCase.tradeValue ?? 0).toLocaleString()}.`
+    );
+  }
+ 
+  private determineReportingObligation(severity: FraudSeverity): string {
+    switch (severity) {
+      case FraudSeverity.CRITICAL:
+        return 'MANDATORY: File SAR within 30 days per FinCEN/REMIT regulations';
+      case FraudSeverity.HIGH:
+        return 'REQUIRED: File SAR within 60 days; notify compliance immediately';
+      case FraudSeverity.MEDIUM:
+        return 'RECOMMENDED: File SAR and retain records for 5 years';
+      default:
+        return 'OPTIONAL: Log and monitor; no immediate SAR required';
+    }
+  }
+ 
+  private getApplicableRegulators(
+    market: string,
+    fraudType: FraudType,
+  ): string[] {
+    const regulators: string[] = ['FinCEN', 'CFTC'];
+ 
+    if (market.includes('EU') || market.includes('ETS'))
+      regulators.push('ACER', 'ESMA');
+    if (market.includes('PJM') || market.includes('ERCOT'))
+      regulators.push('FERC', 'NERC');
+    if (market.includes('GB') || market.includes('UK'))
+      regulators.push('Ofgem', 'FCA');
+ 
+    if (fraudType === FraudType.INSIDER_TRADING) regulators.push('SEC');
+    if (fraudType === FraudType.MARKET_MANIPULATION)
+      regulators.push('CFTC', 'FCA');
+ 
+    return [...new Set(regulators)];
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/algorithms/fee-prediction.algorithm.ts.html b/coverage/lcov-report/src/gas/algorithms/fee-prediction.algorithm.ts.html new file mode 100644 index 0000000..1d165c4 --- /dev/null +++ b/coverage/lcov-report/src/gas/algorithms/fee-prediction.algorithm.ts.html @@ -0,0 +1,460 @@ + + + + + + Code coverage report for src/gas/algorithms/fee-prediction.algorithm.ts + + + + + + + + + +
+
+

All files / src/gas/algorithms fee-prediction.algorithm.ts

+
+ +
+ 0% + Statements + 0/125 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/125 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { GasUsage } from '../entities/gas-usage.entity';
+import { ContractNetwork } from '../../contracts/entities/contract.entity';
+import { GasPriorityLevel } from '../dto/gas-estimate.dto';
+
+interface FeeSample {
+  fee: number;
+  timestamp: Date;
+}
+
+interface PredictionResult {
+  predictedFee: number;
+  confidenceScore: number;
+  estimatedConfirmationLedgers: number;
+}
+
+/**
+ * Fee prediction algorithm using exponential weighted moving average (EWMA)
+ * over recent on-chain gas samples.
+ *
+ * Priority multipliers:
+ *   LOW    → 0.9× baseline  (~95th-percentile confirmation time)
+ *   MEDIUM → 1.1× baseline  (~75th-percentile confirmation time)
+ *   HIGH   → 1.3× baseline  (~25th-percentile confirmation time)
+ */
+@Injectable()
+export class FeePredictionAlgorithm {
+  private readonly logger = new Logger(FeePredictionAlgorithm.name);
+
+  private static readonly EWMA_ALPHA = 0.3;
+  private static readonly SAMPLE_WINDOW_HOURS = 1;
+  private static readonly MIN_SAMPLES_FOR_PREDICTION = 3;
+  private static readonly FALLBACK_BASE_FEE = 100;
+
+  private static readonly PRIORITY_MULTIPLIERS: Record<
+    GasPriorityLevel,
+    number
+  > = {
+    [GasPriorityLevel.LOW]: 0.9,
+    [GasPriorityLevel.MEDIUM]: 1.1,
+    [GasPriorityLevel.HIGH]: 1.3,
+  };
+
+  private static readonly CONFIRMATION_LEDGERS: Record<
+    GasPriorityLevel,
+    number
+  > = {
+    [GasPriorityLevel.LOW]: 10,
+    [GasPriorityLevel.MEDIUM]: 5,
+    [GasPriorityLevel.HIGH]: 2,
+  };
+
+  constructor(
+    @InjectRepository(GasUsage)
+    private readonly gasUsageRepository: Repository<GasUsage>,
+  ) {}
+
+  async predict(
+    network: ContractNetwork,
+    priority: GasPriorityLevel,
+    baselineFee?: number,
+  ): Promise<PredictionResult> {
+    const samples = await this.recentSamples(network);
+    const baseline = baselineFee ?? this.ewma(samples);
+    const multiplier = FeePredictionAlgorithm.PRIORITY_MULTIPLIERS[priority];
+    const predictedFee = Math.ceil(baseline * multiplier);
+    const confidenceScore = this.computeConfidence(samples);
+
+    return {
+      predictedFee,
+      confidenceScore,
+      estimatedConfirmationLedgers:
+        FeePredictionAlgorithm.CONFIRMATION_LEDGERS[priority],
+    };
+  }
+
+  private async recentSamples(network: ContractNetwork): Promise<FeeSample[]> {
+    const since = new Date(
+      Date.now() - FeePredictionAlgorithm.SAMPLE_WINDOW_HOURS * 60 * 60 * 1000,
+    );
+
+    const rows = await this.gasUsageRepository
+      .createQueryBuilder('gu')
+      .select('gu.feeCharged', 'fee')
+      .addSelect('gu.recordedAt', 'timestamp')
+      .where('gu.network = :network', { network })
+      .andWhere('gu.recordedAt >= :since', { since })
+      .orderBy('gu.recordedAt', 'DESC')
+      .limit(100)
+      .getRawMany();
+
+    return rows.map((r) => ({
+      fee: Number(r.fee),
+      timestamp: new Date(r.timestamp),
+    }));
+  }
+
+  private ewma(samples: FeeSample[]): number {
+    if (samples.length < FeePredictionAlgorithm.MIN_SAMPLES_FOR_PREDICTION) {
+      this.logger.debug(
+        `Insufficient samples (${samples.length}); using fallback fee`,
+      );
+      return FeePredictionAlgorithm.FALLBACK_BASE_FEE;
+    }
+
+    const alpha = FeePredictionAlgorithm.EWMA_ALPHA;
+    // samples are DESC by timestamp; reverse for chronological processing
+    const chronological = [...samples].reverse();
+    let ewma = chronological[0].fee;
+    for (let i = 1; i < chronological.length; i++) {
+      ewma = alpha * chronological[i].fee + (1 - alpha) * ewma;
+    }
+    return ewma;
+  }
+
+  private computeConfidence(samples: FeeSample[]): number {
+    const n = samples.length;
+    if (n === 0) return 0;
+    if (n < FeePredictionAlgorithm.MIN_SAMPLES_FOR_PREDICTION) return 0.5;
+    // Confidence saturates at 0.99 as sample count grows
+    return Math.min(0.99, 0.7 + (n / 100) * 0.29);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/algorithms/index.html b/coverage/lcov-report/src/gas/algorithms/index.html new file mode 100644 index 0000000..7d81aa6 --- /dev/null +++ b/coverage/lcov-report/src/gas/algorithms/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gas/algorithms + + + + + + + + + +
+
+

All files src/gas/algorithms

+
+ +
+ 0% + Statements + 0/125 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/125 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
fee-prediction.algorithm.ts +
+
0%0/1250%0/10%0/10%0/125
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/batching/batching.service.ts.html b/coverage/lcov-report/src/gas/batching/batching.service.ts.html new file mode 100644 index 0000000..d47c1fd --- /dev/null +++ b/coverage/lcov-report/src/gas/batching/batching.service.ts.html @@ -0,0 +1,412 @@ + + + + + + Code coverage report for src/gas/batching/batching.service.ts + + + + + + + + + +
+
+

All files / src/gas/batching batching.service.ts

+
+ +
+ 100% + Statements + 109/109 +
+ + +
+ 93.33% + Branches + 14/15 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 109/109 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +1101x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +7x +8x +12x +12x +8x +6x +6x +6x +6x +6x +6x +6x +12x +12x +6x +6x +6x +6x +6x +6x +6x +6x +6x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +2x +2x +7x +7x +6x +6x +6x +6x +47x +47x +47x +47x +6x +6x +6x +6x +7x + 
import { Injectable, Logger } from '@nestjs/common';
+ 
+export interface BatchableOperation {
+  id: string;
+  estimatedFee: number;
+  network: string;
+  contractId?: string;
+}
+ 
+export interface BatchPlan {
+  batches: BatchableOperation[][];
+  estimatedIndividualCost: number;
+  estimatedBatchedCost: number;
+  savingsStroops: number;
+  savingsPercentage: number;
+}
+ 
+/**
+ * Groups compatible operations into batches to reduce total transaction fees.
+ *
+ * Stellar Soroban supports multiple operations in a single transaction, so
+ * grouping operations reduces the per-operation base fee overhead.
+ *
+ * Savings model:
+ *   Individual cost = Σ fee_i
+ *   Batched cost    = Σ batch_j_base_fee   (shared base fee amortised)
+ * where batch_j_base_fee = fee_of_heaviest_op_in_batch * BATCH_DISCOUNT
+ */
+@Injectable()
+export class BatchingService {
+  private readonly logger = new Logger(BatchingService.name);
+ 
+  private static readonly BATCH_DISCOUNT = 0.75;
+  private static readonly DEFAULT_MAX_BATCH_SIZE = 10;
+ 
+  planBatches(
+    operations: BatchableOperation[],
+    maxBatchSize: number = BatchingService.DEFAULT_MAX_BATCH_SIZE,
+  ): BatchPlan {
+    if (operations.length === 0) {
+      return {
+        batches: [],
+        estimatedIndividualCost: 0,
+        estimatedBatchedCost: 0,
+        savingsStroops: 0,
+        savingsPercentage: 0,
+      };
+    }
+ 
+    const networkGroups = this.groupByNetwork(operations);
+    const batches: BatchableOperation[][] = [];
+ 
+    for (const group of Object.values(networkGroups)) {
+      for (let i = 0; i < group.length; i += maxBatchSize) {
+        batches.push(group.slice(i, i + maxBatchSize));
+      }
+    }
+ 
+    const estimatedIndividualCost = operations.reduce(
+      (sum, op) => sum + op.estimatedFee,
+      0,
+    );
+ 
+    const estimatedBatchedCost = batches.reduce((sum, batch) => {
+      const heaviest = Math.max(...batch.map((op) => op.estimatedFee));
+      return sum + heaviest * BatchingService.BATCH_DISCOUNT;
+    }, 0);
+ 
+    const savingsStroops = Math.max(
+      0,
+      estimatedIndividualCost - estimatedBatchedCost,
+    );
+    const savingsPercentage =
+      estimatedIndividualCost > 0
+        ? (savingsStroops / estimatedIndividualCost) * 100
+        : 0;
+ 
+    this.logger.debug(
+      `Batching plan: ${operations.length} ops → ${batches.length} batches, ` +
+        `savings ${savingsPercentage.toFixed(1)}%`,
+    );
+ 
+    return {
+      batches,
+      estimatedIndividualCost,
+      estimatedBatchedCost,
+      savingsStroops,
+      savingsPercentage,
+    };
+  }
+ 
+  isBatchingWorthwhile(plan: BatchPlan): boolean {
+    return plan.savingsPercentage >= 5 && plan.batches.length > 1;
+  }
+ 
+  private groupByNetwork(
+    operations: BatchableOperation[],
+  ): Record<string, BatchableOperation[]> {
+    return operations.reduce(
+      (acc, op) => {
+        const key = op.network;
+        if (!acc[key]) acc[key] = [];
+        acc[key].push(op);
+        return acc;
+      },
+      {} as Record<string, BatchableOperation[]>,
+    );
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/batching/index.html b/coverage/lcov-report/src/gas/batching/index.html new file mode 100644 index 0000000..1c81367 --- /dev/null +++ b/coverage/lcov-report/src/gas/batching/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gas/batching + + + + + + + + + +
+
+

All files src/gas/batching

+
+ +
+ 100% + Statements + 109/109 +
+ + +
+ 93.33% + Branches + 14/15 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 109/109 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
batching.service.ts +
+
100%109/10993.33%14/15100%4/4100%109/109
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/dto/gas-estimate.dto.ts.html b/coverage/lcov-report/src/gas/dto/gas-estimate.dto.ts.html new file mode 100644 index 0000000..a1985c9 --- /dev/null +++ b/coverage/lcov-report/src/gas/dto/gas-estimate.dto.ts.html @@ -0,0 +1,574 @@ + + + + + + Code coverage report for src/gas/dto/gas-estimate.dto.ts + + + + + + + + + +
+
+

All files / src/gas/dto gas-estimate.dto.ts

+
+ +
+ 0% + Statements + 0/163 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/163 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
+import {
+  IsEnum,
+  IsOptional,
+  IsString,
+  IsArray,
+  IsBoolean,
+  IsNumber,
+  Min,
+  Max,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { ContractNetwork } from '../../contracts/entities/contract.entity';
+
+export enum GasPriorityLevel {
+  LOW = 'low',
+  MEDIUM = 'medium',
+  HIGH = 'high',
+}
+
+export class GasEstimateRequestDto {
+  @ApiProperty({ description: 'Target Stellar network', enum: ContractNetwork })
+  @IsEnum(ContractNetwork)
+  network: ContractNetwork;
+
+  @ApiPropertyOptional({
+    description: 'Contract ID to estimate gas for',
+    example: 'CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC',
+  })
+  @IsOptional()
+  @IsString()
+  contractId?: string;
+
+  @ApiPropertyOptional({
+    description: 'Contract method to invoke',
+    example: 'transfer',
+  })
+  @IsOptional()
+  @IsString()
+  method?: string;
+
+  @ApiPropertyOptional({
+    description: 'Priority level for fee optimization',
+    enum: GasPriorityLevel,
+    default: GasPriorityLevel.MEDIUM,
+  })
+  @IsOptional()
+  @IsEnum(GasPriorityLevel)
+  priority?: GasPriorityLevel = GasPriorityLevel.MEDIUM;
+
+  @ApiPropertyOptional({
+    description: 'Whether to include batching recommendations',
+    default: false,
+  })
+  @IsOptional()
+  @IsBoolean()
+  includeBatchingRecommendation?: boolean = false;
+}
+
+export class BatchEstimateRequestDto {
+  @ApiProperty({ description: 'Target Stellar network', enum: ContractNetwork })
+  @IsEnum(ContractNetwork)
+  network: ContractNetwork;
+
+  @ApiProperty({
+    description: 'Transaction IDs or operation descriptors to batch',
+    type: [String],
+  })
+  @IsArray()
+  @IsString({ each: true })
+  operationIds: string[];
+
+  @ApiPropertyOptional({
+    description: 'Maximum transactions per batch',
+    minimum: 2,
+    maximum: 100,
+    default: 10,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(2)
+  @Max(100)
+  maxBatchSize?: number = 10;
+}
+
+export class BatchingRecommendationDto {
+  @ApiProperty({ description: 'Whether batching is recommended' })
+  recommended: boolean;
+
+  @ApiProperty({ description: 'Estimated savings in stroops when batching' })
+  estimatedSavingsStroops: number;
+
+  @ApiProperty({ description: 'Savings percentage versus individual txns' })
+  savingsPercentage: number;
+
+  @ApiProperty({ description: 'Recommended batch size' })
+  recommendedBatchSize: number;
+}
+
+export class GasEstimateResponseDto {
+  @ApiProperty({ description: 'Stellar network this estimate applies to' })
+  network: ContractNetwork;
+
+  @ApiProperty({ description: 'Estimated CPU instructions' })
+  cpuInstructions: number;
+
+  @ApiProperty({ description: 'Estimated read bytes' })
+  readBytes: number;
+
+  @ApiProperty({ description: 'Estimated write bytes' })
+  writeBytes: number;
+
+  @ApiProperty({ description: 'Minimum resource fee in stroops' })
+  minResourceFee: string;
+
+  @ApiProperty({ description: 'Recommended fee (min * multiplier) in stroops' })
+  recommendedFee: string;
+
+  @ApiProperty({ description: 'Optimized fee based on network conditions' })
+  optimizedFee: string;
+
+  @ApiProperty({ description: 'Priority level used for this estimate' })
+  priority: GasPriorityLevel;
+
+  @ApiProperty({ description: 'Estimated confirmation time in ledgers' })
+  estimatedConfirmationLedgers: number;
+
+  @ApiProperty({ description: 'Milliseconds taken to produce this estimate' })
+  estimationDurationMs: number;
+
+  @ApiPropertyOptional({ description: 'Batching recommendation if requested' })
+  batchingRecommendation?: BatchingRecommendationDto;
+}
+
+export class GasAnalyticsResponseDto {
+  @ApiProperty({ description: 'Network queried' })
+  network: ContractNetwork;
+
+  @ApiProperty({ description: 'Average fee charged over the period' })
+  averageFeeStroops: number;
+
+  @ApiProperty({ description: 'Median fee charged over the period' })
+  medianFeeStroops: number;
+
+  @ApiProperty({ description: 'Average CPU instructions consumed' })
+  averageCpuInstructions: number;
+
+  @ApiProperty({ description: 'Total transactions analyzed' })
+  totalTransactions: number;
+
+  @ApiProperty({ description: 'Total savings achieved through batching' })
+  totalBatchingSavingsStroops: number;
+
+  @ApiProperty({ description: 'Percentage of transactions that were batched' })
+  batchingAdoptionRate: number;
+
+  @ApiProperty({ description: 'Start of the analysis window' })
+  periodStart: Date;
+
+  @ApiProperty({ description: 'End of the analysis window' })
+  periodEnd: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/dto/index.html b/coverage/lcov-report/src/gas/dto/index.html new file mode 100644 index 0000000..f692756 --- /dev/null +++ b/coverage/lcov-report/src/gas/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gas/dto + + + + + + + + + +
+
+

All files src/gas/dto

+
+ +
+ 0% + Statements + 0/163 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/163 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
gas-estimate.dto.ts +
+
0%0/1630%0/10%0/10%0/163
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/entities/gas-usage.entity.ts.html b/coverage/lcov-report/src/gas/entities/gas-usage.entity.ts.html new file mode 100644 index 0000000..9a64d96 --- /dev/null +++ b/coverage/lcov-report/src/gas/entities/gas-usage.entity.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for src/gas/entities/gas-usage.entity.ts + + + + + + + + + +
+
+

All files / src/gas/entities gas-usage.entity.ts

+
+ +
+ 0% + Statements + 0/65 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Column,
+  CreateDateColumn,
+  Entity,
+  Index,
+  PrimaryGeneratedColumn,
+} from 'typeorm';
+import { ContractNetwork } from '../../contracts/entities/contract.entity';
+
+export enum GasOperationType {
+  CONTRACT_INVOKE = 'contract_invoke',
+  CONTRACT_DEPLOY = 'contract_deploy',
+  TOKEN_TRANSFER = 'token_transfer',
+  BATCHED = 'batched',
+}
+
+@Entity('gas_usage')
+@Index(['network', 'recordedAt'])
+@Index(['operationType', 'network'])
+export class GasUsage {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'enum', enum: ContractNetwork })
+  network: ContractNetwork;
+
+  @Column({ type: 'enum', enum: GasOperationType })
+  operationType: GasOperationType;
+
+  @Column({ nullable: true })
+  contractId?: string;
+
+  @Column({ nullable: true })
+  transactionHash?: string;
+
+  @Column({ type: 'bigint' })
+  cpuInstructions: number;
+
+  @Column({ type: 'bigint' })
+  readBytes: number;
+
+  @Column({ type: 'bigint' })
+  writeBytes: number;
+
+  @Column({ type: 'decimal', precision: 20, scale: 0 })
+  feeCharged: string;
+
+  @Column({ type: 'decimal', precision: 20, scale: 0, nullable: true })
+  estimatedFee?: string;
+
+  @Column({ type: 'boolean', default: false })
+  wasBatched: boolean;
+
+  @Column({ type: 'integer', default: 1 })
+  batchSize: number;
+
+  @Column({ type: 'integer', nullable: true })
+  ledger?: number;
+
+  @Column({ type: 'timestamp' })
+  recordedAt: Date;
+
+  @CreateDateColumn()
+  createdAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/entities/index.html b/coverage/lcov-report/src/gas/entities/index.html new file mode 100644 index 0000000..4d34ed4 --- /dev/null +++ b/coverage/lcov-report/src/gas/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gas/entities + + + + + + + + + +
+
+

All files src/gas/entities

+
+ +
+ 0% + Statements + 0/65 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
gas-usage.entity.ts +
+
0%0/650%0/10%0/10%0/65
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/gas-estimator.service.ts.html b/coverage/lcov-report/src/gas/gas-estimator.service.ts.html new file mode 100644 index 0000000..a0d670d --- /dev/null +++ b/coverage/lcov-report/src/gas/gas-estimator.service.ts.html @@ -0,0 +1,574 @@ + + + + + + Code coverage report for src/gas/gas-estimator.service.ts + + + + + + + + + +
+
+

All files / src/gas gas-estimator.service.ts

+
+ +
+ 0% + Statements + 0/163 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/163 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { GasUsage } from './entities/gas-usage.entity';
+import {
+  GasEstimateRequestDto,
+  GasEstimateResponseDto,
+  GasAnalyticsResponseDto,
+  GasPriorityLevel,
+} from './dto/gas-estimate.dto';
+import { GasOptimizerService } from './optimizer/gas-optimizer.service';
+import { SorobanClientService } from '../contracts/soroban-client.service';
+import {
+  ContractNetwork,
+  ContractType,
+} from '../contracts/entities/contract.entity';
+
+@Injectable()
+export class GasEstimatorService {
+  private readonly logger = new Logger(GasEstimatorService.name);
+
+  constructor(
+    @InjectRepository(GasUsage)
+    private readonly gasUsageRepository: Repository<GasUsage>,
+    private readonly optimizer: GasOptimizerService,
+    private readonly sorobanClient: SorobanClientService,
+  ) {}
+
+  /**
+   * Produce a gas estimate for a contract operation, combining a live
+   * simulation (when contractId + method are supplied) with the EWMA
+   * fee-prediction algorithm.
+   *
+   * Estimation calculations complete in <100 ms for cached/predicted paths.
+   */
+  async estimate(
+    request: GasEstimateRequestDto,
+  ): Promise<GasEstimateResponseDto> {
+    const start = Date.now();
+    const priority = request.priority ?? GasPriorityLevel.MEDIUM;
+
+    let cpuInstructions = 0;
+    let readBytes = 0;
+    let writeBytes = 0;
+    let minResourceFee = '100';
+    let recommendedFee = '110';
+
+    if (request.contractId && request.method) {
+      try {
+        const gasEst = await this.sorobanClient.estimateGas({
+          contractId: request.contractId,
+          contractType: ContractType.TOKEN,
+          network: request.network,
+          method: request.method,
+        });
+        cpuInstructions = gasEst.cpuInstructions ?? 0;
+        readBytes = gasEst.readBytes ?? 0;
+        writeBytes = gasEst.writeBytes ?? 0;
+        minResourceFee = gasEst.minResourceFee ?? '100';
+        recommendedFee = gasEst.recommendedFee ?? '110';
+      } catch (err) {
+        this.logger.warn(
+          `Live simulation failed for ${request.contractId}.${request.method}; ` +
+            `falling back to prediction: ${err.message}`,
+        );
+      }
+    }
+
+    const {
+      optimizedFee,
+      estimatedConfirmationLedgers,
+      batchingRecommendation,
+    } = await this.optimizer.optimiseFee(
+      request.network,
+      minResourceFee,
+      priority,
+      request.includeBatchingRecommendation ?? false,
+    );
+
+    const estimationDurationMs = Date.now() - start;
+
+    return {
+      network: request.network,
+      cpuInstructions,
+      readBytes,
+      writeBytes,
+      minResourceFee,
+      recommendedFee,
+      optimizedFee,
+      priority,
+      estimatedConfirmationLedgers,
+      estimationDurationMs,
+      batchingRecommendation,
+    };
+  }
+
+  /**
+   * Aggregate gas analytics for a network over a rolling window.
+   * Used to surface cost trends and batching adoption metrics.
+   */
+  async getAnalytics(
+    network: ContractNetwork,
+    windowHours: number = 24,
+  ): Promise<GasAnalyticsResponseDto> {
+    const periodEnd = new Date();
+    const periodStart = new Date(Date.now() - windowHours * 60 * 60 * 1000);
+
+    const rows = await this.gasUsageRepository
+      .createQueryBuilder('gu')
+      .select('CAST(gu.feeCharged AS FLOAT)', 'fee')
+      .addSelect('gu.cpuInstructions', 'cpu')
+      .addSelect('gu.wasBatched', 'batched')
+      .addSelect('gu.estimatedFee', 'estimated')
+      .where('gu.network = :network', { network })
+      .andWhere('gu.recordedAt BETWEEN :start AND :end', {
+        start: periodStart,
+        end: periodEnd,
+      })
+      .getRawMany();
+
+    const fees = rows.map((r) => Number(r.fee));
+    const sorted = [...fees].sort((a, b) => a - b);
+    const totalTransactions = rows.length;
+    const averageFeeStroops =
+      totalTransactions > 0
+        ? fees.reduce((s, f) => s + f, 0) / totalTransactions
+        : 0;
+    const medianFeeStroops =
+      totalTransactions > 0 ? sorted[Math.floor(totalTransactions / 2)] : 0;
+    const averageCpuInstructions =
+      totalTransactions > 0
+        ? rows.reduce((s, r) => s + Number(r.cpu), 0) / totalTransactions
+        : 0;
+
+    const batchedCount = rows.filter((r) => r.batched).length;
+    const batchingAdoptionRate =
+      totalTransactions > 0 ? (batchedCount / totalTransactions) * 100 : 0;
+
+    const totalBatchingSavingsStroops = rows.reduce((sum, r) => {
+      if (!r.batched || !r.estimated) return sum;
+      return sum + Math.max(0, Number(r.estimated) - Number(r.fee));
+    }, 0);
+
+    return {
+      network,
+      averageFeeStroops,
+      medianFeeStroops,
+      averageCpuInstructions,
+      totalTransactions,
+      totalBatchingSavingsStroops,
+      batchingAdoptionRate,
+      periodStart,
+      periodEnd,
+    };
+  }
+
+  /**
+   * Persist a gas usage record after a transaction completes.
+   */
+  async recordUsage(usage: Partial<GasUsage>): Promise<GasUsage> {
+    return this.optimizer.recordUsage(usage);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/gas.module.ts.html b/coverage/lcov-report/src/gas/gas.module.ts.html new file mode 100644 index 0000000..c9b58a7 --- /dev/null +++ b/coverage/lcov-report/src/gas/gas.module.ts.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for src/gas/gas.module.ts + + + + + + + + + +
+
+

All files / src/gas gas.module.ts

+
+ +
+ 0% + Statements + 0/24 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { HttpModule } from '@nestjs/axios';
+import { GasUsage } from './entities/gas-usage.entity';
+import { GasEstimatorService } from './gas-estimator.service';
+import { FeePredictionAlgorithm } from './algorithms/fee-prediction.algorithm';
+import { BatchingService } from './batching/batching.service';
+import { GasOptimizerService } from './optimizer/gas-optimizer.service';
+import { SorobanClientService } from '../contracts/soroban-client.service';
+import { CustomInstrumentation } from '../tracing/instrumentation/custom-instrumentation';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([GasUsage]), HttpModule],
+  providers: [
+    GasEstimatorService,
+    FeePredictionAlgorithm,
+    BatchingService,
+    GasOptimizerService,
+    SorobanClientService,
+    CustomInstrumentation,
+  ],
+  exports: [GasEstimatorService, BatchingService],
+})
+export class GasModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/index.html b/coverage/lcov-report/src/gas/index.html new file mode 100644 index 0000000..133751f --- /dev/null +++ b/coverage/lcov-report/src/gas/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/gas + + + + + + + + + +
+
+

All files src/gas

+
+ +
+ 0% + Statements + 0/187 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/187 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
gas-estimator.service.ts +
+
0%0/1630%0/10%0/10%0/163
gas.module.ts +
+
0%0/240%0/10%0/10%0/24
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/optimizer/gas-optimizer.service.ts.html b/coverage/lcov-report/src/gas/optimizer/gas-optimizer.service.ts.html new file mode 100644 index 0000000..52f6e76 --- /dev/null +++ b/coverage/lcov-report/src/gas/optimizer/gas-optimizer.service.ts.html @@ -0,0 +1,370 @@ + + + + + + Code coverage report for src/gas/optimizer/gas-optimizer.service.ts + + + + + + + + + +
+
+

All files / src/gas/optimizer gas-optimizer.service.ts

+
+ +
+ 0% + Statements + 0/95 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/95 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { GasUsage } from '../entities/gas-usage.entity';
+import {
+  GasEstimateResponseDto,
+  GasPriorityLevel,
+  BatchingRecommendationDto,
+} from '../dto/gas-estimate.dto';
+import { FeePredictionAlgorithm } from '../algorithms/fee-prediction.algorithm';
+import { BatchingService } from '../batching/batching.service';
+import { ContractNetwork } from '../../contracts/entities/contract.entity';
+
+/**
+ * Orchestrates fee prediction and batching to produce an optimised gas
+ * estimate.  It combines the predicted fee from the EWMA algorithm with
+ * network-condition adjustments and optionally appends a batching
+ * recommendation.
+ */
+@Injectable()
+export class GasOptimizerService {
+  private readonly logger = new Logger(GasOptimizerService.name);
+
+  constructor(
+    @InjectRepository(GasUsage)
+    private readonly gasUsageRepository: Repository<GasUsage>,
+    private readonly feePrediction: FeePredictionAlgorithm,
+    private readonly batchingService: BatchingService,
+  ) {}
+
+  async optimiseFee(
+    network: ContractNetwork,
+    minResourceFee: string,
+    priority: GasPriorityLevel,
+    includeBatchingRecommendation: boolean,
+  ): Promise<{
+    optimizedFee: string;
+    estimatedConfirmationLedgers: number;
+    batchingRecommendation?: BatchingRecommendationDto;
+  }> {
+    const start = Date.now();
+    const baseline = Number(minResourceFee) || 0;
+
+    const prediction = await this.feePrediction.predict(
+      network,
+      priority,
+      baseline,
+    );
+
+    const optimizedFee = String(Math.max(baseline, prediction.predictedFee));
+
+    this.logger.debug(
+      `Optimised fee for ${network}/${priority}: ${optimizedFee} stroops ` +
+        `(confidence=${prediction.confidenceScore.toFixed(2)}) in ${Date.now() - start}ms`,
+    );
+
+    let batchingRecommendation: BatchingRecommendationDto | undefined;
+    if (includeBatchingRecommendation) {
+      batchingRecommendation = this.buildBatchingRecommendation(
+        Number(optimizedFee),
+      );
+    }
+
+    return {
+      optimizedFee,
+      estimatedConfirmationLedgers: prediction.estimatedConfirmationLedgers,
+      batchingRecommendation,
+    };
+  }
+
+  async recordUsage(usage: Partial<GasUsage>): Promise<GasUsage> {
+    const record = this.gasUsageRepository.create({
+      ...usage,
+      recordedAt: usage.recordedAt ?? new Date(),
+    });
+    return this.gasUsageRepository.save(record);
+  }
+
+  private buildBatchingRecommendation(
+    feePerOp: number,
+  ): BatchingRecommendationDto {
+    const sampleOps = Array.from({ length: 5 }, (_, i) => ({
+      id: `op-${i}`,
+      estimatedFee: feePerOp,
+      network: 'testnet',
+    }));
+    const plan = this.batchingService.planBatches(sampleOps);
+    return {
+      recommended: this.batchingService.isBatchingWorthwhile(plan),
+      estimatedSavingsStroops: plan.savingsStroops,
+      savingsPercentage: Number(plan.savingsPercentage.toFixed(2)),
+      recommendedBatchSize: 5,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gas/optimizer/index.html b/coverage/lcov-report/src/gas/optimizer/index.html new file mode 100644 index 0000000..03653f4 --- /dev/null +++ b/coverage/lcov-report/src/gas/optimizer/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gas/optimizer + + + + + + + + + +
+
+

All files src/gas/optimizer

+
+ +
+ 0% + Statements + 0/95 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/95 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
gas-optimizer.service.ts +
+
0%0/950%0/10%0/10%0/95
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/api-gateway.module.ts.html b/coverage/lcov-report/src/gateway/api-gateway.module.ts.html new file mode 100644 index 0000000..bb7674c --- /dev/null +++ b/coverage/lcov-report/src/gateway/api-gateway.module.ts.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for src/gateway/api-gateway.module.ts + + + + + + + + + +
+
+

All files / src/gateway api-gateway.module.ts

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module, Global } from '@nestjs/common';
+import { ConfigModule } from '@nestjs/config';
+import { HttpModule } from '@nestjs/axios';
+import { AdvancedRateLimiterService } from './rate-limiting/advanced-rate-limiter.service';
+import { RequestTransformerService } from './transformation/request-transformer.service';
+import { GatewayAuthService } from './auth/gateway-auth.service';
+import { GatewayMonitorService } from './monitoring/gateway-monitor.service';
+import { CircuitBreakerService } from './circuit-breaker/circuit-breaker.service';
+
+@Global()
+@Module({
+  imports: [
+    HttpModule.register({
+      timeout: 5000,
+      maxRedirects: 5,
+    }),
+    ConfigModule,
+  ],
+  providers: [
+    AdvancedRateLimiterService,
+    RequestTransformerService,
+    GatewayAuthService,
+    GatewayMonitorService,
+    CircuitBreakerService,
+  ],
+  exports: [
+    AdvancedRateLimiterService,
+    RequestTransformerService,
+    GatewayAuthService,
+    GatewayMonitorService,
+    CircuitBreakerService,
+  ],
+})
+export class ApiGatewayModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/auth/gateway-auth.service.ts.html b/coverage/lcov-report/src/gateway/auth/gateway-auth.service.ts.html new file mode 100644 index 0000000..2125e84 --- /dev/null +++ b/coverage/lcov-report/src/gateway/auth/gateway-auth.service.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/gateway/auth/gateway-auth.service.ts + + + + + + + + + +
+
+

All files / src/gateway/auth gateway-auth.service.ts

+
+ +
+ 100% + Statements + 31/31 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 31/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +321x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +1x +1x +1x +4x + 
import { Injectable, Logger, UnauthorizedException } from '@nestjs/common';
+ 
+@Injectable()
+export class GatewayAuthService {
+  private readonly logger = new Logger(GatewayAuthService.name);
+ 
+  /**
+   * Validates an API key or JWT token.
+   * @param token The token or API key to validate.
+   * @returns A promise that resolves to true if the token is valid, false otherwise.
+   */
+  async validateRequest(token: string): Promise<boolean> {
+    this.logger.debug(`Validating request token: ${token}`);
+ 
+    // Placeholder for actual validation logic (e.g. JWT check or API key look up)
+    if (!token) {
+      throw new UnauthorizedException('Missing authentication token');
+    }
+ 
+    // In production, this would involve database lookup or external service call
+    return true;
+  }
+ 
+  /**
+   * Generates a new API key for a user (example).
+   */
+  async generateApiKey(userId: string): Promise<string> {
+    // Logic to generate and store API key
+    return `key_${Math.random().toString(36).substring(2, 15)}`;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/auth/index.html b/coverage/lcov-report/src/gateway/auth/index.html new file mode 100644 index 0000000..17ec991 --- /dev/null +++ b/coverage/lcov-report/src/gateway/auth/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gateway/auth + + + + + + + + + +
+
+

All files src/gateway/auth

+
+ +
+ 100% + Statements + 31/31 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 31/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
gateway-auth.service.ts +
+
100%31/31100%4/4100%3/3100%31/31
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/circuit-breaker/circuit-breaker.service.ts.html b/coverage/lcov-report/src/gateway/circuit-breaker/circuit-breaker.service.ts.html new file mode 100644 index 0000000..e5c1d46 --- /dev/null +++ b/coverage/lcov-report/src/gateway/circuit-breaker/circuit-breaker.service.ts.html @@ -0,0 +1,271 @@ + + + + + + Code coverage report for src/gateway/circuit-breaker/circuit-breaker.service.ts + + + + + + + + + +
+
+

All files / src/gateway/circuit-breaker circuit-breaker.service.ts

+
+ +
+ 96.77% + Statements + 60/62 +
+ + +
+ 100% + Branches + 7/7 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 96.77% + Lines + 60/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +631x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +8x +2x +2x +2x +2x +8x +5x +5x +5x +5x +5x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +11x +11x +11x +11x +11x +11x +2x +2x +2x +2x +2x +  +  +2x +2x +11x +5x + 
import {
+  Injectable,
+  Logger,
+  InternalServerErrorException,
+} from '@nestjs/common';
+ 
+enum CircuitBreakerState {
+  CLOSED,
+  OPEN,
+  HALF_OPEN,
+}
+ 
+@Injectable()
+export class CircuitBreakerService {
+  private readonly logger = new Logger(CircuitBreakerService.name);
+  private state: CircuitBreakerState = CircuitBreakerState.CLOSED;
+  private failureCount: number = 0;
+  private readonly threshold: number = 5;
+  private readonly timeout: number = 30000; // 30 seconds
+ 
+  /**
+   * Checks if the circuit is open. If so, it throws an error.
+   */
+  async checkCircuit(): Promise<void> {
+    if (this.state === CircuitBreakerState.OPEN) {
+      throw new InternalServerErrorException(
+        'Circuit is open, please try again later',
+      );
+    }
+  }
+ 
+  /**
+   * Logs a successful request and resets the failure count.
+   */
+  async reportSuccess(): Promise<void> {
+    this.failureCount = 0;
+    this.state = CircuitBreakerState.CLOSED;
+    this.logger.debug('Circuit Breaker status: CLOSED');
+  }
+ 
+  /**
+   * Logs a failed request and increments the failure count.
+   * If the failure count exceeds the threshold, the circuit is opened.
+   */
+  async reportFailure(): Promise<void> {
+    this.failureCount++;
+    this.logger.error(
+      `Circuit Breaker status: FAILURE (Count: ${this.failureCount}/${this.threshold})`,
+    );
+ 
+    if (this.failureCount >= this.threshold) {
+      this.state = CircuitBreakerState.OPEN;
+      this.logger.error('Circuit Breaker status: OPEN');
+ 
+      // Reset state to HALF_OPEN after timeout
+      setTimeout(() => {
+        this.state = CircuitBreakerState.HALF_OPEN;
+        this.logger.warn('Circuit Breaker status: HALF_OPEN');
+      }, this.timeout);
+    }
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/circuit-breaker/index.html b/coverage/lcov-report/src/gateway/circuit-breaker/index.html new file mode 100644 index 0000000..622f3ec --- /dev/null +++ b/coverage/lcov-report/src/gateway/circuit-breaker/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gateway/circuit-breaker + + + + + + + + + +
+
+

All files src/gateway/circuit-breaker

+
+ +
+ 96.77% + Statements + 60/62 +
+ + +
+ 100% + Branches + 7/7 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 96.77% + Lines + 60/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
circuit-breaker.service.ts +
+
96.77%60/62100%7/7100%4/496.77%60/62
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/index.html b/coverage/lcov-report/src/gateway/index.html new file mode 100644 index 0000000..132ae60 --- /dev/null +++ b/coverage/lcov-report/src/gateway/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gateway + + + + + + + + + +
+
+

All files src/gateway

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
api-gateway.module.ts +
+
0%0/340%0/10%0/10%0/34
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/monitoring/gateway-monitor.service.ts.html b/coverage/lcov-report/src/gateway/monitoring/gateway-monitor.service.ts.html new file mode 100644 index 0000000..27d4b3b --- /dev/null +++ b/coverage/lcov-report/src/gateway/monitoring/gateway-monitor.service.ts.html @@ -0,0 +1,247 @@ + + + + + + Code coverage report for src/gateway/monitoring/gateway-monitor.service.ts + + + + + + + + + +
+
+

All files / src/gateway/monitoring gateway-monitor.service.ts

+
+ +
+ 100% + Statements + 54/54 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 54/54 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +551x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { Counter, Histogram, Registry } from 'prom-client';
+ 
+@Injectable()
+export class GatewayMonitorService {
+  private readonly logger = new Logger(GatewayMonitorService.name);
+  private readonly registry: Registry;
+  private readonly requestCounter: Counter<string>;
+  private readonly responseTimeHistogram: Histogram<string>;
+ 
+  constructor() {
+    this.registry = new Registry();
+    this.requestCounter = new Counter({
+      name: 'api_gateway_requests_total',
+      help: 'Total number of requests handled by the API gateway',
+      labelNames: ['method', 'path', 'status'],
+      registers: [this.registry],
+    });
+    this.responseTimeHistogram = new Histogram({
+      name: 'api_gateway_response_time_ms',
+      help: 'Response time for API gateway requests in milliseconds',
+      labelNames: ['method', 'path'],
+      buckets: [10, 50, 100, 200, 500, 1000],
+      registers: [this.registry],
+    });
+  }
+ 
+  /**
+   * Logs a request and updates metrics.
+   * @param method The HTTP method of the request.
+   * @param path The request path.
+   * @param status The response status code.
+   * @param duration The duration of the request in milliseconds.
+   */
+  logRequest(
+    method: string,
+    path: string,
+    status: number,
+    duration: number,
+  ): void {
+    this.logger.log(
+      `[${method}] ${path} - Status: ${status} - Duration: ${duration}ms`,
+    );
+    this.requestCounter.inc({ method, path, status: status.toString() });
+    this.responseTimeHistogram.observe({ method, path }, duration);
+  }
+ 
+  /**
+   * Gets the current Prometheus metrics for the gateway.
+   */
+  async getMetrics(): Promise<string> {
+    return this.registry.metrics();
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/monitoring/index.html b/coverage/lcov-report/src/gateway/monitoring/index.html new file mode 100644 index 0000000..6b78a1d --- /dev/null +++ b/coverage/lcov-report/src/gateway/monitoring/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gateway/monitoring + + + + + + + + + +
+
+

All files src/gateway/monitoring

+
+ +
+ 100% + Statements + 54/54 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 54/54 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
gateway-monitor.service.ts +
+
100%54/54100%3/3100%3/3100%54/54
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/rate-limiting/advanced-rate-limiter.service.ts.html b/coverage/lcov-report/src/gateway/rate-limiting/advanced-rate-limiter.service.ts.html new file mode 100644 index 0000000..a0c442f --- /dev/null +++ b/coverage/lcov-report/src/gateway/rate-limiting/advanced-rate-limiter.service.ts.html @@ -0,0 +1,220 @@ + + + + + + Code coverage report for src/gateway/rate-limiting/advanced-rate-limiter.service.ts + + + + + + + + + +
+
+

All files / src/gateway/rate-limiting advanced-rate-limiter.service.ts

+
+ +
+ 95.55% + Statements + 43/45 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 95.55% + Lines + 43/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +461x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +  +  +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { ThrottlerStorageService } from '@nestjs/throttler';
+ 
+@Injectable()
+export class AdvancedRateLimiterService {
+  private readonly logger = new Logger(AdvancedRateLimiterService.name);
+ 
+  constructor() {}
+ 
+  /**
+   * Checks if a request should be rate limited based on IP and optional user ID.
+   * @param ip The IP address of the requester.
+   * @param userId Optional user ID for more granular rate limiting.
+   * @param limit The maximum number of requests allowed in the period.
+   * @param ttl The time-to-live for the rate limit period in milliseconds.
+   * @returns A promise that resolves to true if the request is allowed, false otherwise.
+   */
+  async checkRateLimit(
+    ip: string,
+    userId?: string,
+    limit: number = 100,
+    ttl: number = 60000,
+  ): Promise<boolean> {
+    const key = userId ? `user:${userId}` : `ip:${ip}`;
+ 
+    // In a real-world scenario, we'd use a distributed storage like Redis here.
+    // For now, we'll implement a simple in-memory bucket for demonstration.
+    // Given the 10k RPS requirement, this should eventually be backed by Redis.
+ 
+    this.logger.debug(
+      `Checking rate limit for ${key} (Limit: ${limit}, TTL: ${ttl}ms)`,
+    );
+ 
+    // Placeholder for actual rate limiting logic
+    // In production, this would call Redis or another distributed cache
+    return true;
+  }
+ 
+  /**
+   * Get current usage for a specific key.
+   */
+  async getUsage(key: string): Promise<number> {
+    return 0; // Placeholder
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/rate-limiting/index.html b/coverage/lcov-report/src/gateway/rate-limiting/index.html new file mode 100644 index 0000000..95f39a2 --- /dev/null +++ b/coverage/lcov-report/src/gateway/rate-limiting/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gateway/rate-limiting + + + + + + + + + +
+
+

All files src/gateway/rate-limiting

+
+ +
+ 95.55% + Statements + 43/45 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 95.55% + Lines + 43/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
advanced-rate-limiter.service.ts +
+
95.55%43/45100%4/466.66%2/395.55%43/45
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/transformation/index.html b/coverage/lcov-report/src/gateway/transformation/index.html new file mode 100644 index 0000000..8a0d98f --- /dev/null +++ b/coverage/lcov-report/src/gateway/transformation/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/gateway/transformation + + + + + + + + + +
+
+

All files src/gateway/transformation

+
+ +
+ 96.72% + Statements + 59/61 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 96.72% + Lines + 59/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
request-transformer.service.ts +
+
96.72%59/6190%9/10100%5/596.72%59/61
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/gateway/transformation/request-transformer.service.ts.html b/coverage/lcov-report/src/gateway/transformation/request-transformer.service.ts.html new file mode 100644 index 0000000..5344857 --- /dev/null +++ b/coverage/lcov-report/src/gateway/transformation/request-transformer.service.ts.html @@ -0,0 +1,268 @@ + + + + + + Code coverage report for src/gateway/transformation/request-transformer.service.ts + + + + + + + + + +
+
+

All files / src/gateway/transformation request-transformer.service.ts

+
+ +
+ 96.72% + Statements + 59/61 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 96.72% + Lines + 59/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +621x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +2x +2x +2x +2x +1x +2x +1x +2x +2x +5x +5x +5x +5x +5x +5x +5x +5x +2x +2x +2x +2x +1x +2x +1x +2x +2x +5x +5x +1x +1x +1x +1x +1x +1x +1x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +5x + 
import { Injectable, Logger } from '@nestjs/common';
+ 
+@Injectable()
+export class RequestTransformerService {
+  private readonly logger = new Logger(RequestTransformerService.name);
+ 
+  /**
+   * Transforms the request body based on the specified transformation rule.
+   * @param body The request body to transform.
+   * @param rule The name of the transformation rule to apply.
+   * @returns The transformed body.
+   */
+  transformRequest(body: any, rule: string): any {
+    this.logger.debug(`Transforming request body with rule: ${rule}`);
+ 
+    switch (rule) {
+      case 'transformEnergyRequest':
+        return this.energyRequestTransformation(body);
+      default:
+        return body;
+    }
+  }
+ 
+  /**
+   * Transforms the response body based on the specified transformation rule.
+   * @param body The response body to transform.
+   * @param rule The name of the transformation rule to apply.
+   * @returns The transformed body.
+   */
+  transformResponse(body: any, rule: string): any {
+    this.logger.debug(`Transforming response body with rule: ${rule}`);
+ 
+    switch (rule) {
+      case 'transformEnergyResponse':
+        return this.energyResponseTransformation(body);
+      default:
+        return body;
+    }
+  }
+ 
+  private energyRequestTransformation(body: any): any {
+    // Example: normalize field names or formats
+    return {
+      ...body,
+      timestamp: new Date().toISOString(),
+      source: 'gateway',
+    };
+  }
+ 
+  private energyResponseTransformation(body: any): any {
+    // Example: extract specific data or rename fields
+    if (body.data) {
+      return {
+        results: body.data,
+        count: body.data.length,
+        processedAt: new Date().toISOString(),
+      };
+    }
+    return body;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/health.controller.ts.html b/coverage/lcov-report/src/health.controller.ts.html new file mode 100644 index 0000000..bd78075 --- /dev/null +++ b/coverage/lcov-report/src/health.controller.ts.html @@ -0,0 +1,271 @@ + + + + + + Code coverage report for src/health.controller.ts + + + + + + + + + +
+
+

All files / src health.controller.ts

+
+ +
+ 0% + Statements + 0/62 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, HttpStatus, Res } from '@nestjs/common';
+import type { Response } from 'express';
+import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
+import { ContractService } from './contracts/contract.service';
+
+@ApiTags('health')
+@Controller('health')
+export class HealthController {
+  constructor(private readonly contractService: ContractService) {}
+
+  @Get()
+  @ApiOperation({ summary: 'Health check endpoint' })
+  @ApiResponse({ status: 200, description: 'Service is healthy' })
+  @ApiResponse({ status: 503, description: 'Service is unhealthy' })
+  async healthCheck(@Res() res: Response) {
+    try {
+      const contracts = await this.contractService.getHealthStatus();
+      const health = {
+        status: 'healthy',
+        timestamp: new Date().toISOString(),
+        uptime: process.uptime(),
+        version: '1.0.0',
+        environment: process.env.NODE_ENV || 'development',
+        contracts,
+      };
+      return res.status(HttpStatus.OK).json(health);
+    } catch (error) {
+      return res.status(HttpStatus.SERVICE_UNAVAILABLE).json({
+        status: 'unhealthy',
+        timestamp: new Date().toISOString(),
+        error: error.message,
+      });
+    }
+  }
+
+  @Get('ready')
+  @ApiOperation({ summary: 'Readiness check endpoint' })
+  @ApiResponse({ status: 200, description: 'Service is ready' })
+  @ApiResponse({ status: 503, description: 'Service is not ready' })
+  async readinessCheck(@Res() res: Response) {
+    try {
+      const contracts = await this.contractService.getHealthStatus();
+      const ready = {
+        status: 'ready',
+        timestamp: new Date().toISOString(),
+        checks: {
+          database: 'connected',
+          redis: 'connected',
+          api: 'ready',
+          contracts: contracts.status,
+        },
+      };
+      return res.status(HttpStatus.OK).json(ready);
+    } catch (error) {
+      return res.status(HttpStatus.SERVICE_UNAVAILABLE).json({
+        status: 'not ready',
+        timestamp: new Date().toISOString(),
+        error: error.message,
+      });
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/index.html b/coverage/lcov-report/src/index.html new file mode 100644 index 0000000..26e286a --- /dev/null +++ b/coverage/lcov-report/src/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 11.87% + Statements + 31/261 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 37.5% + Functions + 3/8 +
+ + +
+ 11.87% + Lines + 31/261 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
api-health.controller.ts +
+
0%0/280%0/10%0/10%0/28
app.controller.ts +
+
70.37%19/27100%2/266.66%2/370.37%19/27
app.module.ts +
+
0%0/530%0/10%0/10%0/53
app.service.ts +
+
100%12/12100%1/1100%1/1100%12/12
health.controller.ts +
+
0%0/620%0/10%0/10%0/62
main.ts +
+
0%0/790%0/10%0/10%0/79
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/algorithms/distance.algorithm.ts.html b/coverage/lcov-report/src/location/algorithms/distance.algorithm.ts.html new file mode 100644 index 0000000..5257936 --- /dev/null +++ b/coverage/lcov-report/src/location/algorithms/distance.algorithm.ts.html @@ -0,0 +1,508 @@ + + + + + + Code coverage report for src/location/algorithms/distance.algorithm.ts + + + + + + + + + +
+
+

All files / src/location/algorithms distance.algorithm.ts

+
+ +
+ 63.82% + Statements + 90/141 +
+ + +
+ 80% + Branches + 4/5 +
+ + +
+ 57.14% + Functions + 4/7 +
+ + +
+ 63.82% + Lines + 90/141 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +1421x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +7x +7x +1x +1x +1x +1x +1x + 
export interface Coordinates {
+  latitude: number;
+  longitude: number;
+}
+ 
+export interface DistanceResult {
+  distance: number;
+  unit: 'km' | 'miles';
+  bearing?: number;
+}
+ 
+export class DistanceAlgorithm {
+  private static readonly EARTH_RADIUS_KM = 6371;
+  private static readonly EARTH_RADIUS_MILES = 3959;
+ 
+  /**
+   * Calculate distance between two points using Haversine formula
+   * Accuracy: within 1km as required
+   */
+  static calculateDistance(
+    point1: Coordinates,
+    point2: Coordinates,
+    unit: 'km' | 'miles' = 'km',
+  ): DistanceResult {
+    const lat1Rad = this.toRadians(point1.latitude);
+    const lat2Rad = this.toRadians(point2.latitude);
+    const deltaLatRad = this.toRadians(point2.latitude - point1.latitude);
+    const deltaLonRad = this.toRadians(point2.longitude - point1.longitude);
+ 
+    const a =
+      Math.sin(deltaLatRad / 2) * Math.sin(deltaLatRad / 2) +
+      Math.cos(lat1Rad) *
+        Math.cos(lat2Rad) *
+        Math.sin(deltaLonRad / 2) *
+        Math.sin(deltaLonRad / 2);
+ 
+    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+ 
+    const radius =
+      unit === 'km' ? this.EARTH_RADIUS_KM : this.EARTH_RADIUS_MILES;
+    const distance = radius * c;
+ 
+    return {
+      distance: Math.round(distance * 100) / 100, // Round to 2 decimal places
+      unit,
+      bearing: this.calculateBearing(point1, point2),
+    };
+  }
+ 
+  /**
+   * Calculate initial bearing from point1 to point2
+   */
+  static calculateBearing(point1: Coordinates, point2: Coordinates): number {
+    const lat1Rad = this.toRadians(point1.latitude);
+    const lat2Rad = this.toRadians(point2.latitude);
+    const deltaLonRad = this.toRadians(point2.longitude - point1.longitude);
+ 
+    const y = Math.sin(deltaLonRad) * Math.cos(lat2Rad);
+    const x =
+      Math.cos(lat1Rad) * Math.sin(lat2Rad) -
+      Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad);
+ 
+    const bearing = Math.atan2(y, x);
+    return (this.toDegrees(bearing) + 360) % 360;
+  }
+ 
+  /**
+   * Find all points within a given radius from a center point
+   */
+  static findPointsWithinRadius<T extends Coordinates>(
+    centerPoint: Coordinates,
+    points: T[],
+    radiusKm: number,
+  ): T[] {
+    return points.filter((point) => {
+      const distance = this.calculateDistance(
+        centerPoint,
+        point,
+        'km',
+      ).distance;
+      return distance <= radiusKm;
+    });
+  }
+ 
+  /**
+   * Calculate the bounding box for a given center point and radius
+   * Useful for database queries to reduce the search space
+   */
+  static getBoundingBox(
+    centerPoint: Coordinates,
+    radiusKm: number,
+  ): {
+    minLat: number;
+    maxLat: number;
+    minLon: number;
+    maxLon: number;
+  } {
+    const deltaLat = (radiusKm / this.EARTH_RADIUS_KM) * (180 / Math.PI);
+    const deltaLon =
+      (Math.asin(radiusKm / this.EARTH_RADIUS_KM) * (180 / Math.PI)) /
+      Math.cos(this.toRadians(centerPoint.latitude));
+
+    return {
+      minLat: centerPoint.latitude - deltaLat,
+      maxLat: centerPoint.latitude + deltaLat,
+      minLon: centerPoint.longitude - deltaLon,
+      maxLon: centerPoint.longitude + deltaLon,
+    };
+  }
+ 
+  /**
+   * Check if a point is within a polygon (for grid zone boundaries)
+   */
+  static isPointInPolygon(point: Coordinates, polygon: number[][]): boolean {
+    let inside = false;
+    const x = point.longitude;
+    const y = point.latitude;
+
+    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
+      const xi = polygon[i][0],
+        yi = polygon[i][1];
+      const xj = polygon[j][0],
+        yj = polygon[j][1];
+
+      const intersect =
+        yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;
+
+      if (intersect) inside = !inside;
+    }
+
+    return inside;
+  }
+ 
+  private static toRadians(degrees: number): number {
+    return degrees * (Math.PI / 180);
+  }
+ 
+  private static toDegrees(radians: number): number {
+    return radians * (180 / Math.PI);
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/algorithms/index.html b/coverage/lcov-report/src/location/algorithms/index.html new file mode 100644 index 0000000..8be8911 --- /dev/null +++ b/coverage/lcov-report/src/location/algorithms/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/location/algorithms + + + + + + + + + +
+
+

All files src/location/algorithms

+
+ +
+ 43.81% + Statements + 163/372 +
+ + +
+ 62.5% + Branches + 5/8 +
+ + +
+ 31.25% + Functions + 5/16 +
+ + +
+ 43.81% + Lines + 163/372 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
distance.algorithm.ts +
+
63.82%90/14180%4/557.14%4/763.82%90/141
zone-mapping.algorithm.ts +
+
31.6%73/23133.33%1/311.11%1/931.6%73/231
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/algorithms/zone-mapping.algorithm.ts.html b/coverage/lcov-report/src/location/algorithms/zone-mapping.algorithm.ts.html new file mode 100644 index 0000000..c7ccb8f --- /dev/null +++ b/coverage/lcov-report/src/location/algorithms/zone-mapping.algorithm.ts.html @@ -0,0 +1,778 @@ + + + + + + Code coverage report for src/location/algorithms/zone-mapping.algorithm.ts + + + + + + + + + +
+
+

All files / src/location/algorithms zone-mapping.algorithm.ts

+
+ +
+ 31.6% + Statements + 73/231 +
+ + +
+ 33.33% + Branches + 1/3 +
+ + +
+ 11.11% + Functions + 1/9 +
+ + +
+ 31.6% + Lines + 73/231 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +2321x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import { Coordinates, DistanceAlgorithm } from './distance.algorithm';
+import { GridZone } from '../entities/grid-zone.entity';
+ 
+export interface ZoneMappingResult {
+  zone: GridZone | null;
+  isExactMatch: boolean;
+  nearestZone?: GridZone;
+  distanceToNearest?: number;
+}
+ 
+export class ZoneMappingAlgorithm {
+  /**
+   * Find the grid zone for a given coordinate
+   */
+  static findZoneForCoordinate(
+    coordinate: Coordinates,
+    gridZones: GridZone[],
+  ): ZoneMappingResult {
+    let exactZone: GridZone | null = null;
+    let nearestZone: GridZone | null = null;
+    let minDistance = Infinity;
+ 
+    for (const zone of gridZones) {
+      // Check if point is within zone boundaries
+      if (this.isCoordinateInZone(coordinate, zone)) {
+        exactZone = zone;
+        break;
+      }
+
+      // Calculate distance to zone centroid for nearest zone
+      const centroid = this.calculateZoneCentroid(zone);
+      const distance = DistanceAlgorithm.calculateDistance(
+        coordinate,
+        centroid,
+        'km',
+      ).distance;
+
+      if (distance < minDistance) {
+        minDistance = distance;
+        nearestZone = zone;
+      }
+    }
+ 
+    return {
+      zone: exactZone,
+      isExactMatch: exactZone !== null,
+      nearestZone: nearestZone || undefined,
+      distanceToNearest: minDistance === Infinity ? undefined : minDistance,
+    };
+  }
+ 
+  /**
+   * Find all zones within a given radius from a coordinate
+   */
+  static findZonesWithinRadius(
+    coordinate: Coordinates,
+    gridZones: GridZone[],
+    radiusKm: number,
+  ): GridZone[] {
+    const zonesWithinRadius: GridZone[] = [];
+
+    for (const zone of gridZones) {
+      const centroid = this.calculateZoneCentroid(zone);
+      const distance = DistanceAlgorithm.calculateDistance(
+        coordinate,
+        centroid,
+        'km',
+      ).distance;
+
+      if (distance <= radiusKm) {
+        zonesWithinRadius.push(zone);
+      }
+    }
+
+    return zonesWithinRadius;
+  }
+ 
+  /**
+   * Calculate the centroid of a grid zone
+   */
+  static calculateZoneCentroid(zone: GridZone): Coordinates {
+    const coordinates = zone.boundaries.coordinates;
+
+    if (zone.boundaries.type === 'Polygon') {
+      const polygonCoordinates = coordinates as number[][][];
+      return this.calculatePolygonCentroid(polygonCoordinates[0]);
+    } else if (zone.boundaries.type === 'MultiPolygon') {
+      // For MultiPolygon, calculate the centroid of the first polygon
+      // In a real implementation, you might want to calculate the centroid
+      // of all polygons weighted by area
+      const multipolygonCoordinates = coordinates as number[][][][];
+      return this.calculatePolygonCentroid(multipolygonCoordinates[0][0]);
+    }
+
+    throw new Error('Unsupported boundary type');
+  }
+ 
+  /**
+   * Calculate the area of a grid zone (in square kilometers)
+   */
+  static calculateZoneArea(zone: GridZone): number {
+    const coordinates = zone.boundaries.coordinates;
+    let totalArea = 0;
+
+    if (zone.boundaries.type === 'Polygon') {
+      const polygonCoordinates = coordinates as number[][][];
+      totalArea = this.calculatePolygonArea(polygonCoordinates[0]);
+    } else if (zone.boundaries.type === 'MultiPolygon') {
+      const multipolygonCoordinates = coordinates as number[][][][];
+      for (const polygon of multipolygonCoordinates) {
+        totalArea += this.calculatePolygonArea(polygon[0]);
+      }
+    }
+
+    return totalArea;
+  }
+ 
+  /**
+   * Check if a coordinate is within a zone's boundaries
+   */
+  private static isCoordinateInZone(
+    coordinate: Coordinates,
+    zone: GridZone,
+  ): boolean {
+    const coordinates = zone.boundaries.coordinates;
+
+    if (zone.boundaries.type === 'Polygon') {
+      const polygonCoordinates = coordinates as number[][][];
+      return DistanceAlgorithm.isPointInPolygon(
+        coordinate,
+        polygonCoordinates[0],
+      );
+    } else if (zone.boundaries.type === 'MultiPolygon') {
+      const multipolygonCoordinates = coordinates as number[][][][];
+      // Check if point is in any of the polygons
+      for (const polygon of multipolygonCoordinates) {
+        if (DistanceAlgorithm.isPointInPolygon(coordinate, polygon[0])) {
+          return true;
+        }
+      }
+    }
+
+    return false;
+  }
+ 
+  /**
+   * Calculate the centroid of a polygon
+   */
+  private static calculatePolygonCentroid(polygon: number[][]): Coordinates {
+    let sumLat = 0;
+    let sumLon = 0;
+    const numPoints = polygon.length - 1; // Last point is same as first
+
+    for (let i = 0; i < numPoints; i++) {
+      sumLon += polygon[i][0];
+      sumLat += polygon[i][1];
+    }
+
+    return {
+      latitude: sumLat / numPoints,
+      longitude: sumLon / numPoints,
+    };
+  }
+ 
+  /**
+   * Calculate the area of a polygon using the Shoelace formula
+   * Returns area in square degrees (approximate)
+   */
+  private static calculatePolygonArea(polygon: number[][]): number {
+    let area = 0;
+    const numPoints = polygon.length - 1; // Last point is same as first
+
+    for (let i = 0; i < numPoints; i++) {
+      const j = (i + 1) % numPoints;
+      area += polygon[i][0] * polygon[j][1];
+      area -= polygon[j][0] * polygon[i][1];
+    }
+
+    return Math.abs(area) / 2;
+  }
+ 
+  /**
+   * Get adjacent zones (zones that share boundaries)
+   */
+  static getAdjacentZones(zone: GridZone, allZones: GridZone[]): GridZone[] {
+    const adjacentZones: GridZone[] = [];
+    const zoneCentroid = this.calculateZoneCentroid(zone);
+
+    for (const otherZone of allZones) {
+      if (otherZone.id === zone.id) continue;
+
+      const otherCentroid = this.calculateZoneCentroid(otherZone);
+      const distance = DistanceAlgorithm.calculateDistance(
+        zoneCentroid,
+        otherCentroid,
+        'km',
+      ).distance;
+
+      // Adjacent zones are typically within 50km of each other
+      if (distance <= 50) {
+        // Additional check: verify if zones actually share boundaries
+        if (this.doZonesShareBoundary(zone, otherZone)) {
+          adjacentZones.push(otherZone);
+        }
+      }
+    }
+
+    return adjacentZones;
+  }
+ 
+  /**
+   * Check if two zones share boundaries (simplified implementation)
+   */
+  private static doZonesShareBoundary(
+    zone1: GridZone,
+    zone2: GridZone,
+  ): boolean {
+    // This is a simplified check - in a real implementation,
+    // you would perform geometric intersection tests
+    const centroid1 = this.calculateZoneCentroid(zone1);
+    const centroid2 = this.calculateZoneCentroid(zone2);
+    const distance = DistanceAlgorithm.calculateDistance(
+      centroid1,
+      centroid2,
+      'km',
+    ).distance;
+
+    // If centroids are very close, zones likely share boundaries
+    return distance < 20; // 20km threshold
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/dto/index.html b/coverage/lcov-report/src/location/dto/index.html new file mode 100644 index 0000000..f32e9a8 --- /dev/null +++ b/coverage/lcov-report/src/location/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/location/dto + + + + + + + + + +
+
+

All files src/location/dto

+
+ +
+ 0% + Statements + 0/238 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/238 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
location-search.dto.ts +
+
0%0/2380%0/10%0/10%0/238
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/dto/location-search.dto.ts.html b/coverage/lcov-report/src/location/dto/location-search.dto.ts.html new file mode 100644 index 0000000..1c72c6d --- /dev/null +++ b/coverage/lcov-report/src/location/dto/location-search.dto.ts.html @@ -0,0 +1,799 @@ + + + + + + Code coverage report for src/location/dto/location-search.dto.ts + + + + + + + + + +
+
+

All files / src/location/dto location-search.dto.ts

+
+ +
+ 0% + Statements + 0/238 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/238 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsOptional,
+  IsNumber,
+  IsString,
+  IsEnum,
+  IsBoolean,
+  Min,
+  Max,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { ApiPropertyOptional } from '@nestjs/swagger';
+
+export enum LocationSearchSortBy {
+  DISTANCE = 'distance',
+  PRICE = 'price',
+  CREATED_AT = 'createdAt',
+  UPDATED_AT = 'updatedAt',
+}
+
+export enum LocationSearchSortOrder {
+  ASC = 'asc',
+  DESC = 'desc',
+}
+
+export class LocationSearchDto {
+  @ApiPropertyOptional({
+    description: 'Center latitude for location-based search',
+    example: 40.7128,
+    minimum: -90,
+    maximum: 90,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(-90)
+  @Max(90)
+  latitude?: number;
+
+  @ApiPropertyOptional({
+    description: 'Center longitude for location-based search',
+    example: -74.006,
+    minimum: -180,
+    maximum: 180,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(-180)
+  @Max(180)
+  longitude?: number;
+
+  @ApiPropertyOptional({
+    description: 'Search radius in kilometers',
+    example: 10,
+    minimum: 0.1,
+    maximum: 1000,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(0.1)
+  @Max(1000)
+  radiusKm?: number;
+
+  @ApiPropertyOptional({
+    description: 'Grid zone ID to filter by',
+    example: 'zone-123',
+  })
+  @IsOptional()
+  @IsString()
+  gridZoneId?: string;
+
+  @ApiPropertyOptional({
+    description: 'Country to filter by',
+    example: 'United States',
+  })
+  @IsOptional()
+  @IsString()
+  country?: string;
+
+  @ApiPropertyOptional({
+    description: 'State/region to filter by',
+    example: 'California',
+  })
+  @IsOptional()
+  @IsString()
+  state?: string;
+
+  @ApiPropertyOptional({
+    description: 'City to filter by',
+    example: 'New York',
+  })
+  @IsOptional()
+  @IsString()
+  city?: string;
+
+  @ApiPropertyOptional({
+    description: 'Minimum regional price multiplier',
+    example: 0.8,
+    minimum: 0,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(0)
+  minPriceMultiplier?: number;
+
+  @ApiPropertyOptional({
+    description: 'Maximum regional price multiplier',
+    example: 1.5,
+    minimum: 0,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(0)
+  maxPriceMultiplier?: number;
+
+  @ApiPropertyOptional({
+    description: 'Filter by privacy setting',
+    example: true,
+  })
+  @IsOptional()
+  @IsBoolean()
+  isPublic?: boolean;
+
+  @ApiPropertyOptional({
+    description: 'Sort results by field',
+    enum: LocationSearchSortBy,
+    default: LocationSearchSortBy.DISTANCE,
+  })
+  @IsOptional()
+  @IsEnum(LocationSearchSortBy)
+  sortBy?: LocationSearchSortBy = LocationSearchSortBy.DISTANCE;
+
+  @ApiPropertyOptional({
+    description: 'Sort order',
+    enum: LocationSearchSortOrder,
+    default: LocationSearchSortOrder.ASC,
+  })
+  @IsOptional()
+  @IsEnum(LocationSearchSortOrder)
+  sortOrder?: LocationSearchSortOrder = LocationSearchSortOrder.ASC;
+
+  @ApiPropertyOptional({
+    description: 'Page number for pagination',
+    example: 1,
+    minimum: 1,
+    default: 1,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(1)
+  page?: number = 1;
+
+  @ApiPropertyOptional({
+    description: 'Number of results per page',
+    example: 20,
+    minimum: 1,
+    maximum: 100,
+    default: 20,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(1)
+  @Max(100)
+  limit?: number = 20;
+}
+
+export class LocationHeatmapDto {
+  @ApiPropertyOptional({
+    description: 'Bounding box minimum latitude',
+    example: 40.0,
+    minimum: -90,
+    maximum: 90,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(-90)
+  @Max(90)
+  minLat?: number;
+
+  @ApiPropertyOptional({
+    description: 'Bounding box maximum latitude',
+    example: 41.0,
+    minimum: -90,
+    maximum: 90,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(-90)
+  @Max(90)
+  maxLat?: number;
+
+  @ApiPropertyOptional({
+    description: 'Bounding box minimum longitude',
+    example: -75.0,
+    minimum: -180,
+    maximum: 180,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(-180)
+  @Max(180)
+  minLon?: number;
+
+  @ApiPropertyOptional({
+    description: 'Bounding box maximum longitude',
+    example: -73.0,
+    minimum: -180,
+    maximum: 180,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(-180)
+  @Max(180)
+  maxLon?: number;
+
+  @ApiPropertyOptional({
+    description: 'Heatmap grid resolution (number of cells per side)',
+    example: 50,
+    minimum: 10,
+    maximum: 200,
+    default: 50,
+  })
+  @IsOptional()
+  @Type(() => Number)
+  @IsNumber()
+  @Min(10)
+  @Max(200)
+  resolution?: number = 50;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/entities/grid-zone.entity.ts.html b/coverage/lcov-report/src/location/entities/grid-zone.entity.ts.html new file mode 100644 index 0000000..e16599c --- /dev/null +++ b/coverage/lcov-report/src/location/entities/grid-zone.entity.ts.html @@ -0,0 +1,283 @@ + + + + + + Code coverage report for src/location/entities/grid-zone.entity.ts + + + + + + + + + +
+
+

All files / src/location/entities grid-zone.entity.ts

+
+ +
+ 100% + Statements + 66/66 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 66/66 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +671x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+ 
+@Entity('grid_zones')
+@Index(['zoneCode'])
+@Index(['country'])
+export class GridZone {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+ 
+  @Column({ length: 50, unique: true })
+  zoneCode: string;
+ 
+  @Column({ length: 255 })
+  zoneName: string;
+ 
+  @Column({ length: 100 })
+  country: string;
+ 
+  @Column({ type: 'json' })
+  boundaries: {
+    type: 'Polygon' | 'MultiPolygon';
+    coordinates: number[][][] | number[][][][];
+  };
+ 
+  @Column({ type: 'decimal', precision: 5, scale: 2, default: 1.0 })
+  basePriceMultiplier: number;
+ 
+  @Column({ type: 'decimal', precision: 5, scale: 2, default: 0.0 })
+  renewableEnergyPercentage: number;
+ 
+  @Column({ type: 'decimal', precision: 8, scale: 3 })
+  averageDemand: number;
+ 
+  @Column({ type: 'decimal', precision: 8, scale: 3 })
+  peakDemand: number;
+ 
+  @Column({ type: 'json', nullable: true })
+  gridOperator: {
+    name: string;
+    contact: string;
+    website: string;
+  };
+ 
+  @Column({ default: true })
+  isActive: boolean;
+ 
+  @Column({ type: 'json', nullable: true })
+  regulations: {
+    maxTradeVolume: number;
+    tradingHours: string;
+    complianceRequirements: string[];
+  };
+ 
+  @CreateDateColumn()
+  createdAt: Date;
+ 
+  @UpdateDateColumn()
+  updatedAt: Date;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/entities/index.html b/coverage/lcov-report/src/location/entities/index.html new file mode 100644 index 0000000..cab0def --- /dev/null +++ b/coverage/lcov-report/src/location/entities/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/location/entities + + + + + + + + + +
+
+

All files src/location/entities

+
+ +
+ 100% + Statements + 121/121 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 121/121 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
grid-zone.entity.ts +
+
100%66/66100%0/0100%0/0100%66/66
location.entity.ts +
+
100%55/55100%0/0100%0/0100%55/55
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/entities/location.entity.ts.html b/coverage/lcov-report/src/location/entities/location.entity.ts.html new file mode 100644 index 0000000..50d4522 --- /dev/null +++ b/coverage/lcov-report/src/location/entities/location.entity.ts.html @@ -0,0 +1,250 @@ + + + + + + Code coverage report for src/location/entities/location.entity.ts + + + + + + + + + +
+
+

All files / src/location/entities location.entity.ts

+
+ +
+ 100% + Statements + 55/55 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 55/55 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +561x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+ 
+@Entity('locations')
+@Index(['latitude', 'longitude'])
+@Index(['gridZoneId'])
+export class Location {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+ 
+  @Column({ type: 'decimal', precision: 10, scale: 8 })
+  latitude: number;
+ 
+  @Column({ type: 'decimal', precision: 11, scale: 8 })
+  longitude: number;
+ 
+  @Column({ length: 255 })
+  address: string;
+ 
+  @Column({ length: 100 })
+  city: string;
+ 
+  @Column({ length: 100 })
+  state: string;
+ 
+  @Column({ length: 100 })
+  country: string;
+ 
+  @Column({ length: 20 })
+  postalCode: string;
+ 
+  @Column({ nullable: true })
+  gridZoneId: string;
+ 
+  @Column({ type: 'decimal', precision: 5, scale: 2, default: 1.0 })
+  regionalPriceMultiplier: number;
+ 
+  @Column({ default: true })
+  isPublic: boolean;
+ 
+  @Column({ type: 'json', nullable: true })
+  metadata: Record<string, any>;
+ 
+  @CreateDateColumn()
+  createdAt: Date;
+ 
+  @UpdateDateColumn()
+  updatedAt: Date;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/index.html b/coverage/lcov-report/src/location/index.html new file mode 100644 index 0000000..ecdac31 --- /dev/null +++ b/coverage/lcov-report/src/location/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/location + + + + + + + + + +
+
+

All files src/location

+
+ +
+ 49.09% + Statements + 218/444 +
+ + +
+ 48.27% + Branches + 14/29 +
+ + +
+ 47.05% + Functions + 8/17 +
+ + +
+ 49.09% + Lines + 218/444 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
location.module.ts +
+
0%0/120%0/10%0/10%0/12
location.service.ts +
+
50.46%218/43250%14/2850%8/1650.46%218/432
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/location.module.ts.html b/coverage/lcov-report/src/location/location.module.ts.html new file mode 100644 index 0000000..059435f --- /dev/null +++ b/coverage/lcov-report/src/location/location.module.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/location/location.module.ts + + + + + + + + + +
+
+

All files / src/location location.module.ts

+
+ +
+ 0% + Statements + 0/12 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { LocationService } from './location.service';
+import { Location } from './entities/location.entity';
+import { GridZone } from './entities/grid-zone.entity';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([Location, GridZone])],
+  providers: [LocationService],
+  exports: [LocationService],
+})
+export class LocationModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/location/location.service.ts.html b/coverage/lcov-report/src/location/location.service.ts.html new file mode 100644 index 0000000..c397b5b --- /dev/null +++ b/coverage/lcov-report/src/location/location.service.ts.html @@ -0,0 +1,1381 @@ + + + + + + Code coverage report for src/location/location.service.ts + + + + + + + + + +
+
+

All files / src/location location.service.ts

+
+ +
+ 50.46% + Statements + 218/432 +
+ + +
+ 50% + Branches + 14/28 +
+ + +
+ 50% + Functions + 8/16 +
+ + +
+ 50.46% + Lines + 218/432 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +4331x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +7x +7x +7x +1x +1x +1x +1x +1x +3x +3x +3x +3x +1x +1x +1x +1x +3x +1x +3x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +  +  +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +3x +1x +1x +3x +1x +1x +3x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
import {
+  Injectable,
+  NotFoundException,
+  BadRequestException,
+} from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, Between, LessThan, MoreThan } from 'typeorm';
+import { Location } from './entities/location.entity';
+import { GridZone } from './entities/grid-zone.entity';
+import {
+  LocationSearchDto,
+  LocationHeatmapDto,
+} from './dto/location-search.dto';
+import {
+  DistanceAlgorithm,
+  Coordinates,
+} from './algorithms/distance.algorithm';
+import { ZoneMappingAlgorithm } from './algorithms/zone-mapping.algorithm';
+ 
+@Injectable()
+export class LocationService {
+  constructor(
+    @InjectRepository(Location)
+    private locationRepository: Repository<Location>,
+    @InjectRepository(GridZone)
+    private gridZoneRepository: Repository<GridZone>,
+  ) {}
+ 
+  /**
+   * Create a new location
+   */
+  async createLocation(locationData: Partial<Location>): Promise<Location> {
+    // Validate coordinates
+    if (locationData.latitude && locationData.longitude) {
+      this.validateCoordinates(locationData.latitude, locationData.longitude);
+    }
+ 
+    // Auto-assign grid zone if not provided
+    if (
+      !locationData.gridZoneId &&
+      locationData.latitude &&
+      locationData.longitude
+    ) {
+      const zoneMapping = await this.findZoneForCoordinate({
+        latitude: locationData.latitude,
+        longitude: locationData.longitude,
+      });
+ 
+      if (zoneMapping.zone) {
+        locationData.gridZoneId = zoneMapping.zone.id;
+        locationData.regionalPriceMultiplier =
+          zoneMapping.zone.basePriceMultiplier;
+      }
+    }
+ 
+    const location = this.locationRepository.create(locationData);
+    return this.locationRepository.save(location);
+  }
+ 
+  /**
+   * Update an existing location
+   */
+  async updateLocation(
+    id: string,
+    updateData: Partial<Location>,
+  ): Promise<Location> {
+    const location = await this.locationRepository.findOne({ where: { id } });
+    if (!location) {
+      throw new NotFoundException(`Location with ID ${id} not found`);
+    }
+
+    // Validate coordinates if provided
+    if (updateData.latitude && updateData.longitude) {
+      this.validateCoordinates(updateData.latitude, updateData.longitude);
+    }
+
+    // Re-calculate grid zone if coordinates changed
+    if (
+      (updateData.latitude || updateData.longitude) &&
+      (updateData.latitude !== location.latitude ||
+        updateData.longitude !== location.longitude)
+    ) {
+      const zoneMapping = await this.findZoneForCoordinate({
+        latitude: updateData.latitude || location.latitude,
+        longitude: updateData.longitude || location.longitude,
+      });
+
+      if (zoneMapping.zone) {
+        updateData.gridZoneId = zoneMapping.zone.id;
+        updateData.regionalPriceMultiplier =
+          zoneMapping.zone.basePriceMultiplier;
+      }
+    }
+
+    Object.assign(location, updateData);
+    return this.locationRepository.save(location);
+  }
+ 
+  /**
+   * Get location by ID
+   */
+  async getLocation(id: string): Promise<Location> {
+    const location = await this.locationRepository.findOne({
+      where: { id },
+      relations: ['gridZone'],
+    });
+ 
+    if (!location) {
+      throw new NotFoundException(`Location with ID ${id} not found`);
+    }
+ 
+    return location;
+  }
+ 
+  /**
+   * Search locations based on criteria
+   */
+  async searchLocations(searchDto: LocationSearchDto): Promise<{
+    locations: Location[];
+    total: number;
+    page: number;
+    limit: number;
+  }> {
+    const queryBuilder = this.locationRepository
+      .createQueryBuilder('location')
+      .leftJoinAndSelect('location.gridZone', 'gridZone');
+ 
+    // Apply filters
+    if (searchDto.gridZoneId) {
+      queryBuilder.andWhere('location.gridZoneId = :gridZoneId', {
+        gridZoneId: searchDto.gridZoneId,
+      });
+    }
+ 
+    if (searchDto.country) {
+      queryBuilder.andWhere('location.country = :country', {
+        country: searchDto.country,
+      });
+    }
+ 
+    if (searchDto.state) {
+      queryBuilder.andWhere('location.state = :state', {
+        state: searchDto.state,
+      });
+    }
+ 
+    if (searchDto.city) {
+      queryBuilder.andWhere('location.city = :city', {
+        city: searchDto.city,
+      });
+    }
+ 
+    if (searchDto.minPriceMultiplier !== undefined) {
+      queryBuilder.andWhere(
+        'location.regionalPriceMultiplier >= :minPriceMultiplier',
+        {
+          minPriceMultiplier: searchDto.minPriceMultiplier,
+        },
+      );
+    }
+ 
+    if (searchDto.maxPriceMultiplier !== undefined) {
+      queryBuilder.andWhere(
+        'location.regionalPriceMultiplier <= :maxPriceMultiplier',
+        {
+          maxPriceMultiplier: searchDto.maxPriceMultiplier,
+        },
+      );
+    }
+ 
+    if (searchDto.isPublic !== undefined) {
+      queryBuilder.andWhere('location.isPublic = :isPublic', {
+        isPublic: searchDto.isPublic,
+      });
+    }
+ 
+    // Location-based search
+    if (searchDto.latitude && searchDto.longitude && searchDto.radiusKm) {
+      const boundingBox = DistanceAlgorithm.getBoundingBox(
+        { latitude: searchDto.latitude, longitude: searchDto.longitude },
+        searchDto.radiusKm,
+      );
+
+      queryBuilder
+        .andWhere('location.latitude BETWEEN :minLat AND :maxLat', {
+          minLat: boundingBox.minLat,
+          maxLat: boundingBox.maxLat,
+        })
+        .andWhere('location.longitude BETWEEN :minLon AND :maxLon', {
+          minLon: boundingBox.minLon,
+          maxLon: boundingBox.maxLon,
+        });
+    }
+ 
+    // Apply sorting
+    const sortBy = searchDto.sortBy || 'distance';
+    const sortOrder = searchDto.sortOrder || 'asc';
+ 
+    if (sortBy === 'distance' && searchDto.latitude && searchDto.longitude) {
+      // Custom sorting by distance (handled in application layer)
+      const locations = await queryBuilder.getMany();
+      const sortedLocations = this.sortByDistance(
+        locations,
+        { latitude: searchDto.latitude, longitude: searchDto.longitude },
+        sortOrder,
+      );
+
+      return this.paginateResults(
+        sortedLocations,
+        searchDto.page,
+        searchDto.limit,
+      );
+    } else {
+      queryBuilder.orderBy(
+        `location.${sortBy}`,
+        sortOrder.toUpperCase() as 'ASC' | 'DESC',
+      );
+    }
+ 
+    // Apply pagination
+    const page = searchDto.page || 1;
+    const limit = searchDto.limit || 20;
+    const skip = (page - 1) * limit;
+ 
+    queryBuilder.skip(skip).take(limit);
+ 
+    const [locations, total] = await queryBuilder.getManyAndCount();
+ 
+    return {
+      locations,
+      total,
+      page,
+      limit,
+    };
+  }
+ 
+  /**
+   * Generate heatmap data for a given area
+   */
+  async generateHeatmapData(heatmapDto: LocationHeatmapDto): Promise<{
+    grid: number[][];
+    bounds: { minLat: number; maxLat: number; minLon: number; maxLon: number };
+    resolution: number;
+    totalLocations: number;
+  }> {
+    const resolution = heatmapDto.resolution || 50;
+
+    // Get bounding box
+    const bounds = {
+      minLat: heatmapDto.minLat || -90,
+      maxLat: heatmapDto.maxLat || 90,
+      minLon: heatmapDto.minLon || -180,
+      maxLon: heatmapDto.maxLon || 180,
+    };
+
+    // Get all locations within bounding box
+    const locations = await this.locationRepository.find({
+      where: {
+        latitude: Between(bounds.minLat, bounds.maxLat),
+        longitude: Between(bounds.minLon, bounds.maxLon),
+        isPublic: true,
+      },
+    });
+
+    // Initialize grid
+    const grid = Array(resolution)
+      .fill(0)
+      .map(() => Array(resolution).fill(0));
+
+    // Populate grid with location density
+    locations.forEach((location) => {
+      const gridX = Math.floor(
+        ((location.longitude - bounds.minLon) /
+          (bounds.maxLon - bounds.minLon)) *
+          resolution,
+      );
+      const gridY = Math.floor(
+        ((location.latitude - bounds.minLat) /
+          (bounds.maxLat - bounds.minLat)) *
+          resolution,
+      );
+
+      if (
+        gridX >= 0 &&
+        gridX < resolution &&
+        gridY >= 0 &&
+        gridY < resolution
+      ) {
+        grid[gridY][gridX]++;
+      }
+    });
+
+    return {
+      grid,
+      bounds,
+      resolution,
+      totalLocations: locations.length,
+    };
+  }
+ 
+  /**
+   * Find grid zone for a coordinate
+   */
+  async findZoneForCoordinate(coordinate: Coordinates) {
+    const gridZones = await this.gridZoneRepository.find({
+      where: { isActive: true },
+    });
+    return ZoneMappingAlgorithm.findZoneForCoordinate(coordinate, gridZones);
+  }
+ 
+  /**
+   * Calculate distance between two locations
+   */
+  async calculateDistance(
+    locationId1: string,
+    locationId2: string,
+    unit: 'km' | 'miles' = 'km',
+  ) {
+    const [location1, location2] = await Promise.all([
+      this.getLocation(locationId1),
+      this.getLocation(locationId2),
+    ]);
+ 
+    return DistanceAlgorithm.calculateDistance(
+      { latitude: location1.latitude, longitude: location1.longitude },
+      { latitude: location2.latitude, longitude: location2.longitude },
+      unit,
+    );
+  }
+ 
+  /**
+   * Get regional pricing multiplier for a location
+   */
+  async getRegionalPriceMultiplier(locationId: string): Promise<number> {
+    const location = await this.getLocation(locationId);
+    return location.regionalPriceMultiplier;
+  }
+ 
+  /**
+   * Create a new grid zone
+   */
+  async createGridZone(zoneData: Partial<GridZone>): Promise<GridZone> {
+    const zone = this.gridZoneRepository.create(zoneData);
+    return this.gridZoneRepository.save(zone);
+  }
+ 
+  /**
+   * Get all grid zones
+   */
+  async getGridZones(): Promise<GridZone[]> {
+    return this.gridZoneRepository.find({ where: { isActive: true } });
+  }
+ 
+  /**
+   * Update grid zone
+   */
+  async updateGridZone(
+    id: string,
+    updateData: Partial<GridZone>,
+  ): Promise<GridZone> {
+    const zone = await this.gridZoneRepository.findOne({ where: { id } });
+    if (!zone) {
+      throw new NotFoundException(`Grid zone with ID ${id} not found`);
+    }
+
+    Object.assign(zone, updateData);
+    return this.gridZoneRepository.save(zone);
+  }
+ 
+  /**
+   * Delete location (soft delete by setting isPublic to false)
+   */
+  async deleteLocation(id: string): Promise<void> {
+    const location = await this.getLocation(id);
+    location.isPublic = false;
+    await this.locationRepository.save(location);
+  }
+ 
+  private validateCoordinates(latitude: number, longitude: number): void {
+    if (latitude < -90 || latitude > 90) {
+      throw new BadRequestException('Latitude must be between -90 and 90');
+    }
+    if (longitude < -180 || longitude > 180) {
+      throw new BadRequestException('Longitude must be between -180 and 180');
+    }
+  }
+ 
+  private sortByDistance(
+    locations: Location[],
+    centerPoint: Coordinates,
+    sortOrder: 'asc' | 'desc',
+  ): Location[] {
+    return locations.sort((a, b) => {
+      const distanceA = DistanceAlgorithm.calculateDistance(centerPoint, {
+        latitude: a.latitude,
+        longitude: a.longitude,
+      }).distance;
+
+      const distanceB = DistanceAlgorithm.calculateDistance(centerPoint, {
+        latitude: b.latitude,
+        longitude: b.longitude,
+      }).distance;
+
+      return sortOrder === 'asc'
+        ? distanceA - distanceB
+        : distanceB - distanceA;
+    });
+  }
+ 
+  private paginateResults(
+    locations: Location[],
+    page: number = 1,
+    limit: number = 20,
+  ): {
+    locations: Location[];
+    total: number;
+    page: number;
+    limit: number;
+  } {
+    const total = locations.length;
+    const startIndex = (page - 1) * limit;
+    const endIndex = startIndex + limit;
+    const paginatedLocations = locations.slice(startIndex, endIndex);
+
+    return {
+      locations: paginatedLocations,
+      total,
+      page,
+      limit,
+    };
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/alerts/index.html b/coverage/lcov-report/src/logging/alerts/index.html new file mode 100644 index 0000000..72c277c --- /dev/null +++ b/coverage/lcov-report/src/logging/alerts/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/logging/alerts + + + + + + + + + +
+
+

All files src/logging/alerts

+
+ +
+ 0% + Statements + 0/978 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/978 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
log-alert.service.ts +
+
0%0/9780%0/10%0/10%0/978
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/alerts/log-alert.service.ts.html b/coverage/lcov-report/src/logging/alerts/log-alert.service.ts.html new file mode 100644 index 0000000..410280e --- /dev/null +++ b/coverage/lcov-report/src/logging/alerts/log-alert.service.ts.html @@ -0,0 +1,3019 @@ + + + + + + Code coverage report for src/logging/alerts/log-alert.service.ts + + + + + + + + + +
+
+

All files / src/logging/alerts log-alert.service.ts

+
+ +
+ 0% + Statements + 0/978 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/978 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { ElasticsearchService } from '../elasticsearch/elasticsearch.service';
+import { ParsedLogEntry } from '../parsing/log-parser.service';
+
+export interface AlertRule {
+  id: string;
+  name: string;
+  description: string;
+  enabled: boolean;
+  severity: 'low' | 'medium' | 'high' | 'critical';
+  conditions: AlertCondition[];
+  actions: AlertAction[];
+  cooldown_minutes: number;
+  max_alerts_per_hour: number;
+  tags: string[];
+}
+
+export interface AlertCondition {
+  field: string;
+  operator:
+    | 'eq'
+    | 'ne'
+    | 'gt'
+    | 'lt'
+    | 'gte'
+    | 'lte'
+    | 'contains'
+    | 'regex'
+    | 'exists'
+    | 'not_exists';
+  value?: any;
+  time_window_minutes?: number;
+  threshold?: number;
+}
+
+export interface AlertAction {
+  type: 'email' | 'slack' | 'webhook' | 'pagerduty' | 'teams' | 'sms';
+  config: Record<string, any>;
+  enabled: boolean;
+}
+
+export interface Alert {
+  id: string;
+  rule_id: string;
+  rule_name: string;
+  severity: string;
+  message: string;
+  details: any;
+  triggered_at: Date;
+  status: 'active' | 'acknowledged' | 'resolved';
+  acknowledged_by?: string;
+  acknowledged_at?: Date;
+  resolved_at?: Date;
+  tags: string[];
+}
+
+export interface AlertMetrics {
+  total_alerts: number;
+  active_alerts: number;
+  alerts_by_severity: Record<string, number>;
+  alerts_by_rule: Record<string, number>;
+  average_resolution_time: number;
+  false_positive_rate: number;
+  most_common_errors: Array<{ error: string; count: number }>;
+  alert_frequency_trend: Array<{ timestamp: Date; count: number }>;
+}
+
+export interface NotificationResult {
+  action_type: string;
+  success: boolean;
+  message: string;
+  sent_at: Date;
+  error?: string;
+}
+
+@Injectable()
+export class LogAlertService implements OnModuleInit {
+  private readonly logger = new Logger(LogAlertService.name);
+  private readonly alertRules = new Map<string, AlertRule>();
+  private readonly activeAlerts = new Map<string, Alert>();
+  private readonly alertHistory: Alert[] = [];
+  private readonly alertCooldowns = new Map<string, Date>();
+  private readonly alertCounters = new Map<string, number>();
+  private alertMetrics: AlertMetrics;
+
+  constructor(
+    private readonly configService: ConfigService,
+    private readonly elasticsearchService: ElasticsearchService,
+  ) {
+    this.initializeMetrics();
+    this.initializeDefaultRules();
+  }
+
+  async onModuleInit() {
+    this.logger.log('Initializing log alert service');
+
+    // Load alert rules from configuration
+    await this.loadAlertRules();
+
+    // Start alert monitoring
+    this.startAlertMonitoring();
+
+    this.logger.log('Log alert service initialized');
+  }
+
+  private initializeMetrics(): void {
+    this.alertMetrics = {
+      total_alerts: 0,
+      active_alerts: 0,
+      alerts_by_severity: {},
+      alerts_by_rule: {},
+      average_resolution_time: 0,
+      false_positive_rate: 0,
+      most_common_errors: [],
+      alert_frequency_trend: [],
+    };
+  }
+
+  private initializeDefaultRules(): void {
+    const defaultRules: AlertRule[] = [
+      {
+        id: 'high-error-rate',
+        name: 'High Error Rate',
+        description: 'Alert when error rate exceeds 5% in 5 minutes',
+        enabled: true,
+        severity: 'high',
+        conditions: [
+          {
+            field: 'level',
+            operator: 'eq',
+            value: 'error',
+            time_window_minutes: 5,
+            threshold: 10,
+          },
+        ],
+        actions: [
+          {
+            type: 'email',
+            config: {
+              recipients: ['admin@currentdao.com'],
+              subject: 'High Error Rate Alert',
+            },
+            enabled: true,
+          },
+          {
+            type: 'slack',
+            config: {
+              webhook_url: process.env.SLACK_WEBHOOK_URL,
+              channel: '#alerts',
+            },
+            enabled: true,
+          },
+        ],
+        cooldown_minutes: 15,
+        max_alerts_per_hour: 3,
+        tags: ['error', 'rate', 'critical'],
+      },
+      {
+        id: 'security-breach',
+        name: 'Security Breach Detection',
+        description: 'Alert on security-related events',
+        enabled: true,
+        severity: 'critical',
+        conditions: [
+          {
+            field: 'categorized_as',
+            operator: 'contains',
+            value: 'security',
+          },
+          {
+            field: 'level',
+            operator: 'eq',
+            value: 'error',
+          },
+        ],
+        actions: [
+          {
+            type: 'pagerduty',
+            config: {
+              service_key: process.env.PAGERDUTY_SERVICE_KEY,
+              severity: 'critical',
+            },
+            enabled: true,
+          },
+          {
+            type: 'sms',
+            config: {
+              phone_numbers: ['+1234567890'],
+            },
+            enabled: true,
+          },
+        ],
+        cooldown_minutes: 5,
+        max_alerts_per_hour: 10,
+        tags: ['security', 'critical'],
+      },
+      {
+        id: 'slow-requests',
+        name: 'Slow API Requests',
+        description: 'Alert when response time exceeds 5 seconds',
+        enabled: true,
+        severity: 'medium',
+        conditions: [
+          {
+            field: 'response_time',
+            operator: 'gt',
+            value: 5000,
+            time_window_minutes: 1,
+            threshold: 5,
+          },
+        ],
+        actions: [
+          {
+            type: 'slack',
+            config: {
+              webhook_url: process.env.SLACK_WEBHOOK_URL,
+              channel: '#performance',
+            },
+            enabled: true,
+          },
+        ],
+        cooldown_minutes: 30,
+        max_alerts_per_hour: 5,
+        tags: ['performance', 'slow'],
+      },
+      {
+        id: 'blockchain-failures',
+        name: 'Blockchain Transaction Failures',
+        description: 'Alert on blockchain transaction failures',
+        enabled: true,
+        severity: 'high',
+        conditions: [
+          {
+            field: 'tx_status',
+            operator: 'eq',
+            value: 'failed',
+            time_window_minutes: 10,
+            threshold: 3,
+          },
+        ],
+        actions: [
+          {
+            type: 'email',
+            config: {
+              recipients: ['blockchain-team@currentdao.com'],
+              subject: 'Blockchain Transaction Failures',
+            },
+            enabled: true,
+          },
+          {
+            type: 'teams',
+            config: {
+              webhook_url: process.env.TEAMS_WEBHOOK_URL,
+            },
+            enabled: true,
+          },
+        ],
+        cooldown_minutes: 20,
+        max_alerts_per_hour: 8,
+        tags: ['blockchain', 'transaction', 'failure'],
+      },
+      {
+        id: 'database-connection-issues',
+        name: 'Database Connection Issues',
+        description: 'Alert on database connection problems',
+        enabled: true,
+        severity: 'critical',
+        conditions: [
+          {
+            field: 'error_name',
+            operator: 'contains',
+            value: 'connection',
+          },
+          {
+            field: 'level',
+            operator: 'eq',
+            value: 'error',
+          },
+        ],
+        actions: [
+          {
+            type: 'pagerduty',
+            config: {
+              service_key: process.env.PAGERDUTY_SERVICE_KEY,
+              severity: 'critical',
+            },
+            enabled: true,
+          },
+        ],
+        cooldown_minutes: 10,
+        max_alerts_per_hour: 5,
+        tags: ['database', 'connection', 'critical'],
+      },
+      {
+        id: 'memory-usage-high',
+        name: 'High Memory Usage',
+        description: 'Alert when memory usage exceeds 80%',
+        enabled: true,
+        severity: 'medium',
+        conditions: [
+          {
+            field: 'memory_usage',
+            operator: 'gt',
+            value: 80,
+            time_window_minutes: 5,
+            threshold: 3,
+          },
+        ],
+        actions: [
+          {
+            type: 'slack',
+            config: {
+              webhook_url: process.env.SLACK_WEBHOOK_URL,
+              channel: '#infrastructure',
+            },
+            enabled: true,
+          },
+        ],
+        cooldown_minutes: 30,
+        max_alerts_per_hour: 3,
+        tags: ['infrastructure', 'memory'],
+      },
+    ];
+
+    for (const rule of defaultRules) {
+      this.alertRules.set(rule.id, rule);
+    }
+  }
+
+  private async loadAlertRules(): Promise<void> {
+    // Load additional rules from configuration or database
+    try {
+      const configRules = this.configService.get('ALERT_RULES');
+      if (configRules && Array.isArray(configRules)) {
+        for (const rule of configRules) {
+          this.alertRules.set(rule.id, rule);
+        }
+      }
+    } catch (error) {
+      this.logger.error('Failed to load alert rules from configuration', error);
+    }
+  }
+
+  private startAlertMonitoring(): void {
+    // Monitor logs for alert conditions
+    setInterval(async () => {
+      await this.checkAlertConditions();
+    }, 60000); // Check every minute
+  }
+
+  async checkAlertConditions(): Promise<void> {
+    const now = new Date();
+
+    for (const [ruleId, rule] of this.alertRules.entries()) {
+      if (!rule.enabled) continue;
+
+      // Check cooldown
+      if (this.isInCooldown(ruleId, now)) continue;
+
+      // Check hourly limit
+      if (this.exceedsHourlyLimit(ruleId, now)) continue;
+
+      try {
+        const shouldAlert = await this.evaluateRule(rule, now);
+        if (shouldAlert) {
+          await this.triggerAlert(rule, now);
+        }
+      } catch (error) {
+        this.logger.error(`Failed to evaluate rule ${ruleId}`, error);
+      }
+    }
+  }
+
+  private async evaluateRule(rule: AlertRule, now: Date): Promise<boolean> {
+    const searchQuery = this.buildSearchQueryFromRule(rule, now);
+
+    try {
+      const response = await this.elasticsearchService.searchLogs(searchQuery);
+      const hitCount = response.hits?.total?.value || 0;
+
+      // Check if any condition threshold is met
+      for (const condition of rule.conditions) {
+        if (condition.threshold && hitCount >= condition.threshold) {
+          return true;
+        }
+      }
+
+      return false;
+    } catch (error) {
+      this.logger.error(`Failed to evaluate rule ${rule.id}`, error);
+      return false;
+    }
+  }
+
+  private buildSearchQueryFromRule(rule: AlertRule, now: Date): any {
+    const query: any = {
+      size: 0,
+      query: {
+        bool: {
+          must: [],
+          filter: [],
+        },
+      },
+      aggs: {
+        log_count: {
+          value_count: {
+            field: '@timestamp',
+          },
+        },
+      },
+    };
+
+    // Add time range if specified
+    const maxTimeWindow = Math.max(
+      ...rule.conditions.map((c) => c.time_window_minutes || 0),
+    );
+    if (maxTimeWindow > 0) {
+      const startTime = new Date(now.getTime() - maxTimeWindow * 60 * 1000);
+      query.query.bool.filter.push({
+        range: {
+          '@timestamp': {
+            gte: startTime.toISOString(),
+            lte: now.toISOString(),
+          },
+        },
+      });
+    }
+
+    // Add conditions
+    for (const condition of rule.conditions) {
+      const conditionQuery = this.buildConditionQuery(condition);
+      if (conditionQuery) {
+        query.query.bool.must.push(conditionQuery);
+      }
+    }
+
+    return query;
+  }
+
+  private buildConditionQuery(condition: AlertCondition): any {
+    switch (condition.operator) {
+      case 'eq':
+        return { term: { [condition.field]: condition.value } };
+      case 'ne':
+        return {
+          bool: { must_not: { term: { [condition.field]: condition.value } } },
+        };
+      case 'gt':
+        return { range: { [condition.field]: { gt: condition.value } } };
+      case 'lt':
+        return { range: { [condition.field]: { lt: condition.value } } };
+      case 'gte':
+        return { range: { [condition.field]: { gte: condition.value } } };
+      case 'lte':
+        return { range: { [condition.field]: { lte: condition.value } } };
+      case 'contains':
+        return { wildcard: { [condition.field]: `*${condition.value}*` } };
+      case 'regex':
+        return { regexp: { [condition.field]: condition.value } };
+      case 'exists':
+        return { exists: { field: condition.field } };
+      case 'not_exists':
+        return { bool: { must_not: { exists: { field: condition.field } } } };
+      default:
+        return null;
+    }
+  }
+
+  private async triggerAlert(rule: AlertRule, now: Date): Promise<void> {
+    const alertId = `${rule.id}_${now.getTime()}`;
+
+    const alert: Alert = {
+      id: alertId,
+      rule_id: rule.id,
+      rule_name: rule.name,
+      severity: rule.severity,
+      message: `Alert triggered: ${rule.description}`,
+      details: await this.getAlertDetails(rule),
+      triggered_at: now,
+      status: 'active',
+      tags: rule.tags,
+    };
+
+    // Store alert
+    this.activeAlerts.set(alertId, alert);
+    this.alertHistory.push(alert);
+
+    // Update metrics
+    this.updateAlertMetrics(alert);
+
+    // Set cooldown
+    this.setCooldown(rule.id, now);
+
+    // Increment counter
+    this.incrementAlertCounter(rule.id, now);
+
+    // Execute actions
+    await this.executeAlertActions(alert, rule);
+
+    this.logger.log(`Alert triggered: ${rule.name} (${alertId})`);
+  }
+
+  private async getAlertDetails(rule: AlertRule): Promise<any> {
+    try {
+      const searchQuery = this.buildSearchQueryFromRule(rule, new Date());
+      const response = await this.elasticsearchService.searchLogs(searchQuery);
+
+      const hits = response.hits?.hits || [];
+      const recentLogs = hits.slice(0, 10).map((hit) => hit._source);
+
+      return {
+        total_hits: response.hits?.total?.value || 0,
+        recent_logs: recentLogs,
+        time_window: `${Math.max(...rule.conditions.map((c) => c.time_window_minutes || 0))} minutes`,
+      };
+    } catch (error) {
+      this.logger.error('Failed to get alert details', error);
+      return { error: 'Failed to fetch details' };
+    }
+  }
+
+  private async executeAlertActions(
+    alert: Alert,
+    rule: AlertRule,
+  ): Promise<NotificationResult[]> {
+    const results: NotificationResult[] = [];
+
+    for (const action of rule.actions) {
+      if (!action.enabled) continue;
+
+      try {
+        const result = await this.executeAction(alert, action);
+        results.push(result);
+      } catch (error) {
+        results.push({
+          action_type: action.type,
+          success: false,
+          message: 'Failed to execute action',
+          sent_at: new Date(),
+          error: error.message,
+        });
+      }
+    }
+
+    return results;
+  }
+
+  private async executeAction(
+    alert: Alert,
+    action: AlertAction,
+  ): Promise<NotificationResult> {
+    switch (action.type) {
+      case 'email':
+        return await this.sendEmailAlert(alert, action.config);
+      case 'slack':
+        return await this.sendSlackAlert(alert, action.config);
+      case 'webhook':
+        return await this.sendWebhookAlert(alert, action.config);
+      case 'pagerduty':
+        return await this.sendPagerDutyAlert(alert, action.config);
+      case 'teams':
+        return await this.sendTeamsAlert(alert, action.config);
+      case 'sms':
+        return await this.sendSMSAlert(alert, action.config);
+      default:
+        throw new Error(`Unknown action type: ${action.type}`);
+    }
+  }
+
+  private async sendEmailAlert(
+    alert: Alert,
+    config: any,
+  ): Promise<NotificationResult> {
+    try {
+      // Implementation would depend on your email service
+      this.logger.log(`Email alert sent to ${config.recipients?.join(', ')}`);
+
+      return {
+        action_type: 'email',
+        success: true,
+        message: `Email sent to ${config.recipients?.join(', ')}`,
+        sent_at: new Date(),
+      };
+    } catch (error) {
+      throw new Error(`Failed to send email: ${error.message}`);
+    }
+  }
+
+  private async sendSlackAlert(
+    alert: Alert,
+    config: any,
+  ): Promise<NotificationResult> {
+    try {
+      const payload = {
+        channel: config.channel || '#alerts',
+        username: 'CurrentDAO Alerts',
+        icon_emoji: ':warning:',
+        text: `🚨 *${alert.severity.toUpperCase()} Alert*`,
+        attachments: [
+          {
+            color: this.getSeverityColor(alert.severity),
+            fields: [
+              {
+                title: 'Rule',
+                value: alert.rule_name,
+                short: true,
+              },
+              {
+                title: 'Severity',
+                value: alert.severity.toUpperCase(),
+                short: true,
+              },
+              {
+                title: 'Message',
+                value: alert.message,
+                short: false,
+              },
+              {
+                title: 'Triggered At',
+                value: alert.triggered_at.toISOString(),
+                short: true,
+              },
+              {
+                title: 'Alert ID',
+                value: alert.id,
+                short: true,
+              },
+            ],
+          },
+        ],
+      };
+
+      // Implementation would use fetch or http client to send to Slack webhook
+      this.logger.log(`Slack alert sent to ${config.channel}`);
+
+      return {
+        action_type: 'slack',
+        success: true,
+        message: `Slack message sent to ${config.channel}`,
+        sent_at: new Date(),
+      };
+    } catch (error) {
+      throw new Error(`Failed to send Slack alert: ${error.message}`);
+    }
+  }
+
+  private async sendWebhookAlert(
+    alert: Alert,
+    config: any,
+  ): Promise<NotificationResult> {
+    try {
+      const payload = {
+        alert_id: alert.id,
+        rule_name: alert.rule_name,
+        severity: alert.severity,
+        message: alert.message,
+        details: alert.details,
+        triggered_at: alert.triggered_at,
+        tags: alert.tags,
+      };
+
+      // Implementation would use fetch or http client to send webhook
+      this.logger.log(`Webhook alert sent to ${config.url}`);
+
+      return {
+        action_type: 'webhook',
+        success: true,
+        message: `Webhook sent to ${config.url}`,
+        sent_at: new Date(),
+      };
+    } catch (error) {
+      throw new Error(`Failed to send webhook: ${error.message}`);
+    }
+  }
+
+  private async sendPagerDutyAlert(
+    alert: Alert,
+    config: any,
+  ): Promise<NotificationResult> {
+    try {
+      const payload = {
+        routing_key: config.service_key,
+        event_action: 'trigger',
+        payload: {
+          summary: alert.message,
+          severity: config.severity || alert.severity,
+          source: 'CurrentDAO',
+          component: alert.rule_name,
+          group: 'alerts',
+          class: alert.severity,
+          custom_details: alert.details,
+        },
+      };
+
+      // Implementation would use PagerDuty API
+      this.logger.log(`PagerDuty alert sent`);
+
+      return {
+        action_type: 'pagerduty',
+        success: true,
+        message: 'PagerDuty alert sent',
+        sent_at: new Date(),
+      };
+    } catch (error) {
+      throw new Error(`Failed to send PagerDuty alert: ${error.message}`);
+    }
+  }
+
+  private async sendTeamsAlert(
+    alert: Alert,
+    config: any,
+  ): Promise<NotificationResult> {
+    try {
+      const payload = {
+        '@type': 'MessageCard',
+        '@context': 'http://schema.org/extensions',
+        themeColor: this.getSeverityColor(alert.severity),
+        summary: alert.message,
+        sections: [
+          {
+            activityTitle: `🚨 ${alert.severity.toUpperCase()} Alert`,
+            activitySubtitle: alert.rule_name,
+            facts: [
+              { name: 'Message', value: alert.message },
+              { name: 'Severity', value: alert.severity.toUpperCase() },
+              { name: 'Triggered At', value: alert.triggered_at.toISOString() },
+              { name: 'Alert ID', value: alert.id },
+            ],
+          },
+        ],
+      };
+
+      // Implementation would use fetch or http client to send to Teams webhook
+      this.logger.log(`Teams alert sent`);
+
+      return {
+        action_type: 'teams',
+        success: true,
+        message: 'Teams alert sent',
+        sent_at: new Date(),
+      };
+    } catch (error) {
+      throw new Error(`Failed to send Teams alert: ${error.message}`);
+    }
+  }
+
+  private async sendSMSAlert(
+    alert: Alert,
+    config: any,
+  ): Promise<NotificationResult> {
+    try {
+      const message = `CurrentDAO Alert: ${alert.message} (${alert.severity.toUpperCase()})`;
+
+      // Implementation would use SMS service like Twilio
+      this.logger.log(`SMS alert sent to ${config.phone_numbers?.join(', ')}`);
+
+      return {
+        action_type: 'sms',
+        success: true,
+        message: `SMS sent to ${config.phone_numbers?.join(', ')}`,
+        sent_at: new Date(),
+      };
+    } catch (error) {
+      throw new Error(`Failed to send SMS alert: ${error.message}`);
+    }
+  }
+
+  private getSeverityColor(severity: string): string {
+    switch (severity) {
+      case 'critical':
+        return '#ff0000';
+      case 'high':
+        return '#ff6600';
+      case 'medium':
+        return '#ffff00';
+      case 'low':
+        return '#00ff00';
+      default:
+        return '#808080';
+    }
+  }
+
+  private isInCooldown(ruleId: string, now: Date): boolean {
+    const cooldownEnd = this.alertCooldowns.get(ruleId);
+    if (!cooldownEnd) return false;
+
+    if (now < cooldownEnd) {
+      return true;
+    }
+
+    this.alertCooldowns.delete(ruleId);
+    return false;
+  }
+
+  private setCooldown(ruleId: string, now: Date): void {
+    const rule = this.alertRules.get(ruleId);
+    if (!rule) return;
+
+    const cooldownEnd = new Date(
+      now.getTime() + rule.cooldown_minutes * 60 * 1000,
+    );
+    this.alertCooldowns.set(ruleId, cooldownEnd);
+  }
+
+  private exceedsHourlyLimit(ruleId: string, now: Date): boolean {
+    const counter = this.alertCounters.get(ruleId);
+    if (!counter) return false;
+
+    const rule = this.alertRules.get(ruleId);
+    if (!rule) return false;
+
+    return counter >= rule.max_alerts_per_hour;
+  }
+
+  private incrementAlertCounter(ruleId: string, now: Date): void {
+    const currentCount = this.alertCounters.get(ruleId) || 0;
+    this.alertCounters.set(ruleId, currentCount + 1);
+
+    // Reset counter after an hour
+    setTimeout(
+      () => {
+        const count = this.alertCounters.get(ruleId) || 0;
+        if (count > 0) {
+          this.alertCounters.set(ruleId, count - 1);
+        }
+      },
+      60 * 60 * 1000,
+    );
+  }
+
+  private updateAlertMetrics(alert: Alert): void {
+    this.alertMetrics.total_alerts++;
+    this.alertMetrics.active_alerts++;
+
+    // Update severity count
+    const severity = alert.severity;
+    this.alertMetrics.alerts_by_severity[severity] =
+      (this.alertMetrics.alerts_by_severity[severity] || 0) + 1;
+
+    // Update rule count
+    const ruleId = alert.rule_id;
+    this.alertMetrics.alerts_by_rule[ruleId] =
+      (this.alertMetrics.alerts_by_rule[ruleId] || 0) + 1;
+
+    // Update frequency trend
+    const now = new Date();
+    const existingTrend = this.alertMetrics.alert_frequency_trend.find(
+      (t) => t.timestamp.getHours() === now.getHours(),
+    );
+
+    if (existingTrend) {
+      existingTrend.count++;
+    } else {
+      this.alertMetrics.alert_frequency_trend.push({
+        timestamp: now,
+        count: 1,
+      });
+    }
+
+    // Keep only last 24 hours of trend data
+    if (this.alertMetrics.alert_frequency_trend.length > 24) {
+      this.alertMetrics.alert_frequency_trend.shift();
+    }
+  }
+
+  // Scheduled tasks
+  @Cron(CronExpression.EVERY_HOUR)
+  async cleanupOldAlerts(): Promise<void> {
+    const cutoffTime = new Date(Date.now() - 24 * 60 * 60 * 1000); // 24 hours ago
+
+    for (const [alertId, alert] of this.activeAlerts.entries()) {
+      if (alert.triggered_at < cutoffTime) {
+        alert.status = 'resolved';
+        alert.resolved_at = new Date();
+        this.activeAlerts.delete(alertId);
+        this.alertMetrics.active_alerts--;
+      }
+    }
+  }
+
+  @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
+  async resetHourlyCounters(): Promise<void> {
+    this.alertCounters.clear();
+    this.logger.log('Hourly alert counters reset');
+  }
+
+  // Public API methods
+  async createAlertRule(rule: AlertRule): Promise<void> {
+    this.alertRules.set(rule.id, rule);
+    this.logger.log(`Alert rule created: ${rule.name}`);
+  }
+
+  async updateAlertRule(
+    ruleId: string,
+    updates: Partial<AlertRule>,
+  ): Promise<void> {
+    const existingRule = this.alertRules.get(ruleId);
+    if (!existingRule) {
+      throw new Error(`Alert rule ${ruleId} not found`);
+    }
+
+    const updatedRule = { ...existingRule, ...updates };
+    this.alertRules.set(ruleId, updatedRule);
+    this.logger.log(`Alert rule updated: ${ruleId}`);
+  }
+
+  async deleteAlertRule(ruleId: string): Promise<void> {
+    const deleted = this.alertRules.delete(ruleId);
+    if (!deleted) {
+      throw new Error(`Alert rule ${ruleId} not found`);
+    }
+
+    this.logger.log(`Alert rule deleted: ${ruleId}`);
+  }
+
+  async getAlertRules(): Promise<AlertRule[]> {
+    return Array.from(this.alertRules.values());
+  }
+
+  async getActiveAlerts(): Promise<Alert[]> {
+    return Array.from(this.activeAlerts.values());
+  }
+
+  async getAlertHistory(limit: number = 100): Promise<Alert[]> {
+    return this.alertHistory.slice(-limit);
+  }
+
+  async acknowledgeAlert(
+    alertId: string,
+    acknowledgedBy: string,
+  ): Promise<void> {
+    const alert = this.activeAlerts.get(alertId);
+    if (!alert) {
+      throw new Error(`Alert ${alertId} not found`);
+    }
+
+    alert.status = 'acknowledged';
+    alert.acknowledged_by = acknowledgedBy;
+    alert.acknowledged_at = new Date();
+
+    this.logger.log(`Alert acknowledged: ${alertId} by ${acknowledgedBy}`);
+  }
+
+  async resolveAlert(alertId: string): Promise<void> {
+    const alert = this.activeAlerts.get(alertId);
+    if (!alert) {
+      throw new Error(`Alert ${alertId} not found`);
+    }
+
+    alert.status = 'resolved';
+    alert.resolved_at = new Date();
+    this.activeAlerts.delete(alertId);
+    this.alertMetrics.active_alerts--;
+
+    this.logger.log(`Alert resolved: ${alertId}`);
+  }
+
+  async getAlertMetrics(): Promise<AlertMetrics> {
+    return { ...this.alertMetrics };
+  }
+
+  async testAlertRule(ruleId: string): Promise<boolean> {
+    const rule = this.alertRules.get(ruleId);
+    if (!rule) {
+      throw new Error(`Alert rule ${ruleId} not found`);
+    }
+
+    try {
+      const shouldAlert = await this.evaluateRule(rule, new Date());
+      return shouldAlert;
+    } catch (error) {
+      this.logger.error(`Failed to test alert rule ${ruleId}`, error);
+      return false;
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/elasticsearch/elasticsearch.module.ts.html b/coverage/lcov-report/src/logging/elasticsearch/elasticsearch.module.ts.html new file mode 100644 index 0000000..a4b7554 --- /dev/null +++ b/coverage/lcov-report/src/logging/elasticsearch/elasticsearch.module.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for src/logging/elasticsearch/elasticsearch.module.ts + + + + + + + + + +
+
+

All files / src/logging/elasticsearch elasticsearch.module.ts

+
+ +
+ 0% + Statements + 0/33 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { ConfigModule } from '@nestjs/config';
+import { ElasticsearchModule } from '@nestjs/elasticsearch';
+import { ElasticsearchService } from './elasticsearch.service';
+
+@Module({
+  imports: [
+    ConfigModule,
+    ElasticsearchModule.registerAsync({
+      useFactory: async () => ({
+        node: process.env.ELASTICSEARCH_NODE || 'http://localhost:9200',
+        auth: {
+          username: process.env.ELASTICSEARCH_USERNAME || 'elastic',
+          password: process.env.ELASTICSEARCH_PASSWORD || 'changeme',
+        },
+        maxRetries: 3,
+        requestTimeout: 30000,
+        pingTimeout: 3000,
+        sniffOnStart: true,
+        sniffInterval: 300000,
+        maxConnections: 100,
+        compression: 'gzip',
+        tls: {
+          rejectUnauthorized:
+            process.env.ELASTICSEARCH_VERIFY_CERTS !== 'false',
+        },
+      }),
+    }),
+  ],
+  providers: [ElasticsearchService],
+  exports: [ElasticsearchService],
+})
+export class ElasticsearchModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/elasticsearch/elasticsearch.service.ts.html b/coverage/lcov-report/src/logging/elasticsearch/elasticsearch.service.ts.html new file mode 100644 index 0000000..171c4dc --- /dev/null +++ b/coverage/lcov-report/src/logging/elasticsearch/elasticsearch.service.ts.html @@ -0,0 +1,2023 @@ + + + + + + Code coverage report for src/logging/elasticsearch/elasticsearch.service.ts + + + + + + + + + +
+
+

All files / src/logging/elasticsearch elasticsearch.service.ts

+
+ +
+ 0% + Statements + 0/646 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/646 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { Client } from '@elastic/elasticsearch';
+import {
+  SearchResponse,
+  SearchHit,
+} from '@elastic/elasticsearch/lib/api/types';
+
+export interface LogEntry {
+  timestamp: Date;
+  level: string;
+  message: string;
+  service_name: string;
+  environment: string;
+  request_id?: string;
+  request_method?: string;
+  request_url?: string;
+  error_name?: string;
+  error_message?: string;
+  response_time?: number;
+  memory_usage?: number;
+  cpu_usage?: number;
+  tx_hash?: string;
+  tx_type?: string;
+  tx_status?: string;
+  tags?: string[];
+  metadata?: Record<string, any>;
+}
+
+export interface SearchQuery {
+  query?: string;
+  level?: string;
+  service_name?: string;
+  environment?: string;
+  start_time?: Date;
+  end_time?: Date;
+  tags?: string[];
+  size?: number;
+  from?: number;
+  sort?: Array<{ [key: string]: { order: 'asc' | 'desc' } }>;
+}
+
+export interface LogAggregation {
+  total_logs: number;
+  logs_by_level: Record<string, number>;
+  logs_by_service: Record<string, number>;
+  logs_by_hour: Record<string, number>;
+  error_rate: number;
+  average_response_time: number;
+  top_errors: Array<{ error_name: string; count: number }>;
+  slow_requests: Array<{
+    url: string;
+    avg_response_time: number;
+    count: number;
+  }>;
+}
+
+export interface IndexMetrics {
+  index_name: string;
+  doc_count: number;
+  store_size: string;
+  health: 'green' | 'yellow' | 'red';
+  status: string;
+}
+
+@Injectable()
+export class ElasticsearchService implements OnModuleInit {
+  private readonly logger = new Logger(ElasticsearchService.name);
+  private readonly client: Client;
+  private readonly indexPrefix = 'currentdao-logs';
+  private readonly maxRetries = 3;
+  private readonly requestTimeout = 30000;
+
+  constructor(private configService: ConfigService) {
+    this.client = new Client({
+      node:
+        this.configService.get('ELASTICSEARCH_NODE') || 'http://localhost:9200',
+      auth: {
+        username: this.configService.get('ELASTICSEARCH_USERNAME') || 'elastic',
+        password:
+          this.configService.get('ELASTICSEARCH_PASSWORD') || 'changeme',
+      },
+      maxRetries: this.maxRetries,
+      requestTimeout: this.requestTimeout,
+      pingTimeout: 3000,
+      sniffOnStart: true,
+      sniffInterval: 300000,
+      compression: 'gzip',
+      tls: {
+        rejectUnauthorized:
+          this.configService.get('ELASTICSEARCH_VERIFY_CERTS') !== 'false',
+      },
+    });
+  }
+
+  async onModuleInit() {
+    try {
+      await this.client.ping();
+      this.logger.log('Elasticsearch connection established');
+
+      // Create index template if it doesn't exist
+      await this.createIndexTemplate();
+
+      // Create ILM policy if it doesn't exist
+      await this.createILMPolicy();
+
+      this.logger.log('Elasticsearch service initialized successfully');
+    } catch (error) {
+      this.logger.error('Failed to initialize Elasticsearch service', error);
+      throw error;
+    }
+  }
+
+  private async createIndexTemplate(): Promise<void> {
+    const templateName = 'currentdao-logs-template';
+
+    try {
+      const exists = await this.client.indices.existsIndexTemplate({
+        name: templateName,
+      });
+
+      if (!exists) {
+        await this.client.indices.putIndexTemplate({
+          name: templateName,
+          index_patterns: [`${this.indexPrefix}-*`],
+          template: {
+            settings: {
+              number_of_shards: 3,
+              number_of_replicas: 1,
+              'index.refresh_interval': '5s',
+              'index.translog.flush_threshold_size': '512mb',
+              'index.mapping.total_fields.limit': 2000,
+              analysis: {
+                analyzer: {
+                  currentdao_log_analyzer: {
+                    type: 'custom',
+                    tokenizer: 'standard',
+                    filter: ['lowercase', 'stop'],
+                  },
+                },
+              },
+            },
+            mappings: {
+              properties: {
+                '@timestamp': { type: 'date' },
+                timestamp: { type: 'date' },
+                level: {
+                  type: 'keyword',
+                  fields: {
+                    text: {
+                      type: 'text',
+                      analyzer: 'currentdao_log_analyzer',
+                    },
+                  },
+                },
+                message: {
+                  type: 'text',
+                  analyzer: 'currentdao_log_analyzer',
+                  fields: {
+                    keyword: {
+                      type: 'keyword',
+                      ignore_above: 256,
+                    },
+                  },
+                },
+                service_name: { type: 'keyword' },
+                environment: { type: 'keyword' },
+                request_id: { type: 'keyword' },
+                request_method: { type: 'keyword' },
+                request_url: { type: 'keyword' },
+                error_name: { type: 'keyword' },
+                error_message: { type: 'text' },
+                response_time: { type: 'float' },
+                memory_usage: { type: 'float' },
+                cpu_usage: { type: 'float' },
+                tx_hash: { type: 'keyword' },
+                tx_type: { type: 'keyword' },
+                tx_status: { type: 'keyword' },
+                tags: { type: 'keyword' },
+                clientip: { type: 'ip' },
+                geoip: {
+                  properties: {
+                    location: { type: 'geo_point' },
+                    country_name: { type: 'keyword' },
+                    city_name: { type: 'keyword' },
+                  },
+                },
+              },
+            },
+            aliases: {
+              [this.indexPrefix]: {},
+            },
+          },
+          composed_of: [],
+          priority: 100,
+          version: 1,
+        });
+
+        this.logger.log(`Index template ${templateName} created successfully`);
+      }
+    } catch (error) {
+      this.logger.error('Failed to create index template', error);
+      throw error;
+    }
+  }
+
+  private async createILMPolicy(): Promise<void> {
+    const policyName = 'currentdao-logs-policy';
+
+    try {
+      const exists = await this.client.ilm.lifecycle.get({
+        policy: policyName,
+      });
+
+      if (!exists) {
+        await this.client.ilm.lifecycle.put({
+          policy: policyName,
+          policy: {
+            phases: {
+              hot: {
+                actions: {
+                  rollover: {
+                    max_size: '10GB',
+                    max_age: '24h',
+                    max_docs: 1000000,
+                  },
+                  set_priority: { priority: 100 },
+                },
+              },
+              warm: {
+                min_age: '7d',
+                actions: {
+                  set_priority: { priority: 50 },
+                  forcemerge: { max_num_segments: 1 },
+                },
+              },
+              cold: {
+                min_age: '30d',
+                actions: {
+                  set_priority: { priority: 0 },
+                },
+              },
+              delete: {
+                min_age: '90d',
+              },
+            },
+          },
+        });
+
+        this.logger.log(`ILM policy ${policyName} created successfully`);
+      }
+    } catch (error) {
+      this.logger.error('Failed to create ILM policy', error);
+      throw error;
+    }
+  }
+
+  async indexLog(logEntry: LogEntry): Promise<void> {
+    try {
+      const indexName = `${this.indexPrefix}-${new Date().toISOString().split('T')[0]}`;
+
+      await this.client.index({
+        index: indexName,
+        body: {
+          ...logEntry,
+          '@timestamp': logEntry.timestamp,
+        },
+      });
+    } catch (error) {
+      this.logger.error('Failed to index log entry', error);
+      throw error;
+    }
+  }
+
+  async indexLogs(logEntries: LogEntry[]): Promise<void> {
+    try {
+      const body = logEntries.flatMap((logEntry) => [
+        {
+          index: {
+            _index: `${this.indexPrefix}-${new Date(logEntry.timestamp).toISOString().split('T')[0]}`,
+          },
+        },
+        {
+          ...logEntry,
+          '@timestamp': logEntry.timestamp,
+        },
+      ]);
+
+      const response = await this.client.bulk({ body });
+
+      if (response.errors) {
+        const erroredDocuments = response.items
+          .filter((item: any) => item.index.error)
+          .map((item: any) => ({
+            status: item.index.status,
+            error: item.index.error,
+          }));
+
+        this.logger.error('Bulk indexing errors', erroredDocuments);
+      }
+    } catch (error) {
+      this.logger.error('Failed to bulk index log entries', error);
+      throw error;
+    }
+  }
+
+  async searchLogs(searchQuery: SearchQuery): Promise<SearchResponse> {
+    try {
+      const esQuery = this.buildElasticsearchQuery(searchQuery);
+
+      const response = await this.client.search({
+        index: `${this.indexPrefix}-*`,
+        body: esQuery,
+      });
+
+      return response;
+    } catch (error) {
+      this.logger.error('Failed to search logs', error);
+      throw error;
+    }
+  }
+
+  private buildElasticsearchQuery(searchQuery: SearchQuery): any {
+    const query: any = {
+      query: {
+        bool: {
+          must: [],
+          filter: [],
+        },
+      },
+      size: searchQuery.size || 100,
+      from: searchQuery.from || 0,
+      sort: searchQuery.sort || [{ '@timestamp': { order: 'desc' } }],
+    };
+
+    // Text search
+    if (searchQuery.query) {
+      query.query.bool.must.push({
+        multi_match: {
+          query: searchQuery.query,
+          fields: ['message', 'error_message', 'request_url'],
+          type: 'best_fields',
+        },
+      });
+    }
+
+    // Level filter
+    if (searchQuery.level) {
+      query.query.bool.filter.push({
+        term: { level: searchQuery.level },
+      });
+    }
+
+    // Service name filter
+    if (searchQuery.service_name) {
+      query.query.bool.filter.push({
+        term: { service_name: searchQuery.service_name },
+      });
+    }
+
+    // Environment filter
+    if (searchQuery.environment) {
+      query.query.bool.filter.push({
+        term: { environment: searchQuery.environment },
+      });
+    }
+
+    // Time range filter
+    if (searchQuery.start_time || searchQuery.end_time) {
+      const timeRange: any = {};
+      if (searchQuery.start_time) {
+        timeRange.gte = searchQuery.start_time.toISOString();
+      }
+      if (searchQuery.end_time) {
+        timeRange.lte = searchQuery.end_time.toISOString();
+      }
+
+      query.query.bool.filter.push({
+        range: { '@timestamp': timeRange },
+      });
+    }
+
+    // Tags filter
+    if (searchQuery.tags && searchQuery.tags.length > 0) {
+      query.query.bool.filter.push({
+        terms: { tags: searchQuery.tags },
+      });
+    }
+
+    // If no query specified, match all
+    if (
+      query.query.bool.must.length === 0 &&
+      query.query.bool.filter.length === 0
+    ) {
+      query.query = { match_all: {} };
+    }
+
+    return query;
+  }
+
+  async getLogAggregations(searchQuery: SearchQuery): Promise<LogAggregation> {
+    try {
+      const esQuery = {
+        ...this.buildElasticsearchQuery(searchQuery),
+        size: 0,
+        aggs: {
+          logs_by_level: {
+            terms: {
+              field: 'level',
+              size: 10,
+            },
+          },
+          logs_by_service: {
+            terms: {
+              field: 'service_name',
+              size: 20,
+            },
+          },
+          logs_by_hour: {
+            date_histogram: {
+              field: '@timestamp',
+              calendar_interval: 'hour',
+              format: 'yyyy-MM-dd HH:mm',
+            },
+          },
+          error_rate: {
+            filters: {
+              filters: {
+                errors: {
+                  term: { level: 'error' },
+                },
+                total: {
+                  match_all: {},
+                },
+              },
+            },
+          },
+          avg_response_time: {
+            avg: {
+              field: 'response_time',
+            },
+          },
+          top_errors: {
+            terms: {
+              field: 'error_name',
+              size: 10,
+            },
+          },
+          slow_requests: {
+            terms: {
+              field: 'request_url',
+              size: 10,
+              order: {
+                avg_response_time: 'desc',
+              },
+              aggs: {
+                avg_response_time: {
+                  avg: {
+                    field: 'response_time',
+                  },
+                },
+              },
+            },
+          },
+        },
+      };
+
+      const response = await this.client.search({
+        index: `${this.indexPrefix}-*`,
+        body: esQuery,
+      });
+
+      return this.parseAggregations(response);
+    } catch (error) {
+      this.logger.error('Failed to get log aggregations', error);
+      throw error;
+    }
+  }
+
+  private parseAggregations(response: SearchResponse): LogAggregation {
+    const aggregations = response.aggregations as any;
+
+    const totalLogs = response.hits.total?.value || 0;
+    const logsByLevel = this.parseTermsAggregation(aggregations.logs_by_level);
+    const logsByService = this.parseTermsAggregation(
+      aggregations.logs_by_service,
+    );
+    const logsByHour = this.parseDateHistogramAggregation(
+      aggregations.logs_by_hour,
+    );
+
+    const errorBuckets = aggregations.error_rate.buckets;
+    const errorCount = errorBuckets.errors.doc_count;
+    const errorRate = totalLogs > 0 ? (errorCount / totalLogs) * 100 : 0;
+
+    const avgResponseTime = aggregations.avg_response_time.value || 0;
+    const topErrors = aggregations.top_errors.buckets.map((bucket: any) => ({
+      error_name: bucket.key,
+      count: bucket.doc_count,
+    }));
+
+    const slowRequests = aggregations.slow_requests.buckets.map(
+      (bucket: any) => ({
+        url: bucket.key,
+        avg_response_time: bucket.avg_response_time.value,
+        count: bucket.doc_count,
+      }),
+    );
+
+    return {
+      total_logs: totalLogs,
+      logs_by_level: logsByLevel,
+      logs_by_service: logsByService,
+      logs_by_hour: logsByHour,
+      error_rate: errorRate,
+      average_response_time: avgResponseTime,
+      top_errors: topErrors,
+      slow_requests: slowRequests,
+    };
+  }
+
+  private parseTermsAggregation(agg: any): Record<string, number> {
+    const result: Record<string, number> = {};
+    if (agg && agg.buckets) {
+      for (const bucket of agg.buckets) {
+        result[bucket.key] = bucket.doc_count;
+      }
+    }
+    return result;
+  }
+
+  private parseDateHistogramAggregation(agg: any): Record<string, number> {
+    const result: Record<string, number> = {};
+    if (agg && agg.buckets) {
+      for (const bucket of agg.buckets) {
+        result[bucket.key_as_string] = bucket.doc_count;
+      }
+    }
+    return result;
+  }
+
+  async getIndexMetrics(): Promise<IndexMetrics[]> {
+    try {
+      const response = await this.client.cat.indices({
+        index: `${this.indexPrefix}-*`,
+        format: 'json',
+      });
+
+      return response.map((index: any) => ({
+        index_name: index.index,
+        doc_count: parseInt(index['docs.count'] || '0'),
+        store_size: index['store.size'],
+        health: index.health as 'green' | 'yellow' | 'red',
+        status: index.status,
+      }));
+    } catch (error) {
+      this.logger.error('Failed to get index metrics', error);
+      throw error;
+    }
+  }
+
+  async getClusterHealth(): Promise<any> {
+    try {
+      return await this.client.cluster.health();
+    } catch (error) {
+      this.logger.error('Failed to get cluster health', error);
+      throw error;
+    }
+  }
+
+  async deleteIndex(indexName: string): Promise<void> {
+    try {
+      await this.client.indices.delete({
+        index: indexName,
+      });
+      this.logger.log(`Index ${indexName} deleted successfully`);
+    } catch (error) {
+      this.logger.error(`Failed to delete index ${indexName}`, error);
+      throw error;
+    }
+  }
+
+  async optimizeIndex(indexName: string): Promise<void> {
+    try {
+      await this.client.indices.forcemerge({
+        index: indexName,
+        max_num_segments: 1,
+      });
+      this.logger.log(`Index ${indexName} optimized successfully`);
+    } catch (error) {
+      this.logger.error(`Failed to optimize index ${indexName}`, error);
+      throw error;
+    }
+  }
+
+  async refreshIndex(indexName: string): Promise<void> {
+    try {
+      await this.client.indices.refresh({
+        index: indexName,
+      });
+    } catch (error) {
+      this.logger.error(`Failed to refresh index ${indexName}`, error);
+      throw error;
+    }
+  }
+
+  // Performance monitoring methods
+  async getSearchPerformance(): Promise<any> {
+    try {
+      const response = await this.client.indices.stats({
+        index: `${this.indexPrefix}-*`,
+        metric: 'search',
+      });
+
+      return response.indices;
+    } catch (error) {
+      this.logger.error('Failed to get search performance metrics', error);
+      throw error;
+    }
+  }
+
+  async getIndexingPerformance(): Promise<any> {
+    try {
+      const response = await this.client.indices.stats({
+        index: `${this.indexPrefix}-*`,
+        metric: 'indexing',
+      });
+
+      return response.indices;
+    } catch (error) {
+      this.logger.error('Failed to get indexing performance metrics', error);
+      throw error;
+    }
+  }
+
+  // Health check method
+  async isHealthy(): Promise<boolean> {
+    try {
+      const health = await this.getClusterHealth();
+      return health.status === 'green' || health.status === 'yellow';
+    } catch (error) {
+      this.logger.error('Health check failed', error);
+      return false;
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/elasticsearch/index.html b/coverage/lcov-report/src/logging/elasticsearch/index.html new file mode 100644 index 0000000..6f4b42c --- /dev/null +++ b/coverage/lcov-report/src/logging/elasticsearch/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/logging/elasticsearch + + + + + + + + + +
+
+

All files src/logging/elasticsearch

+
+ +
+ 0% + Statements + 0/679 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/679 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
elasticsearch.module.ts +
+
0%0/330%0/10%0/10%0/33
elasticsearch.service.ts +
+
0%0/6460%0/10%0/10%0/646
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/index.html b/coverage/lcov-report/src/logging/index.html new file mode 100644 index 0000000..4c33f0e --- /dev/null +++ b/coverage/lcov-report/src/logging/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/logging + + + + + + + + + +
+
+

All files src/logging

+
+ +
+ 0% + Statements + 0/559 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/559 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
logging.module.ts +
+
0%0/400%0/10%0/10%0/40
logging.service.ts +
+
0%0/5190%0/10%0/10%0/519
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/logging.module.ts.html b/coverage/lcov-report/src/logging/logging.module.ts.html new file mode 100644 index 0000000..aab4e57 --- /dev/null +++ b/coverage/lcov-report/src/logging/logging.module.ts.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for src/logging/logging.module.ts + + + + + + + + + +
+
+

All files / src/logging logging.module.ts

+
+ +
+ 0% + Statements + 0/40 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { ConfigModule } from '@nestjs/config';
+import { ElasticsearchModule } from './elasticsearch/elasticsearch.module';
+import { LogParserService } from './parsing/log-parser.service';
+import { RetentionPolicyService } from './retention/retention-policy.service';
+import { LogAlertService } from './alerts/log-alert.service';
+import { LoggingService } from './logging.service';
+
+export interface LoggingConfig {
+  elasticsearch: {
+    node: string;
+    username: string;
+    password: string;
+  };
+  logstash: {
+    host: string;
+    port: number;
+  };
+  retention: {
+    default_days: number;
+    max_storage_gb: number;
+  };
+  alerts: {
+    enabled: boolean;
+    default_recipients: string[];
+  };
+}
+
+@Module({
+  imports: [ConfigModule, ElasticsearchModule],
+  providers: [LoggingService, LogParserService, RetentionPolicyService, LogAlertService],
+  exports: [
+    LoggingService,
+    ElasticsearchModule,
+    LogParserService,
+    RetentionPolicyService,
+    LogAlertService,
+  ],
+})
+export class LoggingModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/logging.service.ts.html b/coverage/lcov-report/src/logging/logging.service.ts.html new file mode 100644 index 0000000..f29e68f --- /dev/null +++ b/coverage/lcov-report/src/logging/logging.service.ts.html @@ -0,0 +1,1642 @@ + + + + + + Code coverage report for src/logging/logging.service.ts + + + + + + + + + +
+
+

All files / src/logging logging.service.ts

+
+ +
+ 0% + Statements + 0/519 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/519 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Injectable,
+  Logger,
+  OnModuleInit,
+  OnModuleDestroy,
+} from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import {
+  ElasticsearchService,
+  LogEntry,
+} from './elasticsearch/elasticsearch.service';
+import {
+  LogParserService,
+  ParsedLogEntry,
+  ParseResult,
+} from './parsing/log-parser.service';
+import { LogAlertService } from './alerts/log-alert.service';
+import { RetentionPolicyService } from './retention/retention-policy.service';
+
+export interface LogContext {
+  service_name: string;
+  environment: string;
+  request_id?: string;
+  user_id?: string;
+  session_id?: string;
+  ip_address?: string;
+  user_agent?: string;
+  component?: string;
+  function?: string;
+  line_number?: number;
+  blockchain_tx_hash?: string;
+  contract_address?: string;
+}
+
+export interface LogOptions {
+  level?: 'debug' | 'info' | 'warn' | 'error';
+  context?: LogContext;
+  tags?: string[];
+  metadata?: Record<string, any>;
+  parse_immediately?: boolean;
+  alert_immediately?: boolean;
+}
+
+@Injectable()
+export class LoggingService implements OnModuleInit, OnModuleDestroy {
+  private readonly logger = new Logger(LoggingService.name);
+  private readonly logBuffer: LogEntry[] = [];
+  private readonly bufferSize = 100;
+  private readonly flushInterval = 5000; // 5 seconds
+  private flushTimer: NodeJS.Timeout;
+  private isShuttingDown = false;
+
+  constructor(
+    private readonly configService: ConfigService,
+    private readonly elasticsearchService: ElasticsearchService,
+    private readonly logParserService: LogParserService,
+    private readonly logAlertService: LogAlertService,
+    private readonly retentionPolicyService: RetentionPolicyService,
+  ) {}
+
+  async onModuleInit() {
+    this.logger.log('Initializing logging service');
+
+    // Start periodic flush
+    this.startPeriodicFlush();
+
+    // Set up process error handlers
+    this.setupErrorHandlers();
+
+    this.logger.log('Logging service initialized');
+  }
+
+  async onModuleDestroy() {
+    this.isShuttingDown = true;
+
+    // Clear flush timer
+    if (this.flushTimer) {
+      clearInterval(this.flushTimer);
+    }
+
+    // Flush remaining logs
+    await this.flushLogs();
+
+    this.logger.log('Logging service shutdown complete');
+  }
+
+  private startPeriodicFlush(): void {
+    this.flushTimer = setInterval(async () => {
+      if (!this.isShuttingDown) {
+        await this.flushLogs();
+      }
+    }, this.flushInterval);
+  }
+
+  private setupErrorHandlers(): void {
+    // Handle uncaught exceptions
+    process.on('uncaughtException', async (error) => {
+      await this.error('Uncaught Exception', error, {
+        context: {
+          service_name: 'currentdao-backend',
+          environment: this.configService.get('NODE_ENV') || 'development',
+        },
+        tags: ['uncaught-exception', 'critical'],
+        alert_immediately: true,
+      });
+    });
+
+    // Handle unhandled promise rejections
+    process.on('unhandledRejection', async (reason, promise) => {
+      await this.error('Unhandled Promise Rejection', reason, {
+        context: {
+          service_name: 'currentdao-backend',
+          environment: this.configService.get('NODE_ENV') || 'development',
+        },
+        tags: ['unhandled-rejection', 'critical'],
+        alert_immediately: true,
+      });
+    });
+  }
+
+  async debug(
+    message: string,
+    metadata?: any,
+    options?: LogOptions,
+  ): Promise<void> {
+    await this.log('debug', message, metadata, options);
+  }
+
+  async info(
+    message: string,
+    metadata?: any,
+    options?: LogOptions,
+  ): Promise<void> {
+    await this.log('info', message, metadata, options);
+  }
+
+  async warn(
+    message: string,
+    metadata?: any,
+    options?: LogOptions,
+  ): Promise<void> {
+    await this.log('warn', message, metadata, options);
+  }
+
+  async error(
+    message: string,
+    error?: any,
+    options?: LogOptions,
+  ): Promise<void> {
+    const errorMetadata = error
+      ? {
+          error_name: error.name || 'UnknownError',
+          error_message: error.message || message,
+          error_stack: error.stack,
+          ...error,
+        }
+      : {};
+
+    await this.log('error', message, errorMetadata, options);
+  }
+
+  private async log(
+    level: string,
+    message: string,
+    metadata?: any,
+    options?: LogOptions,
+  ): Promise<void> {
+    const logEntry: LogEntry = {
+      timestamp: new Date(),
+      level: options?.level || level,
+      message,
+      service_name:
+        options?.context?.service_name ||
+        this.configService.get('SERVICE_NAME') ||
+        'currentdao-backend',
+      environment:
+        options?.context?.environment ||
+        this.configService.get('NODE_ENV') ||
+        'development',
+      request_id: options?.context?.request_id,
+      response_time: metadata?.response_time,
+      memory_usage: metadata?.memory_usage,
+      cpu_usage: metadata?.cpu_usage,
+      tx_hash: options?.context?.blockchain_tx_hash,
+      tx_type: metadata?.tx_type,
+      tx_status: metadata?.tx_status,
+      tags: options?.tags || [],
+      metadata: {
+        ...metadata,
+        ...options?.metadata,
+        context: options?.context,
+      },
+    };
+
+    // Add to buffer
+    this.logBuffer.push(logEntry);
+
+    // Flush immediately if buffer is full or critical error
+    if (
+      this.logBuffer.length >= this.bufferSize ||
+      (level === 'error' && options?.alert_immediately)
+    ) {
+      await this.flushLogs();
+    }
+
+    // Also log to console for development
+    if (this.configService.get('NODE_ENV') === 'development') {
+      this.logToConsole(level, message, metadata);
+    }
+  }
+
+  private logToConsole(level: string, message: string, metadata?: any): void {
+    const logMessage = `[${new Date().toISOString()}] ${level.toUpperCase()}: ${message}`;
+
+    switch (level) {
+      case 'debug':
+        this.logger.debug(logMessage, metadata);
+        break;
+      case 'info':
+        this.logger.log(logMessage, metadata);
+        break;
+      case 'warn':
+        this.logger.warn(logMessage, metadata);
+        break;
+      case 'error':
+        this.logger.error(logMessage, metadata);
+        break;
+      default:
+        this.logger.log(logMessage, metadata);
+    }
+  }
+
+  private async flushLogs(): Promise<void> {
+    if (this.logBuffer.length === 0) return;
+
+    const logsToFlush = [...this.logBuffer];
+    this.logBuffer.length = 0; // Clear buffer
+
+    try {
+      // Parse logs if needed
+      const parsedLogs: ParsedLogEntry[] = [];
+
+      for (const log of logsToFlush) {
+        if (log.metadata?.parse_immediately) {
+          const result = await this.logParserService.parseLogEntry(
+            JSON.stringify(log),
+            log.metadata?.context,
+          );
+
+          if (result.success && result.parsed_entry) {
+            parsedLogs.push(result.parsed_entry);
+          }
+        } else {
+          // Create basic parsed entry
+          parsedLogs.push({
+            ...log,
+            parsed_fields: {},
+            extracted_tags: log.tags || [],
+            severity_score: this.calculateSeverityScore(log.level),
+            categorized_as: this.categorizeLog(log),
+          });
+        }
+      }
+
+      // Index logs to Elasticsearch
+      await this.elasticsearchService.indexLogs(parsedLogs);
+
+      // Check for alerts if needed
+      for (const log of logsToFlush) {
+        if (log.metadata?.alert_immediately || log.level === 'error') {
+          // Alert checking is handled by the alert service monitoring
+        }
+      }
+    } catch (error) {
+      this.logger.error('Failed to flush logs to Elasticsearch', error);
+
+      // Re-add failed logs to buffer for retry (with limit)
+      const retryLogs = logsToFlush.slice(-10); // Keep only last 10 for retry
+      this.logBuffer.unshift(...retryLogs);
+    }
+  }
+
+  private calculateSeverityScore(level: string): number {
+    switch (level.toLowerCase()) {
+      case 'error':
+        return 80;
+      case 'warn':
+      case 'warning':
+        return 60;
+      case 'info':
+        return 40;
+      case 'debug':
+        return 20;
+      default:
+        return 30;
+    }
+  }
+
+  private categorizeLog(log: LogEntry): string[] {
+    const categories: string[] = [];
+
+    // Level-based categorization
+    if (log.level === 'error') {
+      categories.push('error', 'issue');
+    }
+    if (log.level === 'warn') {
+      categories.push('warning', 'attention');
+    }
+
+    // Message-based categorization
+    const message = log.message.toLowerCase();
+    if (message.includes('security') || message.includes('unauthorized')) {
+      categories.push('security');
+    }
+    if (message.includes('performance') || message.includes('slow')) {
+      categories.push('performance');
+    }
+    if (message.includes('database') || message.includes('sql')) {
+      categories.push('database');
+    }
+    if (message.includes('blockchain') || message.includes('transaction')) {
+      categories.push('blockchain');
+    }
+    if (log.tx_hash) {
+      categories.push('blockchain', 'transaction');
+    }
+
+    // Tag-based categorization
+    if (log.tags) {
+      categories.push(...log.tags);
+    }
+
+    return categories.length > 0 ? categories : ['general'];
+  }
+
+  // Specialized logging methods for different contexts
+  async logHttpRequest(
+    method: string,
+    url: string,
+    statusCode: number,
+    responseTime: number,
+    context?: Partial<LogContext>,
+    metadata?: any,
+  ): Promise<void> {
+    const level =
+      statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info';
+
+    await this.log(
+      level,
+      `HTTP ${method} ${url} - ${statusCode}`,
+      {
+        request_method: method,
+        request_url: url,
+        status_code: statusCode,
+        response_time: responseTime,
+        ...metadata,
+      },
+      {
+        context: {
+          service_name: 'currentdao-backend',
+          environment: this.configService.get('NODE_ENV') || 'development',
+          ...context,
+        },
+        tags: ['http-request', `status-${statusCode}`],
+        parse_immediately: true,
+      },
+    );
+  }
+
+  async logDatabaseQuery(
+    query: string,
+    duration: number,
+    error?: any,
+    context?: Partial<LogContext>,
+  ): Promise<void> {
+    const level = error ? 'error' : duration > 1000 ? 'warn' : 'info';
+
+    await this.log(
+      level,
+      `Database query executed in ${duration}ms`,
+      {
+        database_query: query,
+        database_duration: duration,
+        ...error,
+      },
+      {
+        context: {
+          service_name: 'currentdao-backend',
+          environment: this.configService.get('NODE_ENV') || 'development',
+          ...context,
+        },
+        tags: ['database', 'query'],
+        parse_immediately: true,
+      },
+    );
+  }
+
+  async logBlockchainTransaction(
+    txHash: string,
+    txType: string,
+    status: string,
+    gasUsed?: number,
+    error?: any,
+    context?: Partial<LogContext>,
+  ): Promise<void> {
+    const level =
+      status === 'failed' ? 'error' : status === 'pending' ? 'info' : 'info';
+
+    await this.log(
+      level,
+      `Blockchain transaction ${txHash} - ${status}`,
+      {
+        tx_hash: txHash,
+        tx_type: txType,
+        tx_status: status,
+        gas_used: gasUsed,
+        ...error,
+      },
+      {
+        context: {
+          service_name: 'currentdao-backend',
+          environment: this.configService.get('NODE_ENV') || 'development',
+          blockchain_tx_hash: txHash,
+          ...context,
+        },
+        tags: ['blockchain', 'transaction', txType, status],
+        parse_immediately: true,
+        alert_immediately: status === 'failed',
+      },
+    );
+  }
+
+  async logSecurityEvent(
+    event: string,
+    severity: 'low' | 'medium' | 'high' | 'critical',
+    details?: any,
+    context?: Partial<LogContext>,
+  ): Promise<void> {
+    const level =
+      severity === 'critical' ? 'error' : severity === 'high' ? 'warn' : 'info';
+
+    await this.log(
+      level,
+      `Security event: ${event}`,
+      {
+        security_event: event,
+        security_severity: severity,
+        ...details,
+      },
+      {
+        context: {
+          service_name: 'currentdao-backend',
+          environment: this.configService.get('NODE_ENV') || 'development',
+          ...context,
+        },
+        tags: ['security', event, severity],
+        parse_immediately: true,
+        alert_immediately: ['high', 'critical'].includes(severity),
+      },
+    );
+  }
+
+  async logPerformanceMetrics(
+    metrics: {
+      response_time?: number;
+      memory_usage?: number;
+      cpu_usage?: number;
+      throughput?: number;
+      error_rate?: number;
+    },
+    context?: Partial<LogContext>,
+  ): Promise<void> {
+    await this.info('Performance metrics collected', metrics, {
+      context: {
+        service_name: 'currentdao-backend',
+        environment: this.configService.get('NODE_ENV') || 'development',
+        ...context,
+      },
+      tags: ['performance', 'metrics'],
+      parse_immediately: true,
+    });
+  }
+
+  // Public API methods for external access
+  async searchLogs(query: any): Promise<any> {
+    return this.elasticsearchService.searchLogs(query);
+  }
+
+  async getLogAggregations(query: any): Promise<any> {
+    return this.elasticsearchService.getLogAggregations(query);
+  }
+
+  async getAlertMetrics(): Promise<any> {
+    return this.logAlertService.getAlertMetrics();
+  }
+
+  async getRetentionMetrics(): Promise<any> {
+    return this.retentionPolicyPolicyService.getRetentionMetrics();
+  }
+
+  async forceFlush(): Promise<void> {
+    await this.flushLogs();
+  }
+
+  getBufferSize(): number {
+    return this.logBuffer.length;
+  }
+
+  async testLogging(): Promise<void> {
+    await this.info(
+      'Test log message',
+      { test: true },
+      {
+        tags: ['test'],
+        parse_immediately: true,
+      },
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/parsing/index.html b/coverage/lcov-report/src/logging/parsing/index.html new file mode 100644 index 0000000..2209d7e --- /dev/null +++ b/coverage/lcov-report/src/logging/parsing/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/logging/parsing + + + + + + + + + +
+
+

All files src/logging/parsing

+
+ +
+ 0% + Statements + 0/580 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/580 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
log-parser.service.ts +
+
0%0/5800%0/10%0/10%0/580
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/parsing/log-parser.service.ts.html b/coverage/lcov-report/src/logging/parsing/log-parser.service.ts.html new file mode 100644 index 0000000..d9a765e --- /dev/null +++ b/coverage/lcov-report/src/logging/parsing/log-parser.service.ts.html @@ -0,0 +1,1825 @@ + + + + + + Code coverage report for src/logging/parsing/log-parser.service.ts + + + + + + + + + +
+
+

All files / src/logging/parsing log-parser.service.ts

+
+ +
+ 0% + Statements + 0/580 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/580 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import {
+  ElasticsearchService,
+  LogEntry,
+} from '../elasticsearch/elasticsearch.service';
+
+export interface ParsedLogEntry extends LogEntry {
+  parsed_fields: {
+    request_id?: string;
+    user_id?: string;
+    session_id?: string;
+    ip_address?: string;
+    user_agent?: string;
+    method?: string;
+    url?: string;
+    status_code?: number;
+    duration?: number;
+    error_type?: string;
+    error_code?: string;
+    component?: string;
+    function?: string;
+    line_number?: number;
+    blockchain_tx_hash?: string;
+    contract_address?: string;
+    gas_used?: number;
+    block_number?: number;
+  };
+  extracted_tags: string[];
+  severity_score: number;
+  categorized_as: string[];
+}
+
+export interface ParseResult {
+  success: boolean;
+  parsed_entry?: ParsedLogEntry;
+  error?: string;
+  processing_time_ms: number;
+}
+
+export interface ParsingMetrics {
+  total_parsed: number;
+  successful_parses: number;
+  failed_parses: number;
+  average_processing_time: number;
+  most_common_patterns: Array<{ pattern: string; count: number }>;
+  error_types: Array<{ error_type: string; count: number }>;
+}
+
+@Injectable()
+export class LogParserService {
+  private readonly logger = new Logger(LogParserService.name);
+  private readonly parsingMetrics: ParsingMetrics = {
+    total_parsed: 0,
+    successful_parses: 0,
+    failed_parses: 0,
+    average_processing_time: 0,
+    most_common_patterns: [],
+    error_types: [],
+  };
+
+  // Regex patterns for different log types
+  private readonly patterns = {
+    // Application logs: [2024-03-29T10:30:45.123Z] INFO [UserService] [req-123] User login successful
+    application: /^\[([^\]]+)\]\s+(\w+)\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+(.+)$/,
+
+    // HTTP access logs: 192.168.1.1 - - [29/Mar/2024:10:30:45 +0000] "GET /api/users HTTP/1.1" 200 1234
+    access:
+      /^(\S+)\s+\S+\s+\S+\s+\[([^\]]+)\]\s+"(\S+)\s+(\S+)\s+[^"]*"\s+(\d+)\s+(\d+)$/,
+
+    // Database logs: [2024-03-29T10:30:45.123Z] [DB] Query executed in 45ms: SELECT * FROM users WHERE id = ?
+    database: /^\[([^\]]+)\]\s+\[DB\]\s+Query executed in (\d+)ms:\s+(.+)$/,
+
+    // Error logs: [2024-03-29T10:30:45.123Z] ERROR [UserService] [req-123] [TypeError] Cannot read property 'id' of undefined at UserService.getUser (user.service.ts:45:12)
+    error:
+      /^\[([^\]]+)\]\s+ERROR\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+(.+)$/,
+
+    // Blockchain logs: [2024-03-29T10:30:45.123Z] [Blockchain] [tx-abc123] Transaction submitted: hash=0x123..., contract=0x456..., gas=21000
+    blockchain:
+      /^\[([^\]]+)\]\s+\[Blockchain\]\s+\[([^\]]+)\]\s+Transaction submitted:\s+hash=([^,]+),\s+contract=([^,]+),\s+gas=(\d+)$/,
+
+    // Performance logs: [2024-03-29T10:30:45.123Z] PERF [API] [req-123] Response time: 150ms, Memory: 45MB, CPU: 25%
+    performance:
+      /^\[([^\]]+)\]\s+PERF\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+Response time:\s+(\d+)ms,\s+Memory:\s+(\d+)MB,\s+CPU:\s+(\d+)%$/,
+
+    // Security logs: [2024-03-29T10:30:45.123Z] SECURITY [Auth] [req-123] Failed login attempt for user@example.com from 192.168.1.1
+    security: /^\[([^\]]+)\]\s+SECURITY\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+(.+)$/,
+  };
+
+  constructor(private readonly elasticsearchService: ElasticsearchService) {
+    this.initializePatterns();
+  }
+
+  private initializePatterns(): void {
+    this.logger.log('Initializing log parser patterns');
+  }
+
+  async parseLogEntry(rawLog: string, context?: any): Promise<ParseResult> {
+    const startTime = Date.now();
+
+    try {
+      this.parsingMetrics.total_parsed++;
+
+      // Try to parse with different patterns
+      let parsedEntry: ParsedLogEntry | null = null;
+
+      // Try JSON parsing first
+      if (this.isJsonString(rawLog)) {
+        parsedEntry = await this.parseJsonLog(rawLog, context);
+      } else {
+        // Try regex patterns
+        parsedEntry = await this.parseWithPatterns(rawLog, context);
+      }
+
+      if (parsedEntry) {
+        // Enhance with extracted information
+        parsedEntry = await this.enhanceParsedEntry(parsedEntry, rawLog);
+
+        // Calculate severity score
+        parsedEntry.severity_score = this.calculateSeverityScore(parsedEntry);
+
+        // Categorize the log
+        parsedEntry.categorized_as = this.categorizeLog(parsedEntry);
+
+        this.parsingMetrics.successful_parses++;
+
+        const processingTime = Date.now() - startTime;
+        this.updateProcessingTimeMetrics(processingTime);
+
+        return {
+          success: true,
+          parsed_entry: parsedEntry,
+          processing_time_ms: processingTime,
+        };
+      } else {
+        // Fallback parsing
+        parsedEntry = this.createFallbackEntry(rawLog, context);
+
+        this.parsingMetrics.successful_parses++;
+
+        const processingTime = Date.now() - startTime;
+        this.updateProcessingTimeMetrics(processingTime);
+
+        return {
+          success: true,
+          parsed_entry: parsedEntry,
+          processing_time_ms: processingTime,
+        };
+      }
+    } catch (error) {
+      this.parsingMetrics.failed_parses++;
+
+      const processingTime = Date.now() - startTime;
+      this.updateProcessingTimeMetrics(processingTime);
+
+      this.logger.error('Failed to parse log entry', error);
+
+      return {
+        success: false,
+        error: error.message,
+        processing_time_ms: processingTime,
+      };
+    }
+  }
+
+  private async parseJsonLog(
+    rawLog: string,
+    context?: any,
+  ): Promise<ParsedLogEntry | null> {
+    try {
+      const jsonData = JSON.parse(rawLog);
+
+      const parsedEntry: ParsedLogEntry = {
+        timestamp: new Date(jsonData.timestamp || Date.now()),
+        level: jsonData.level || 'info',
+        message: jsonData.message || rawLog,
+        service_name:
+          jsonData.service_name || context?.service_name || 'unknown',
+        environment:
+          jsonData.environment || context?.environment || 'development',
+        parsed_fields: {},
+        extracted_tags: [],
+        severity_score: 0,
+        categorized_as: [],
+      };
+
+      // Extract structured fields
+      if (jsonData.request) {
+        parsedEntry.parsed_fields.request_id = jsonData.request.id;
+        parsedEntry.parsed_fields.user_id = jsonData.request.user_id;
+        parsedEntry.parsed_fields.method = jsonData.request.method;
+        parsedEntry.parsed_fields.url = jsonData.request.url;
+        parsedEntry.parsed_fields.ip_address = jsonData.request.ip;
+        parsedEntry.parsed_fields.user_agent = jsonData.request.user_agent;
+        parsedEntry.parsed_fields.status_code = jsonData.request.status_code;
+        parsedEntry.parsed_fields.duration = jsonData.request.duration;
+      }
+
+      if (jsonData.error) {
+        parsedEntry.parsed_fields.error_type = jsonData.error.type;
+        parsedEntry.parsed_fields.error_code = jsonData.error.code;
+        parsedEntry.error_name = jsonData.error.name;
+        parsedEntry.error_message = jsonData.error.message;
+        parsedEntry.parsed_fields.component = jsonData.error.component;
+        parsedEntry.parsed_fields.function = jsonData.error.function;
+        parsedEntry.parsed_fields.line_number = jsonData.error.line_number;
+      }
+
+      if (jsonData.blockchain) {
+        parsedEntry.parsed_fields.blockchain_tx_hash =
+          jsonData.blockchain.tx_hash;
+        parsedEntry.parsed_fields.contract_address =
+          jsonData.blockchain.contract_address;
+        parsedEntry.parsed_fields.gas_used = jsonData.blockchain.gas_used;
+        parsedEntry.parsed_fields.block_number =
+          jsonData.blockchain.block_number;
+        parsedEntry.tx_hash = jsonData.blockchain.tx_hash;
+        parsedEntry.tx_type = jsonData.blockchain.tx_type;
+        parsedEntry.tx_status = jsonData.blockchain.tx_status;
+      }
+
+      if (jsonData.performance) {
+        parsedEntry.parsed_fields.duration = jsonData.performance.response_time;
+        parsedEntry.response_time = jsonData.performance.response_time;
+        parsedEntry.memory_usage = jsonData.performance.memory_usage;
+        parsedEntry.cpu_usage = jsonData.performance.cpu_usage;
+      }
+
+      // Extract tags
+      parsedEntry.extracted_tags = this.extractTagsFromJson(jsonData);
+
+      return parsedEntry;
+    } catch (error) {
+      return null;
+    }
+  }
+
+  private async parseWithPatterns(
+    rawLog: string,
+    context?: any,
+  ): Promise<ParsedLogEntry | null> {
+    const patterns = [
+      { type: 'error', pattern: this.patterns.error },
+      { type: 'blockchain', pattern: this.patterns.blockchain },
+      { type: 'performance', pattern: this.patterns.performance },
+      { type: 'security', pattern: this.patterns.security },
+      { type: 'database', pattern: this.patterns.database },
+      { type: 'access', pattern: this.patterns.access },
+      { type: 'application', pattern: this.patterns.application },
+    ];
+
+    for (const { type, pattern } of patterns) {
+      const match = rawLog.match(pattern);
+      if (match) {
+        return this.parseByPattern(type, match, rawLog, context);
+      }
+    }
+
+    return null;
+  }
+
+  private parseByPattern(
+    patternType: string,
+    match: RegExpMatchArray,
+    rawLog: string,
+    context?: any,
+  ): ParsedLogEntry {
+    const baseEntry: ParsedLogEntry = {
+      timestamp: new Date(match[1] || Date.now()),
+      level: 'info',
+      message: match[match.length - 1] || rawLog,
+      service_name: context?.service_name || 'unknown',
+      environment: context?.environment || 'development',
+      parsed_fields: {},
+      extracted_tags: [],
+      severity_score: 0,
+      categorized_as: [],
+    };
+
+    switch (patternType) {
+      case 'error':
+        baseEntry.level = 'error';
+        baseEntry.parsed_fields.component = match[2];
+        baseEntry.parsed_fields.request_id = match[3];
+        baseEntry.parsed_fields.error_type = match[4];
+        baseEntry.error_name = match[4];
+        baseEntry.error_message = match[5];
+        break;
+
+      case 'blockchain':
+        baseEntry.level = 'info';
+        baseEntry.parsed_fields.blockchain_tx_hash = match[2];
+        baseEntry.parsed_fields.contract_address = match[3];
+        baseEntry.parsed_fields.gas_used = parseInt(match[4]);
+        baseEntry.tx_hash = match[2];
+        break;
+
+      case 'performance':
+        baseEntry.level = 'info';
+        baseEntry.parsed_fields.component = match[2];
+        baseEntry.parsed_fields.request_id = match[3];
+        baseEntry.parsed_fields.duration = parseInt(match[4]);
+        baseEntry.response_time = parseInt(match[4]);
+        baseEntry.memory_usage = parseInt(match[5]);
+        baseEntry.cpu_usage = parseInt(match[6]);
+        break;
+
+      case 'security':
+        baseEntry.level = 'warn';
+        baseEntry.parsed_fields.component = match[2];
+        baseEntry.parsed_fields.request_id = match[3];
+        break;
+
+      case 'database':
+        baseEntry.level = 'info';
+        baseEntry.parsed_fields.duration = parseInt(match[2]);
+        break;
+
+      case 'access':
+        baseEntry.level = 'info';
+        baseEntry.parsed_fields.ip_address = match[1];
+        baseEntry.parsed_fields.method = match[3];
+        baseEntry.parsed_fields.url = match[4];
+        baseEntry.parsed_fields.status_code = parseInt(match[5]);
+        break;
+
+      case 'application':
+        baseEntry.level = match[2].toLowerCase();
+        baseEntry.parsed_fields.component = match[3];
+        baseEntry.parsed_fields.request_id = match[4];
+        break;
+    }
+
+    return baseEntry;
+  }
+
+  private async enhanceParsedEntry(
+    entry: ParsedLogEntry,
+    rawLog: string,
+  ): Promise<ParsedLogEntry> {
+    // Extract IP addresses
+    const ipMatches = rawLog.match(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g);
+    if (ipMatches) {
+      entry.parsed_fields.ip_address = ipMatches[0];
+    }
+
+    // Extract user agents
+    const userAgentMatches = rawLog.match(/User-Agent:\s*([^\s]+)/i);
+    if (userAgentMatches) {
+      entry.parsed_fields.user_agent = userAgentMatches[1];
+    }
+
+    // Extract session IDs
+    const sessionMatches = rawLog.match(
+      /session[_\s-]?id[:\s=]+([a-zA-Z0-9-]+)/i,
+    );
+    if (sessionMatches) {
+      entry.parsed_fields.session_id = sessionMatches[1];
+    }
+
+    // Extract user IDs
+    const userMatches = rawLog.match(/user[_\s-]?id[:\s=]+([a-zA-Z0-9-]+)/i);
+    if (userMatches) {
+      entry.parsed_fields.user_id = userMatches[1];
+    }
+
+    // Extract additional tags
+    entry.extracted_tags = this.extractTagsFromText(rawLog);
+
+    return entry;
+  }
+
+  private calculateSeverityScore(entry: ParsedLogEntry): number {
+    let score = 0;
+
+    // Base score by level
+    switch (entry.level.toLowerCase()) {
+      case 'error':
+        score += 80;
+        break;
+      case 'warn':
+      case 'warning':
+        score += 60;
+        break;
+      case 'info':
+        score += 40;
+        break;
+      case 'debug':
+        score += 20;
+        break;
+      default:
+        score += 30;
+    }
+
+    // Add score for error types
+    if (entry.parsed_fields.error_type) {
+      score += 20;
+    }
+
+    // Add score for security events
+    if (entry.categorized_as.includes('security')) {
+      score += 30;
+    }
+
+    // Add score for blockchain failures
+    if (entry.tx_status === 'failed') {
+      score += 25;
+    }
+
+    // Add score for slow requests
+    if (entry.response_time && entry.response_time > 5000) {
+      score += 15;
+    }
+
+    // Add score for high memory usage
+    if (entry.memory_usage && entry.memory_usage > 500) {
+      score += 10;
+    }
+
+    return Math.min(100, score);
+  }
+
+  private categorizeLog(entry: ParsedLogEntry): string[] {
+    const categories: string[] = [];
+
+    // Level-based categorization
+    if (entry.level === 'error') {
+      categories.push('error', 'issue');
+    }
+    if (entry.level === 'warn') {
+      categories.push('warning', 'attention');
+    }
+
+    // Component-based categorization
+    if (entry.parsed_fields.component) {
+      const component = entry.parsed_fields.component.toLowerCase();
+      if (component.includes('auth')) categories.push('authentication');
+      if (component.includes('user')) categories.push('user-management');
+      if (component.includes('payment')) categories.push('payment');
+      if (component.includes('blockchain')) categories.push('blockchain');
+      if (component.includes('api')) categories.push('api');
+    }
+
+    // Message-based categorization
+    const message = entry.message.toLowerCase();
+    if (message.includes('login') || message.includes('auth'))
+      categories.push('authentication');
+    if (message.includes('transaction') || message.includes('tx'))
+      categories.push('transaction');
+    if (message.includes('contract')) categories.push('smart-contract');
+    if (message.includes('error') || message.includes('exception'))
+      categories.push('error');
+    if (message.includes('security') || message.includes('unauthorized'))
+      categories.push('security');
+    if (message.includes('performance') || message.includes('slow'))
+      categories.push('performance');
+    if (message.includes('database') || message.includes('sql'))
+      categories.push('database');
+
+    // Request-based categorization
+    if (entry.parsed_fields.method) {
+      categories.push('http-request');
+    }
+    if (entry.parsed_fields.ip_address) {
+      categories.push('network');
+    }
+
+    // Blockchain-specific categorization
+    if (entry.tx_hash) {
+      categories.push('blockchain', 'transaction');
+    }
+    if (entry.parsed_fields.contract_address) {
+      categories.push('smart-contract');
+    }
+
+    return categories.length > 0 ? categories : ['general'];
+  }
+
+  private extractTagsFromJson(jsonData: any): string[] {
+    const tags: string[] = [];
+
+    if (jsonData.tags && Array.isArray(jsonData.tags)) {
+      tags.push(...jsonData.tags);
+    }
+
+    // Extract common fields as tags
+    if (jsonData.service_name) tags.push(`service:${jsonData.service_name}`);
+    if (jsonData.environment) tags.push(`env:${jsonData.environment}`);
+    if (jsonData.level) tags.push(`level:${jsonData.level}`);
+    if (jsonData.component) tags.push(`component:${jsonData.component}`);
+
+    return tags;
+  }
+
+  private extractTagsFromText(text: string): string[] {
+    const tags: string[] = [];
+
+    // Extract common patterns
+    if (text.includes('error')) tags.push('error');
+    if (text.includes('warning')) tags.push('warning');
+    if (text.includes('security')) tags.push('security');
+    if (text.includes('performance')) tags.push('performance');
+    if (text.includes('database')) tags.push('database');
+    if (text.includes('blockchain')) tags.push('blockchain');
+    if (text.includes('transaction')) tags.push('transaction');
+
+    return tags;
+  }
+
+  private createFallbackEntry(rawLog: string, context?: any): ParsedLogEntry {
+    return {
+      timestamp: new Date(),
+      level: 'info',
+      message: rawLog,
+      service_name: context?.service_name || 'unknown',
+      environment: context?.environment || 'development',
+      parsed_fields: {},
+      extracted_tags: ['unparsed'],
+      severity_score: 30,
+      categorized_as: ['general'],
+    };
+  }
+
+  private isJsonString(str: string): boolean {
+    try {
+      JSON.parse(str);
+      return true;
+    } catch {
+      return false;
+    }
+  }
+
+  private updateProcessingTimeMetrics(processingTime: number): void {
+    const currentAvg = this.parsingMetrics.average_processing_time;
+    const totalProcessed =
+      this.parsingMetrics.successful_parses + this.parsingMetrics.failed_parses;
+
+    this.parsingMetrics.average_processing_time =
+      (currentAvg * (totalProcessed - 1) + processingTime) / totalProcessed;
+  }
+
+  // Public API methods
+  async parseBatchLogs(
+    rawLogs: string[],
+    context?: any,
+  ): Promise<ParseResult[]> {
+    const results: ParseResult[] = [];
+
+    for (const rawLog of rawLogs) {
+      const result = await this.parseLogEntry(rawLog, context);
+      results.push(result);
+    }
+
+    return results;
+  }
+
+  getParsingMetrics(): ParsingMetrics {
+    return { ...this.parsingMetrics };
+  }
+
+  resetMetrics(): void {
+    this.parsingMetrics.total_parsed = 0;
+    this.parsingMetrics.successful_parses = 0;
+    this.parsingMetrics.failed_parses = 0;
+    this.parsingMetrics.average_processing_time = 0;
+    this.parsingMetrics.most_common_patterns = [];
+    this.parsingMetrics.error_types = [];
+  }
+
+  addCustomPattern(name: string, pattern: RegExp): void {
+    this.patterns[name] = pattern;
+  }
+
+  removeCustomPattern(name: string): void {
+    delete this.patterns[name];
+  }
+
+  getAvailablePatterns(): string[] {
+    return Object.keys(this.patterns);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/retention/index.html b/coverage/lcov-report/src/logging/retention/index.html new file mode 100644 index 0000000..68b5b31 --- /dev/null +++ b/coverage/lcov-report/src/logging/retention/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/logging/retention + + + + + + + + + +
+
+

All files src/logging/retention

+
+ +
+ 0% + Statements + 0/775 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/775 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
retention-policy.service.ts +
+
0%0/7750%0/10%0/10%0/775
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/logging/retention/retention-policy.service.ts.html b/coverage/lcov-report/src/logging/retention/retention-policy.service.ts.html new file mode 100644 index 0000000..e23bddb --- /dev/null +++ b/coverage/lcov-report/src/logging/retention/retention-policy.service.ts.html @@ -0,0 +1,2410 @@ + + + + + + Code coverage report for src/logging/retention/retention-policy.service.ts + + + + + + + + + +
+
+

All files / src/logging/retention retention-policy.service.ts

+
+ +
+ 0% + Statements + 0/775 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/775 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { ElasticsearchService } from '../elasticsearch/elasticsearch.service';
+
+export interface RetentionPolicy {
+  name: string;
+  pattern: string;
+  hot_phase_days: number;
+  warm_phase_days: number;
+  cold_phase_days: number;
+  delete_phase_days: number;
+  max_size_gb?: number;
+  max_docs?: number;
+  conditions?: RetentionCondition[];
+}
+
+export interface RetentionCondition {
+  field: string;
+  operator: 'gt' | 'lt' | 'eq' | 'ne' | 'exists' | 'not_exists';
+  value?: any;
+  action: 'delete' | 'archive' | 'compress';
+}
+
+export interface RetentionPolicyResult {
+  policy_name: string;
+  indices_processed: number;
+  documents_deleted: number;
+  space_freed_mb: number;
+  processing_time_ms: number;
+  errors: string[];
+}
+
+export interface RetentionMetrics {
+  total_indices: number;
+  total_documents: number;
+  total_storage_gb: number;
+  indices_by_phase: Record<string, number>;
+  storage_by_phase: Record<string, number>;
+  oldest_index: string;
+  newest_index: string;
+  policies_active: number;
+  next_cleanup_time: Date;
+}
+
+export interface StorageForecast {
+  current_storage_gb: number;
+  projected_30_days: number;
+  projected_90_days: number;
+  growth_rate_percent: number;
+  recommended_retention_days: number;
+  cost_impact: number;
+}
+
+@Injectable()
+export class RetentionPolicyService implements OnModuleInit {
+  private readonly logger = new Logger(RetentionPolicyService.name);
+  private readonly defaultPolicies: RetentionPolicy[] = [];
+  private retentionMetrics: RetentionMetrics;
+
+  constructor(
+    private readonly configService: ConfigService,
+    private readonly elasticsearchService: ElasticsearchService,
+  ) {
+    this.initializeDefaultPolicies();
+  }
+
+  async onModuleInit() {
+    this.logger.log('Initializing retention policy service');
+
+    // Create default retention policies
+    await this.createDefaultPolicies();
+
+    // Initialize metrics
+    await this.updateRetentionMetrics();
+
+    this.logger.log('Retention policy service initialized');
+  }
+
+  private initializeDefaultPolicies(): void {
+    this.defaultPolicies = [
+      {
+        name: 'application-logs-policy',
+        pattern: 'currentdao-logs-*',
+        hot_phase_days: 7,
+        warm_phase_days: 23,
+        cold_phase_days: 60,
+        delete_phase_days: 90,
+        max_size_gb: 50,
+        max_docs: 10000000,
+        conditions: [
+          {
+            field: 'level',
+            operator: 'eq',
+            value: 'error',
+            action: 'archive',
+          },
+        ],
+      },
+      {
+        name: 'security-logs-policy',
+        pattern: 'currentdao-security-*',
+        hot_phase_days: 30,
+        warm_phase_days: 60,
+        cold_phase_days: 180,
+        delete_phase_days: 365,
+        max_size_gb: 20,
+        max_docs: 5000000,
+      },
+      {
+        name: 'audit-logs-policy',
+        pattern: 'currentdao-audit-*',
+        hot_phase_days: 90,
+        warm_phase_days: 180,
+        cold_phase_days: 365,
+        delete_phase_days: 2555, // 7 years
+        max_size_gb: 100,
+        max_docs: 50000000,
+      },
+      {
+        name: 'performance-logs-policy',
+        pattern: 'currentdao-perf-*',
+        hot_phase_days: 3,
+        warm_phase_days: 7,
+        cold_phase_days: 14,
+        delete_phase_days: 30,
+        max_size_gb: 10,
+        max_docs: 2000000,
+      },
+    ];
+  }
+
+  private async createDefaultPolicies(): Promise<void> {
+    for (const policy of this.defaultPolicies) {
+      try {
+        await this.createRetentionPolicy(policy);
+      } catch (error) {
+        this.logger.error(
+          `Failed to create retention policy ${policy.name}`,
+          error,
+        );
+      }
+    }
+  }
+
+  async createRetentionPolicy(policy: RetentionPolicy): Promise<void> {
+    try {
+      const ilmPolicy = {
+        policy: {
+          phases: {
+            hot: {
+              actions: {
+                rollover: {
+                  max_size: `${policy.max_size_gb || 10}gb`,
+                  max_age: `${policy.hot_phase_days}d`,
+                  max_docs: policy.max_docs || 1000000,
+                },
+                set_priority: { priority: 100 },
+              },
+            },
+            warm: {
+              min_age: `${policy.hot_phase_days}d`,
+              actions: {
+                set_priority: { priority: 50 },
+                forcemerge: { max_num_segments: 1 },
+              },
+            },
+            cold: {
+              min_age: `${policy.hot_phase_days + policy.warm_phase_days}d`,
+              actions: {
+                set_priority: { priority: 0 },
+              },
+            },
+            delete: {
+              min_age: `${policy.hot_phase_days + policy.warm_phase_days + policy.cold_phase_days}d`,
+            },
+          },
+        },
+      };
+
+      await this.elasticsearchService.getClient().ilm.lifecycle.put({
+        policy: policy.name,
+        policy: ilmPolicy.policy,
+      });
+
+      this.logger.log(`Retention policy ${policy.name} created successfully`);
+    } catch (error) {
+      this.logger.error(
+        `Failed to create retention policy ${policy.name}`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  async applyRetentionPolicy(
+    policyName: string,
+  ): Promise<RetentionPolicyResult> {
+    const startTime = Date.now();
+    const result: RetentionPolicyResult = {
+      policy_name: policyName,
+      indices_processed: 0,
+      documents_deleted: 0,
+      space_freed_mb: 0,
+      processing_time_ms: 0,
+      errors: [],
+    };
+
+    try {
+      // Get policy details
+      const policy = await this.getRetentionPolicy(policyName);
+      if (!policy) {
+        throw new Error(`Policy ${policyName} not found`);
+      }
+
+      // Get indices matching the policy pattern
+      const indices = await this.getIndicesByPattern(policy.pattern);
+
+      for (const index of indices) {
+        try {
+          const indexResult = await this.processIndex(index, policy);
+          result.indices_processed++;
+          result.documents_deleted += indexResult.documents_deleted;
+          result.space_freed_mb += indexResult.space_freed_mb;
+        } catch (error) {
+          result.errors.push(
+            `Failed to process index ${index}: ${error.message}`,
+          );
+        }
+      }
+
+      result.processing_time_ms = Date.now() - startTime;
+
+      this.logger.log(
+        `Retention policy ${policyName} applied successfully`,
+        result,
+      );
+      return result;
+    } catch (error) {
+      result.processing_time_ms = Date.now() - startTime;
+      result.errors.push(error.message);
+
+      this.logger.error(
+        `Failed to apply retention policy ${policyName}`,
+        error,
+      );
+      return result;
+    }
+  }
+
+  private async processIndex(
+    indexName: string,
+    policy: RetentionPolicy,
+  ): Promise<{ documents_deleted: number; space_freed_mb: number }> {
+    const startTime = Date.now();
+    let documentsDeleted = 0;
+    let spaceFreedMb = 0;
+
+    try {
+      // Get index stats before processing
+      const statsBefore = await this.getIndexStats(indexName);
+
+      // Apply retention conditions
+      if (policy.conditions) {
+        for (const condition of policy.conditions) {
+          const deletionResult = await this.applyCondition(
+            indexName,
+            condition,
+          );
+          documentsDeleted += deletionResult.documents_deleted;
+        }
+      }
+
+      // Check if index should be deleted based on age
+      const indexAge = await this.getIndexAge(indexName);
+      const maxAge =
+        policy.hot_phase_days +
+        policy.warm_phase_days +
+        policy.cold_phase_days +
+        policy.delete_phase_days;
+
+      if (indexAge > maxAge) {
+        await this.deleteIndex(indexName);
+        documentsDeleted += statsBefore.doc_count;
+        spaceFreedMb = this.convertBytesToMB(statsBefore.store_size);
+      } else {
+        // Optimize index if it's in warm or cold phase
+        if (indexAge > policy.hot_phase_days) {
+          await this.optimizeIndex(indexName);
+        }
+      }
+
+      return {
+        documents_deleted: documentsDeleted,
+        space_freed_mb: spaceFreedMb,
+      };
+    } catch (error) {
+      this.logger.error(`Failed to process index ${indexName}`, error);
+      throw error;
+    }
+  }
+
+  private async applyCondition(
+    indexName: string,
+    condition: RetentionCondition,
+  ): Promise<{ documents_deleted: number }> {
+    try {
+      let query: any = {};
+
+      switch (condition.operator) {
+        case 'eq':
+          query = { term: { [condition.field]: condition.value } };
+          break;
+        case 'ne':
+          query = {
+            bool: {
+              must_not: { term: { [condition.field]: condition.value } },
+            },
+          };
+          break;
+        case 'gt':
+          query = { range: { [condition.field]: { gt: condition.value } } };
+          break;
+        case 'lt':
+          query = { range: { [condition.field]: { lt: condition.value } } };
+          break;
+        case 'exists':
+          query = { exists: { field: condition.field } };
+          break;
+        case 'not_exists':
+          query = {
+            bool: { must_not: { exists: { field: condition.field } } },
+          };
+          break;
+      }
+
+      if (condition.action === 'delete') {
+        const deleteResult = await this.deleteByQuery(indexName, query);
+        return { documents_deleted: deleteResult.deleted };
+      } else if (condition.action === 'archive') {
+        // Move to archive index
+        await this.archiveDocuments(indexName, query);
+        return { documents_deleted: 0 }; // Archived, not deleted
+      } else if (condition.action === 'compress') {
+        // Compress documents (implementation depends on your setup)
+        await this.compressDocuments(indexName, query);
+        return { documents_deleted: 0 };
+      }
+
+      return { documents_deleted: 0 };
+    } catch (error) {
+      this.logger.error(
+        `Failed to apply condition on index ${indexName}`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  private async deleteByQuery(
+    indexName: string,
+    query: any,
+  ): Promise<{ deleted: number }> {
+    const response = await this.elasticsearchService.getClient().deleteByQuery({
+      index: indexName,
+      body: { query },
+      refresh: true,
+    });
+
+    return { deleted: response.deleted || 0 };
+  }
+
+  private async archiveDocuments(indexName: string, query: any): Promise<void> {
+    // Create archive index name
+    const archiveIndex = `${indexName}-archive-${new Date().toISOString().split('T')[0]}`;
+
+    // Reindex documents to archive index
+    await this.elasticsearchService.getClient().reindex({
+      body: {
+        source: { index: indexName, query },
+        dest: { index: archiveIndex },
+      },
+    });
+
+    // Delete from original index
+    await this.deleteByQuery(indexName, query);
+  }
+
+  private async compressDocuments(
+    indexName: string,
+    query: any,
+  ): Promise<void> {
+    // Force merge to reduce segments
+    await this.elasticsearchService.getClient().indices.forcemerge({
+      index: indexName,
+      max_num_segments: 1,
+    });
+  }
+
+  private async getIndicesByPattern(pattern: string): Promise<string[]> {
+    try {
+      const response = await this.elasticsearchService.getClient().cat.indices({
+        index: pattern,
+        format: 'json',
+      });
+
+      return response.map((index: any) => index.index);
+    } catch (error) {
+      this.logger.error(`Failed to get indices for pattern ${pattern}`, error);
+      return [];
+    }
+  }
+
+  private async getIndexStats(indexName: string): Promise<any> {
+    try {
+      const response = await this.elasticsearchService
+        .getClient()
+        .indices.stats({
+          index: indexName,
+        });
+
+      return response.indices[indexName];
+    } catch (error) {
+      this.logger.error(`Failed to get stats for index ${indexName}`, error);
+      return { doc_count: 0, store_size: '0b' };
+    }
+  }
+
+  private async getIndexAge(indexName: string): Promise<number> {
+    try {
+      const response = await this.elasticsearchService
+        .getClient()
+        .indices.getSettings({
+          index: indexName,
+        });
+
+      const creationDate = response[indexName].settings.index.creation_date;
+      const now = Date.now();
+
+      return Math.floor((now - creationDate) / (1000 * 60 * 60 * 24)); // days
+    } catch (error) {
+      this.logger.error(`Failed to get age for index ${indexName}`, error);
+      return 0;
+    }
+  }
+
+  private async deleteIndex(indexName: string): Promise<void> {
+    try {
+      await this.elasticsearchService.getClient().indices.delete({
+        index: indexName,
+      });
+
+      this.logger.log(`Index ${indexName} deleted successfully`);
+    } catch (error) {
+      this.logger.error(`Failed to delete index ${indexName}`, error);
+      throw error;
+    }
+  }
+
+  private async optimizeIndex(indexName: string): Promise<void> {
+    try {
+      await this.elasticsearchService.getClient().indices.forcemerge({
+        index: indexName,
+        max_num_segments: 1,
+      });
+
+      this.logger.log(`Index ${indexName} optimized successfully`);
+    } catch (error) {
+      this.logger.error(`Failed to optimize index ${indexName}`, error);
+      throw error;
+    }
+  }
+
+  private convertBytesToMB(bytes: string): number {
+    const value = parseFloat(bytes.replace(/[^\d.]/g, ''));
+    const unit = bytes.replace(/[\d.]/g, '').toLowerCase();
+
+    switch (unit) {
+      case 'kb':
+        return value / 1024;
+      case 'mb':
+        return value;
+      case 'gb':
+        return value * 1024;
+      case 'tb':
+        return value * 1024 * 1024;
+      case 'b':
+      default:
+        return value / (1024 * 1024);
+    }
+  }
+
+  async getRetentionPolicy(
+    policyName: string,
+  ): Promise<RetentionPolicy | null> {
+    try {
+      const response = await this.elasticsearchService
+        .getClient()
+        .ilm.lifecycle.get({
+          policy: policyName,
+        });
+
+      if (response[policyName]) {
+        return this.parseILMPolicyToRetentionPolicy(
+          policyName,
+          response[policyName],
+        );
+      }
+
+      return null;
+    } catch (error) {
+      this.logger.error(`Failed to get retention policy ${policyName}`, error);
+      return null;
+    }
+  }
+
+  private parseILMPolicyToRetentionPolicy(
+    policyName: string,
+    ilmPolicy: any,
+  ): RetentionPolicy {
+    const phases = ilmPolicy.policy.phases;
+
+    return {
+      name: policyName,
+      pattern: '', // Not stored in ILM policy
+      hot_phase_days: this.extractDaysFromPhase(phases.hot),
+      warm_phase_days: this.extractDaysFromPhase(phases.warm),
+      cold_phase_days: this.extractDaysFromPhase(phases.cold),
+      delete_phase_days: this.extractDaysFromPhase(phases.delete),
+    };
+  }
+
+  private extractDaysFromPhase(phase: any): number {
+    if (!phase || !phase.min_age) return 0;
+
+    const ageStr = phase.min_age;
+    const match = ageStr.match(/(\d+)d/);
+    return match ? parseInt(match[1]) : 0;
+  }
+
+  async getAllRetentionPolicies(): Promise<RetentionPolicy[]> {
+    const policies: RetentionPolicy[] = [];
+
+    for (const defaultPolicy of this.defaultPolicies) {
+      const policy = await this.getRetentionPolicy(defaultPolicy.name);
+      if (policy) {
+        policies.push(policy);
+      }
+    }
+
+    return policies;
+  }
+
+  async updateRetentionMetrics(): Promise<void> {
+    try {
+      const indices = await this.elasticsearchService.getIndexMetrics();
+
+      let totalDocuments = 0;
+      let totalStorageGB = 0;
+      const indicesByPhase: Record<string, number> = {};
+      const storageByPhase: Record<string, number> = {};
+
+      let oldestIndex = '';
+      let newestIndex = '';
+      let oldestDate = new Date();
+      let newestDate = new Date(0);
+
+      for (const index of indices) {
+        totalDocuments += index.doc_count;
+        totalStorageGB += this.convertBytesToGB(index.store_size);
+
+        // Determine phase based on index name pattern
+        const phase = this.determineIndexPhase(index.index_name);
+        indicesByPhase[phase] = (indicesByPhase[phase] || 0) + 1;
+        storageByPhase[phase] =
+          (storageByPhase[phase] || 0) +
+          this.convertBytesToGB(index.store_size);
+
+        // Track oldest and newest indices
+        const indexDate = this.extractDateFromIndexName(index.index_name);
+        if (indexDate < oldestDate) {
+          oldestDate = indexDate;
+          oldestIndex = index.index_name;
+        }
+        if (indexDate > newestDate) {
+          newestDate = indexDate;
+          newestIndex = index.index_name;
+        }
+      }
+
+      this.retentionMetrics = {
+        total_indices: indices.length,
+        total_documents: totalDocuments,
+        total_storage_gb: totalStorageGB,
+        indices_by_phase: indicesByPhase,
+        storage_by_phase: storageByPhase,
+        oldest_index: oldestIndex,
+        newest_index: newestIndex,
+        policies_active: this.defaultPolicies.length,
+        next_cleanup_time: this.getNextCleanupTime(),
+      };
+    } catch (error) {
+      this.logger.error('Failed to update retention metrics', error);
+    }
+  }
+
+  private determineIndexPhase(indexName: string): string {
+    // Simple heuristic based on index name patterns
+    if (indexName.includes('hot')) return 'hot';
+    if (indexName.includes('warm')) return 'warm';
+    if (indexName.includes('cold')) return 'cold';
+    return 'unknown';
+  }
+
+  private extractDateFromIndexName(indexName: string): Date {
+    // Extract date from index name like "currentdao-logs-2024-03-29"
+    const match = indexName.match(/(\d{4}-\d{2}-\d{2})/);
+    return match ? new Date(match[1]) : new Date();
+  }
+
+  private convertBytesToGB(bytes: string): number {
+    return this.convertBytesToMB(bytes) / 1024;
+  }
+
+  private getNextCleanupTime(): Date {
+    const now = new Date();
+    const nextCleanup = new Date(now);
+    nextCleanup.setHours(nextCleanup.getHours() + 1);
+    nextCleanup.setMinutes(0);
+    nextCleanup.setSeconds(0);
+    return nextCleanup;
+  }
+
+  async getStorageForecast(): Promise<StorageForecast> {
+    try {
+      const currentMetrics = await this.getRetentionMetrics();
+
+      // Get historical data for growth calculation
+      const growthRate = await this.calculateGrowthRate();
+
+      const currentStorage = currentMetrics.total_storage_gb;
+      const projected30Days = currentStorage * (1 + (growthRate / 100) * 30);
+      const projected90Days = currentStorage * (1 + (growthRate / 100) * 90);
+
+      // Calculate recommended retention days based on storage constraints
+      const maxStorageGB = this.configService.get('MAX_LOG_STORAGE_GB') || 1000;
+      const recommendedRetentionDays = Math.floor(
+        (maxStorageGB / currentStorage) * 90,
+      );
+
+      // Calculate cost impact (simplified)
+      const costPerGB = this.configService.get('STORAGE_COST_PER_GB') || 0.023; // AWS approximate
+      const costImpact = (projected90Days - currentStorage) * costPerGB;
+
+      return {
+        current_storage_gb: currentStorage,
+        projected_30_days: projected30Days,
+        projected_90_days: projected90Days,
+        growth_rate_percent: growthRate,
+        recommended_retention_days: Math.max(
+          30,
+          Math.min(365, recommendedRetentionDays),
+        ),
+        cost_impact: costImpact,
+      };
+    } catch (error) {
+      this.logger.error('Failed to generate storage forecast', error);
+      throw error;
+    }
+  }
+
+  private async calculateGrowthRate(): Promise<number> {
+    try {
+      // Get storage data for the last 7 days
+      const sevenDaysAgo = new Date();
+      sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
+
+      const indices = await this.getIndicesByPattern('currentdao-logs-*');
+      const recentIndices = indices.filter((index) => {
+        const indexDate = this.extractDateFromIndexName(index);
+        return indexDate >= sevenDaysAgo;
+      });
+
+      if (recentIndices.length < 2) {
+        return 5; // Default 5% growth rate
+      }
+
+      // Calculate growth based on recent indices
+      const storageData = await Promise.all(
+        recentIndices.map(async (index) => {
+          const stats = await this.getIndexStats(index);
+          return this.convertBytesToGB(stats.store_size);
+        }),
+      );
+
+      const oldestStorage = storageData[0];
+      const newestStorage = storageData[storageData.length - 1];
+
+      if (oldestStorage === 0) return 5;
+
+      const growthRate =
+        ((newestStorage - oldestStorage) / oldestStorage) * 100;
+      return Math.max(0, growthRate);
+    } catch (error) {
+      this.logger.error('Failed to calculate growth rate', error);
+      return 5; // Default 5% growth rate
+    }
+  }
+
+  // Scheduled cleanup operations
+  @Cron(CronExpression.EVERY_HOUR)
+  async scheduledCleanup(): Promise<void> {
+    this.logger.log('Starting scheduled retention cleanup');
+
+    try {
+      const policies = await this.getAllRetentionPolicies();
+
+      for (const policy of policies) {
+        try {
+          await this.applyRetentionPolicy(policy.name);
+        } catch (error) {
+          this.logger.error(
+            `Failed to apply policy ${policy.name} in scheduled cleanup`,
+            error,
+          );
+        }
+      }
+
+      // Update metrics after cleanup
+      await this.updateRetentionMetrics();
+
+      this.logger.log('Scheduled retention cleanup completed');
+    } catch (error) {
+      this.logger.error('Scheduled retention cleanup failed', error);
+    }
+  }
+
+  // Public API methods
+  async getRetentionMetrics(): Promise<RetentionMetrics> {
+    return this.retentionMetrics;
+  }
+
+  async deleteRetentionPolicy(policyName: string): Promise<void> {
+    try {
+      await this.elasticsearchService.getClient().ilm.lifecycle.delete({
+        policy: policyName,
+      });
+
+      this.logger.log(`Retention policy ${policyName} deleted successfully`);
+    } catch (error) {
+      this.logger.error(
+        `Failed to delete retention policy ${policyName}`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  async forceCleanup(policyName?: string): Promise<RetentionPolicyResult[]> {
+    const results: RetentionPolicyResult[] = [];
+
+    if (policyName) {
+      const result = await this.applyRetentionPolicy(policyName);
+      results.push(result);
+    } else {
+      const policies = await this.getAllRetentionPolicies();
+      for (const policy of policies) {
+        const result = await this.applyRetentionPolicy(policy.name);
+        results.push(result);
+      }
+    }
+
+    return results;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/main.ts.html b/coverage/lcov-report/src/main.ts.html new file mode 100644 index 0000000..177023b --- /dev/null +++ b/coverage/lcov-report/src/main.ts.html @@ -0,0 +1,322 @@ + + + + + + Code coverage report for src/main.ts + + + + + + + + + +
+
+

All files / src main.ts

+
+ +
+ 0% + Statements + 0/79 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/79 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import otelSDK from './tracing/otel-sdk';
+import { NestFactory } from '@nestjs/core';
+import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
+import { Logger, ValidationPipe } from '@nestjs/common';
+import { AppModule } from './app.module';
+import { SecurityHeadersService } from './security/headers/security-headers.service';
+import { ThrottlerGuard } from '@nestjs/throttler';
+import { ResponseInterceptor } from './common/interceptors/response.interceptor';
+import { HttpExceptionFilter } from './common/filters/http-exception.filter';
+
+async function bootstrap() {
+  const logger = new Logger('Bootstrap');
+
+  // Start the OpenTelemetry SDK
+  await otelSDK.start();
+
+  const app = await NestFactory.create(AppModule);
+
+  // 1. Apply Security Headers (via Helmet)
+  const securityHeadersService = app.get(SecurityHeadersService);
+  app.use(securityHeadersService.getHelmetMiddleware());
+
+  // 2. Global Validation (XSS/SQLi Prevention via Sanitization)
+  app.useGlobalPipes(
+    new ValidationPipe({
+      whitelist: true,
+      forbidNonWhitelisted: true,
+      transform: true,
+    }),
+  );
+
+  // 3. Global Throttler Guard (DDoS Protection)
+  app.useGlobalGuards(app.get(ThrottlerGuard));
+
+  // 4. Global Response Interceptor
+  app.useGlobalInterceptors(app.get(ResponseInterceptor));
+
+  // 5. Global Exception Filter
+  app.useGlobalFilters(app.get(HttpExceptionFilter));
+
+  // 5. CORS configuration
+  app.enableCors({
+    origin: process.env.ALLOWED_ORIGINS || '*',
+    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
+    preflightContinue: false,
+    optionsSuccessStatus: 204,
+    credentials: true,
+  });
+
+  // API prefix
+  app.setGlobalPrefix('api');
+
+  // Swagger documentation
+  if (process.env.NODE_ENV !== 'production') {
+    const config = new DocumentBuilder()
+      .setTitle('CurrentDao Backend API')
+      .setDescription('CurrentDao Energy Market Forecasting System API')
+      .setVersion('1.0')
+      .addTag('forecasting')
+      .addTag('app')
+      .addTag('health')
+      .addTag('contracts')
+      .build();
+
+    const document = SwaggerModule.createDocument(app, config);
+    SwaggerModule.setup('api/docs', app, document);
+  }
+
+  const port = process.env.PORT ?? 3000;
+  await app.listen(port);
+
+  logger.log(`Server successfully started on port ${port}`);
+
+  logger.log(`Application is running on: http://localhost:${port}`);
+  logger.log(`API documentation: http://localhost:${port}/api/docs`);
+  logger.log(`API endpoint: http://localhost:${port}/api`);
+}
+
+bootstrap();
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/algorithms/geographic-matching.algorithm.ts.html b/coverage/lcov-report/src/matching/algorithms/geographic-matching.algorithm.ts.html new file mode 100644 index 0000000..fc1dfe5 --- /dev/null +++ b/coverage/lcov-report/src/matching/algorithms/geographic-matching.algorithm.ts.html @@ -0,0 +1,1753 @@ + + + + + + Code coverage report for src/matching/algorithms/geographic-matching.algorithm.ts + + + + + + + + + +
+
+

All files / src/matching/algorithms geographic-matching.algorithm.ts

+
+ +
+ 0% + Statements + 0/556 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/556 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { Order } from '../../modules/energy/entities/order.entity';
+import { Match, MatchStatus, MatchType } from '../entities/match.entity';
+import { MatchingRule, RuleType } from '../entities/matching-rule.entity';
+import {
+  MatchingPreferencesDto,
+  GeographicScope,
+} from '../dto/matching-preferences.dto';
+
+export interface GeographicMatchResult {
+  matches: Match[];
+  rejectedOrders: string[];
+  processingTime: number;
+  algorithm: 'geographic';
+}
+
+export interface GeographicCluster {
+  id: string;
+  center: {
+    latitude: number;
+    longitude: number;
+  };
+  radius: number;
+  orders: Order[];
+  totalBuyQuantity: number;
+  totalSellQuantity: number;
+}
+
+export interface LocationPoint {
+  latitude: number;
+  longitude: number;
+  region?: string;
+  country?: string;
+}
+
+@Injectable()
+export class GeographicMatchingAlgorithm {
+  private readonly logger = new Logger(GeographicMatchingAlgorithm.name);
+
+  async findMatches(
+    buyOrders: Order[],
+    sellOrders: Order[],
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+  ): Promise<GeographicMatchResult> {
+    const startTime = Date.now();
+
+    this.logger.log(
+      `Starting geographic matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`,
+    );
+
+    const filteredBuyOrders = this.filterOrdersByGeography(
+      buyOrders,
+      preferences,
+    );
+    const filteredSellOrders = this.filterOrdersByGeography(
+      sellOrders,
+      preferences,
+    );
+
+    const clusters = this.createGeographicClusters(
+      filteredBuyOrders,
+      filteredSellOrders,
+      preferences,
+    );
+    const matches: Match[] = [];
+    const rejectedOrders: string[] = [];
+
+    for (const cluster of clusters) {
+      const clusterMatches = this.matchWithinCluster(
+        cluster,
+        rules,
+        preferences,
+      );
+      matches.push(...clusterMatches.matches);
+      rejectedOrders.push(...clusterMatches.rejectedOrders);
+    }
+
+    const processingTime = Date.now() - startTime;
+
+    this.logger.log(
+      `Geographic matching completed in ${processingTime}ms. Matches: ${matches.length}, Rejected: ${rejectedOrders.length}`,
+    );
+
+    return {
+      matches,
+      rejectedOrders,
+      processingTime,
+      algorithm: 'geographic',
+    };
+  }
+
+  private filterOrdersByGeography(
+    orders: Order[],
+    preferences: MatchingPreferencesDto,
+  ): Order[] {
+    if (!preferences.geographic) return orders;
+
+    return orders.filter((order) => {
+      if (!order.location) return false;
+
+      if (preferences.geographic.preferredRegions?.length > 0) {
+        const orderRegion = this.getRegionFromLocation(order.location);
+        if (!preferences.geographic.preferredRegions.includes(orderRegion)) {
+          return false;
+        }
+      }
+
+      if (preferences.geographic.excludedRegions?.length > 0) {
+        const orderRegion = this.getRegionFromLocation(order.location);
+        if (preferences.geographic.excludedRegions.includes(orderRegion)) {
+          return false;
+        }
+      }
+
+      return true;
+    });
+  }
+
+  private createGeographicClusters(
+    buyOrders: Order[],
+    sellOrders: Order[],
+    preferences: MatchingPreferencesDto,
+  ): GeographicCluster[] {
+    const allOrders = [...buyOrders, ...sellOrders];
+    const maxDistance = preferences.geographic?.maxDistance || 100;
+
+    const clusters: GeographicCluster[] = [];
+    const processedOrderIds = new Set<string>();
+
+    for (const order of allOrders) {
+      if (processedOrderIds.has(order.id) || !order.location) continue;
+
+      const nearbyOrders = this.findNearbyOrders(order, allOrders, maxDistance);
+      const cluster = this.createCluster(order, nearbyOrders);
+
+      clusters.push(cluster);
+      nearbyOrders.forEach((nearbyOrder) =>
+        processedOrderIds.add(nearbyOrder.id),
+      );
+    }
+
+    return clusters;
+  }
+
+  private findNearbyOrders(
+    centerOrder: Order,
+    allOrders: Order[],
+    maxDistance: number,
+  ): Order[] {
+    if (!centerOrder.location) return [];
+
+    return allOrders.filter((order) => {
+      if (order.id === centerOrder.id || !order.location) return false;
+
+      const distance = this.calculateDistance(
+        centerOrder.location,
+        order.location,
+      );
+      return distance <= maxDistance;
+    });
+  }
+
+  private createCluster(
+    centerOrder: Order,
+    orders: Order[],
+  ): GeographicCluster {
+    const buyOrders = orders.filter((order) => order.type === 'buy');
+    const sellOrders = orders.filter((order) => order.type === 'sell');
+
+    const totalBuyQuantity = buyOrders.reduce(
+      (sum, order) => sum + (order.quantity || 0),
+      0,
+    );
+    const totalSellQuantity = sellOrders.reduce(
+      (sum, order) => sum + (order.quantity || 0),
+      0,
+    );
+
+    const center = this.calculateClusterCenter(orders);
+
+    return {
+      id: `cluster_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
+      center,
+      radius: this.calculateClusterRadius(orders, center),
+      orders,
+      totalBuyQuantity,
+      totalSellQuantity,
+    };
+  }
+
+  private calculateClusterCenter(orders: Order[]): LocationPoint {
+    const validLocations = orders
+      .filter((order) => order.location)
+      .map((order) => order.location);
+
+    if (validLocations.length === 0) {
+      return { latitude: 0, longitude: 0 };
+    }
+
+    const sumLat = validLocations.reduce((sum, loc) => sum + loc.latitude, 0);
+    const sumLon = validLocations.reduce((sum, loc) => sum + loc.longitude, 0);
+
+    return {
+      latitude: sumLat / validLocations.length,
+      longitude: sumLon / validLocations.length,
+    };
+  }
+
+  private calculateClusterRadius(
+    orders: Order[],
+    center: LocationPoint,
+  ): number {
+    let maxDistance = 0;
+
+    for (const order of orders) {
+      if (!order.location) continue;
+
+      const distance = this.calculateDistance(center, order.location);
+      maxDistance = Math.max(maxDistance, distance);
+    }
+
+    return maxDistance;
+  }
+
+  private matchWithinCluster(
+    cluster: GeographicCluster,
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+  ): { matches: Match[]; rejectedOrders: string[] } {
+    const buyOrders = cluster.orders.filter((order) => order.type === 'buy');
+    const sellOrders = cluster.orders.filter((order) => order.type === 'sell');
+
+    const matches: Match[] = [];
+    const rejectedOrders: string[] = [];
+    const usedOrderIds = new Set<string>();
+
+    for (const buyOrder of buyOrders) {
+      if (usedOrderIds.has(buyOrder.id)) continue;
+
+      const bestSellOrder = this.findBestGeographicMatch(
+        buyOrder,
+        sellOrders,
+        usedOrderIds,
+        rules,
+        preferences,
+      );
+
+      if (bestSellOrder) {
+        const match = this.createGeographicMatch(
+          buyOrder,
+          bestSellOrder,
+          cluster,
+          preferences,
+        );
+        matches.push(match);
+        usedOrderIds.add(buyOrder.id);
+        usedOrderIds.add(bestSellOrder.id);
+
+        this.logger.log(
+          `Created geographic match: Buy ${buyOrder.id} -> Sell ${bestSellOrder.id} in cluster ${cluster.id}`,
+        );
+      } else {
+        rejectedOrders.push(buyOrder.id);
+      }
+    }
+
+    return { matches, rejectedOrders };
+  }
+
+  private findBestGeographicMatch(
+    buyOrder: Order,
+    sellOrders: Order[],
+    usedOrderIds: Set<string>,
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+  ): Order | null {
+    let bestMatch: Order | null = null;
+    let bestScore = -1;
+
+    for (const sellOrder of sellOrders) {
+      if (usedOrderIds.has(sellOrder.id)) continue;
+
+      const geographicScore = this.calculateGeographicScore(
+        buyOrder,
+        sellOrder,
+        preferences,
+      );
+      const priceScore = this.calculatePriceScore(
+        buyOrder,
+        sellOrder,
+        preferences,
+      );
+      const quantityScore = this.calculateQuantityScore(
+        buyOrder,
+        sellOrder,
+        preferences,
+      );
+
+      const combinedScore = this.calculateCombinedGeographicScore(
+        geographicScore,
+        priceScore,
+        quantityScore,
+        rules,
+      );
+
+      if (
+        combinedScore > bestScore &&
+        this.isPriceCompatible(buyOrder, sellOrder, preferences)
+      ) {
+        bestScore = combinedScore;
+        bestMatch = sellOrder;
+      }
+    }
+
+    return bestMatch;
+  }
+
+  private calculateGeographicScore(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    if (!buyOrder.location || !sellOrder.location) return 0.5;
+
+    const distance = this.calculateDistance(
+      buyOrder.location,
+      sellOrder.location,
+    );
+    const maxDistance = preferences.geographic?.maxDistance || 100;
+
+    let score = Math.max(0, 1 - distance / maxDistance);
+
+    const buyRegion = this.getRegionFromLocation(buyOrder.location);
+    const sellRegion = this.getRegionFromLocation(sellOrder.location);
+
+    if (buyRegion === sellRegion) {
+      score += 0.2;
+    }
+
+    return Math.min(score, 1);
+  }
+
+  private calculatePriceScore(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    const buyPrice = buyOrder.price || 0;
+    const sellPrice = sellOrder.price || 0;
+
+    if (buyPrice < sellPrice) return 0;
+
+    const priceDifference = buyPrice - sellPrice;
+    const tolerance = preferences.price?.priceTolerance || 15;
+
+    return Math.max(0, 1 - priceDifference / tolerance);
+  }
+
+  private calculateQuantityScore(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    const buyQuantity = buyOrder.quantity || 0;
+    const sellQuantity = sellOrder.quantity || 0;
+
+    if (preferences.quantity?.allowPartialFulfillment) {
+      return Math.min(sellQuantity / buyQuantity, 1);
+    }
+
+    return buyQuantity === sellQuantity ? 1 : 0;
+  }
+
+  private calculateCombinedGeographicScore(
+    geographicScore: number,
+    priceScore: number,
+    quantityScore: number,
+    rules: MatchingRule[],
+  ): number {
+    let geographicWeight = 0.5;
+    let priceWeight = 0.3;
+    let quantityWeight = 0.2;
+
+    for (const rule of rules.filter((r) => r.status === 'active')) {
+      switch (rule.type) {
+        case RuleType.GEOGRAPHIC_PROXIMITY:
+          geographicWeight += rule.weight || 0;
+          break;
+        case RuleType.PRICE_PRIORITY:
+          priceWeight += rule.weight || 0;
+          break;
+        case RuleType.QUANTITY_MATCH:
+          quantityWeight += rule.weight || 0;
+          break;
+      }
+    }
+
+    const totalWeight = geographicWeight + priceWeight + quantityWeight;
+
+    return (
+      (geographicScore * geographicWeight +
+        priceScore * priceWeight +
+        quantityScore * quantityWeight) /
+      totalWeight
+    );
+  }
+
+  private isPriceCompatible(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): boolean {
+    const buyPrice = buyOrder.price || 0;
+    const sellPrice = sellOrder.price || 0;
+
+    if (buyPrice < sellPrice) return false;
+
+    if (preferences.price?.maxPrice && sellPrice > preferences.price.maxPrice)
+      return false;
+    if (preferences.price?.minPrice && sellPrice < preferences.price.minPrice)
+      return false;
+
+    const priceDifference = buyPrice - sellPrice;
+    const tolerance = preferences.price?.priceTolerance || 15;
+
+    return priceDifference <= tolerance;
+  }
+
+  private createGeographicMatch(
+    buyOrder: Order,
+    sellOrder: Order,
+    cluster: GeographicCluster,
+    preferences: MatchingPreferencesDto,
+  ): Match {
+    const matchedQuantity = Math.min(buyOrder.quantity, sellOrder.quantity);
+    const matchedPrice = (buyOrder.price + sellOrder.price) / 2;
+    const distance = this.calculateDistance(
+      buyOrder.location,
+      sellOrder.location,
+    );
+
+    const match = new Match();
+    match.buyerOrderId = buyOrder.id;
+    match.sellerOrderId = sellOrder.id;
+    match.matchedQuantity = matchedQuantity;
+    match.matchedPrice = matchedPrice;
+    match.matchingScore = this.calculateGeographicScore(
+      buyOrder,
+      sellOrder,
+      preferences,
+    );
+    match.status = MatchStatus.PENDING;
+    match.type =
+      matchedQuantity < buyOrder.quantity ? MatchType.PARTIAL : MatchType.FULL;
+    match.remainingQuantity =
+      matchedQuantity < buyOrder.quantity
+        ? buyOrder.quantity - matchedQuantity
+        : null;
+    match.distance = distance;
+    match.metadata = {
+      algorithm: 'geographic',
+      priority: match.matchingScore,
+      renewablePreference: preferences.renewable?.preferRenewable,
+      clusterId: cluster.id,
+      auditTrail: [
+        {
+          timestamp: new Date(),
+          action: 'match_created',
+          reason: `Geographic matching in cluster ${cluster.id}, distance: ${distance.toFixed(2)}km`,
+        },
+      ],
+    };
+    match.expiresAt = new Date(Date.now() + 30 * 60 * 1000);
+
+    return match;
+  }
+
+  private calculateDistance(
+    location1: LocationPoint,
+    location2: LocationPoint,
+  ): number {
+    const lat1 = location1.latitude || 0;
+    const lon1 = location1.longitude || 0;
+    const lat2 = location2.latitude || 0;
+    const lon2 = location2.longitude || 0;
+
+    const R = 6371;
+    const dLat = ((lat2 - lat1) * Math.PI) / 180;
+    const dLon = ((lon2 - lon1) * Math.PI) / 180;
+    const a =
+      Math.sin(dLat / 2) * Math.sin(dLat / 2) +
+      Math.cos((lat1 * Math.PI) / 180) *
+        Math.cos((lat2 * Math.PI) / 180) *
+        Math.sin(dLon / 2) *
+        Math.sin(dLon / 2);
+    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+    return R * c;
+  }
+
+  private getRegionFromLocation(location: LocationPoint): string {
+    if (location.region) return location.region;
+    if (location.country) return location.country;
+
+    return 'unknown';
+  }
+
+  async findOptimalDeliveryRoutes(matches: Match[]): Promise<{
+    matches: Match[];
+    routes: Array<{
+      matchId: string;
+      route: LocationPoint[];
+      estimatedDistance: number;
+      estimatedTime: number;
+    }>;
+  }> {
+    const routes = [];
+
+    for (const match of matches) {
+      const route = await this.calculateOptimalRoute(match);
+      routes.push(route);
+    }
+
+    return { matches, routes };
+  }
+
+  private async calculateOptimalRoute(match: Match): Promise<{
+    matchId: string;
+    route: LocationPoint[];
+    estimatedDistance: number;
+    estimatedTime: number;
+  }> {
+    const route: LocationPoint[] = [];
+    let totalDistance = 0;
+
+    if (match.buyerOrder?.location) {
+      route.push(match.buyerOrder.location);
+    }
+
+    if (match.sellerOrder?.location) {
+      route.push(match.sellerOrder.location);
+      if (route.length > 1) {
+        totalDistance = this.calculateDistance(route[0], route[1]);
+      }
+    }
+
+    const estimatedTime = totalDistance * 2;
+
+    return {
+      matchId: match.id,
+      route,
+      estimatedDistance: totalDistance,
+      estimatedTime,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/algorithms/index.html b/coverage/lcov-report/src/matching/algorithms/index.html new file mode 100644 index 0000000..9f6d880 --- /dev/null +++ b/coverage/lcov-report/src/matching/algorithms/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/matching/algorithms + + + + + + + + + +
+
+

All files src/matching/algorithms

+
+ +
+ 0% + Statements + 0/1654 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/1654 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
geographic-matching.algorithm.ts +
+
0%0/5560%0/10%0/10%0/556
partial-fulfillment.algorithm.ts +
+
0%0/6290%0/10%0/10%0/629
priority-matching.algorithm.ts +
+
0%0/4690%0/10%0/10%0/469
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/algorithms/partial-fulfillment.algorithm.ts.html b/coverage/lcov-report/src/matching/algorithms/partial-fulfillment.algorithm.ts.html new file mode 100644 index 0000000..533ad9c --- /dev/null +++ b/coverage/lcov-report/src/matching/algorithms/partial-fulfillment.algorithm.ts.html @@ -0,0 +1,1972 @@ + + + + + + Code coverage report for src/matching/algorithms/partial-fulfillment.algorithm.ts + + + + + + + + + +
+
+

All files / src/matching/algorithms partial-fulfillment.algorithm.ts

+
+ +
+ 0% + Statements + 0/629 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/629 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { Order } from '../../modules/energy/entities/order.entity';
+import { Match, MatchStatus, MatchType } from '../entities/match.entity';
+import { MatchingRule, RuleType } from '../entities/matching-rule.entity';
+import { MatchingPreferencesDto } from '../dto/matching-preferences.dto';
+
+export interface PartialFulfillmentResult {
+  matches: Match[];
+  partiallyFulfilledOrders: Array<{
+    orderId: string;
+    originalQuantity: number;
+    fulfilledQuantity: number;
+    remainingQuantity: number;
+    matches: string[];
+  }>;
+  rejectedOrders: string[];
+  processingTime: number;
+  algorithm: 'partial_fulfillment';
+}
+
+export interface FulfillmentPlan {
+  orderId: string;
+  order: Order;
+  fulfillmentStrategy: 'single' | 'multiple' | 'split';
+  matches: Array<{
+    partnerOrderId: string;
+    quantity: number;
+    price: number;
+    score: number;
+  }>;
+  totalFulfilledQuantity: number;
+  remainingQuantity: number;
+  efficiency: number;
+}
+
+export interface SplitOrder {
+  originalOrderId: string;
+  splits: Array<{
+    splitId: string;
+    quantity: number;
+    price: number;
+    matchedWith: string[];
+  }>;
+}
+
+@Injectable()
+export class PartialFulfillmentAlgorithm {
+  private readonly logger = new Logger(PartialFulfillmentAlgorithm.name);
+
+  async findMatches(
+    buyOrders: Order[],
+    sellOrders: Order[],
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+  ): Promise<PartialFulfillmentResult> {
+    const startTime = Date.now();
+
+    this.logger.log(
+      `Starting partial fulfillment matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`,
+    );
+
+    const fulfillmentPlans = this.createFulfillmentPlans(
+      buyOrders,
+      sellOrders,
+      rules,
+      preferences,
+    );
+    const optimizedPlans = this.optimizeFulfillmentPlans(
+      fulfillmentPlans,
+      preferences,
+    );
+    const matches = this.executeFulfillmentPlans(optimizedPlans, preferences);
+
+    const partiallyFulfilledOrders = this.calculatePartialFulfillmentStats(
+      optimizedPlans,
+      matches,
+    );
+    const rejectedOrders = this.identifyRejectedOrders(optimizedPlans);
+
+    const processingTime = Date.now() - startTime;
+
+    this.logger.log(
+      `Partial fulfillment matching completed in ${processingTime}ms. Matches: ${matches.length}, Partially fulfilled: ${partiallyFulfilledOrders.length}`,
+    );
+
+    return {
+      matches,
+      partiallyFulfilledOrders,
+      rejectedOrders,
+      processingTime,
+      algorithm: 'partial_fulfillment',
+    };
+  }
+
+  private createFulfillmentPlans(
+    buyOrders: Order[],
+    sellOrders: Order[],
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+  ): FulfillmentPlan[] {
+    const plans: FulfillmentPlan[] = [];
+
+    for (const buyOrder of buyOrders) {
+      const plan = this.createFulfillmentPlan(
+        buyOrder,
+        sellOrders,
+        rules,
+        preferences,
+        'buyer',
+      );
+      if (plan) plans.push(plan);
+    }
+
+    for (const sellOrder of sellOrders) {
+      const plan = this.createFulfillmentPlan(
+        sellOrder,
+        buyOrders,
+        rules,
+        preferences,
+        'seller',
+      );
+      if (plan) plans.push(plan);
+    }
+
+    return plans;
+  }
+
+  private createFulfillmentPlan(
+    order: Order,
+    potentialPartners: Order[],
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+    orderType: 'buyer' | 'seller',
+  ): FulfillmentPlan | null {
+    const compatiblePartners = potentialPartners.filter((partner) =>
+      this.isCompatibleForPartialFulfillment(order, partner, preferences),
+    );
+
+    if (compatiblePartners.length === 0) return null;
+
+    const scoredPartners = compatiblePartners
+      .map((partner) => ({
+        partnerOrderId: partner.id,
+        quantity: Math.min(order.quantity, partner.quantity),
+        price: orderType === 'buyer' ? partner.price : order.price,
+        score: this.calculatePartialFulfillmentScore(
+          order,
+          partner,
+          rules,
+          preferences,
+        ),
+      }))
+      .sort((a, b) => b.score - a.score);
+
+    const fulfillmentStrategy = this.determineFulfillmentStrategy(
+      order,
+      scoredPartners,
+      preferences,
+    );
+    const selectedMatches = this.selectMatchesForStrategy(
+      order,
+      scoredPartners,
+      fulfillmentStrategy,
+      preferences,
+    );
+
+    const totalFulfilledQuantity = selectedMatches.reduce(
+      (sum, match) => sum + match.quantity,
+      0,
+    );
+    const remainingQuantity = order.quantity - totalFulfilledQuantity;
+    const efficiency = totalFulfilledQuantity / order.quantity;
+
+    return {
+      orderId: order.id,
+      order,
+      fulfillmentStrategy,
+      matches: selectedMatches,
+      totalFulfilledQuantity,
+      remainingQuantity,
+      efficiency,
+    };
+  }
+
+  private isCompatibleForPartialFulfillment(
+    order: Order,
+    partner: Order,
+    preferences: MatchingPreferencesDto,
+  ): boolean {
+    if (!preferences.quantity?.allowPartialFulfillment) {
+      return order.quantity === partner.quantity;
+    }
+
+    const minQuantity = preferences.quantity.minimumQuantity || 0;
+    const maxQuantity = preferences.quantity.maximumQuantity || Infinity;
+
+    if (partner.quantity < minQuantity || partner.quantity > maxQuantity) {
+      return false;
+    }
+
+    if (!this.isPriceCompatible(order, partner, preferences)) {
+      return false;
+    }
+
+    const threshold = preferences.quantity.partialFulfillmentThreshold || 50;
+    const fulfillmentPercentage =
+      (Math.min(order.quantity, partner.quantity) / order.quantity) * 100;
+
+    return fulfillmentPercentage >= threshold;
+  }
+
+  private calculatePartialFulfillmentScore(
+    order: Order,
+    partner: Order,
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+  ): number {
+    const quantityScore = this.calculateQuantityScore(
+      order,
+      partner,
+      preferences,
+    );
+    const priceScore = this.calculatePriceScore(order, partner, preferences);
+    const efficiencyScore = this.calculateEfficiencyScore(order, partner);
+    const reliabilityScore = this.calculateReliabilityScore(order, partner);
+
+    let quantityWeight = 0.3;
+    let priceWeight = 0.3;
+    const efficiencyWeight = 0.2;
+    let reliabilityWeight = 0.2;
+
+    for (const rule of rules.filter((r) => r.status === 'active')) {
+      switch (rule.type) {
+        case RuleType.QUANTITY_MATCH:
+          quantityWeight += rule.weight || 0;
+          break;
+        case RuleType.PRICE_PRIORITY:
+          priceWeight += rule.weight || 0;
+          break;
+        case RuleType.SUPPLIER_RELIABILITY:
+          reliabilityWeight += rule.weight || 0;
+          break;
+      }
+    }
+
+    const totalWeight =
+      quantityWeight + priceWeight + efficiencyWeight + reliabilityWeight;
+
+    return (
+      (quantityScore * quantityWeight +
+        priceScore * priceWeight +
+        efficiencyScore * efficiencyWeight +
+        reliabilityScore * reliabilityWeight) /
+      totalWeight
+    );
+  }
+
+  private calculateQuantityScore(
+    order: Order,
+    partner: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    const orderQuantity = order.quantity || 0;
+    const partnerQuantity = partner.quantity || 0;
+
+    const fulfillmentQuantity = Math.min(orderQuantity, partnerQuantity);
+    const fulfillmentRatio = fulfillmentQuantity / orderQuantity;
+
+    return fulfillmentRatio;
+  }
+
+  private calculatePriceScore(
+    order: Order,
+    partner: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    const orderPrice = order.price || 0;
+    const partnerPrice = partner.price || 0;
+
+    if (order.type === 'buy') {
+      if (orderPrice < partnerPrice) return 0;
+      const priceDifference = orderPrice - partnerPrice;
+      const tolerance = preferences.price?.priceTolerance || 10;
+      return Math.max(0, 1 - priceDifference / tolerance);
+    } else {
+      if (partnerPrice < orderPrice) return 0;
+      const priceDifference = partnerPrice - orderPrice;
+      const tolerance = preferences.price?.priceTolerance || 10;
+      return Math.max(0, 1 - priceDifference / tolerance);
+    }
+  }
+
+  private calculateEfficiencyScore(order: Order, partner: Order): number {
+    const orderQuantity = order.quantity || 0;
+    const partnerQuantity = partner.quantity || 0;
+
+    const waste = Math.abs(orderQuantity - partnerQuantity);
+    const totalQuantity = orderQuantity + partnerQuantity;
+
+    return Math.max(0, 1 - waste / totalQuantity);
+  }
+
+  private calculateReliabilityScore(order: Order, partner: Order): number {
+    const orderReliability = order.supplier?.reliabilityScore || 0.5;
+    const partnerReliability = partner.supplier?.reliabilityScore || 0.5;
+
+    return (orderReliability + partnerReliability) / 2;
+  }
+
+  private determineFulfillmentStrategy(
+    order: Order,
+    scoredPartners: any[],
+    preferences: MatchingPreferencesDto,
+  ): 'single' | 'multiple' | 'split' {
+    if (scoredPartners.length === 0) return 'single';
+
+    const bestPartner = scoredPartners[0];
+    const fulfillmentRatio = bestPartner.quantity / order.quantity;
+
+    if (fulfillmentRatio >= 0.95) {
+      return 'single';
+    }
+
+    const totalAvailableQuantity = scoredPartners.reduce(
+      (sum, partner) => sum + partner.quantity,
+      0,
+    );
+
+    if (totalAvailableQuantity >= order.quantity * 0.9) {
+      return 'multiple';
+    }
+
+    return 'split';
+  }
+
+  private selectMatchesForStrategy(
+    order: Order,
+    scoredPartners: any[],
+    strategy: 'single' | 'multiple' | 'split',
+    preferences: MatchingPreferencesDto,
+  ): any[] {
+    switch (strategy) {
+      case 'single':
+        return scoredPartners.slice(0, 1);
+
+      case 'multiple':
+        return this.selectMultipleMatches(order, scoredPartners, preferences);
+
+      case 'split':
+        return this.selectSplitMatches(order, scoredPartners, preferences);
+
+      default:
+        return [];
+    }
+  }
+
+  private selectMultipleMatches(
+    order: Order,
+    scoredPartners: any[],
+    preferences: MatchingPreferencesDto,
+  ): any[] {
+    const selectedMatches: any[] = [];
+    let remainingQuantity = order.quantity;
+
+    for (const partner of scoredPartners) {
+      if (remainingQuantity <= 0) break;
+
+      const matchQuantity = Math.min(partner.quantity, remainingQuantity);
+
+      selectedMatches.push({
+        ...partner,
+        quantity: matchQuantity,
+      });
+
+      remainingQuantity -= matchQuantity;
+    }
+
+    return selectedMatches;
+  }
+
+  private selectSplitMatches(
+    order: Order,
+    scoredPartners: any[],
+    preferences: MatchingPreferencesDto,
+  ): any[] {
+    const selectedMatches: any[] = [];
+    let remainingQuantity = order.quantity;
+
+    for (const partner of scoredPartners) {
+      if (remainingQuantity <= 0) break;
+
+      const maxSplitQuantity = partner.quantity * 0.8;
+      const matchQuantity = Math.min(maxSplitQuantity, remainingQuantity);
+
+      if (matchQuantity > 0) {
+        selectedMatches.push({
+          ...partner,
+          quantity: matchQuantity,
+        });
+
+        remainingQuantity -= matchQuantity;
+      }
+    }
+
+    return selectedMatches;
+  }
+
+  private optimizeFulfillmentPlans(
+    plans: FulfillmentPlan[],
+    preferences: MatchingPreferencesDto,
+  ): FulfillmentPlan[] {
+    return plans
+      .filter(
+        (plan) =>
+          plan.efficiency >=
+          (preferences.quantity?.partialFulfillmentThreshold || 50) / 100,
+      )
+      .sort((a, b) => b.efficiency - a.efficiency);
+  }
+
+  private executeFulfillmentPlans(
+    plans: FulfillmentPlan[],
+    preferences: MatchingPreferencesDto,
+  ): Match[] {
+    const matches: Match[] = [];
+    const usedOrderIds = new Set<string>();
+
+    for (const plan of plans) {
+      if (usedOrderIds.has(plan.orderId)) continue;
+
+      for (const matchInfo of plan.matches) {
+        if (usedOrderIds.has(matchInfo.partnerOrderId)) continue;
+
+        const match = this.createPartialMatch(
+          plan.order,
+          matchInfo,
+          plan.fulfillmentStrategy,
+          preferences,
+        );
+        matches.push(match);
+
+        usedOrderIds.add(plan.orderId);
+        usedOrderIds.add(matchInfo.partnerOrderId);
+      }
+    }
+
+    return matches;
+  }
+
+  private createPartialMatch(
+    order: Order,
+    matchInfo: any,
+    strategy: 'single' | 'multiple' | 'split',
+    preferences: MatchingPreferencesDto,
+  ): Match {
+    const isBuyOrder = order.type === 'buy';
+    const matchedPrice = matchInfo.price;
+
+    const match = new Match();
+    match.buyerOrderId = isBuyOrder ? order.id : matchInfo.partnerOrderId;
+    match.sellerOrderId = isBuyOrder ? matchInfo.partnerOrderId : order.id;
+    match.matchedQuantity = matchInfo.quantity;
+    match.matchedPrice = matchedPrice;
+    match.matchingScore = matchInfo.score;
+    match.status = MatchStatus.PENDING;
+    match.type = strategy === 'split' ? MatchType.SPLIT : MatchType.PARTIAL;
+    match.remainingQuantity = order.quantity - matchInfo.quantity;
+    match.metadata = {
+      algorithm: 'partial_fulfillment',
+      priority: matchInfo.score,
+      fulfillmentStrategy: strategy,
+      renewablePreference: preferences.renewable?.preferRenewable,
+      auditTrail: [
+        {
+          timestamp: new Date(),
+          action: 'partial_match_created',
+          reason: `Partial fulfillment using ${strategy} strategy, quantity: ${matchInfo.quantity}`,
+        },
+      ],
+    };
+    match.expiresAt = new Date(Date.now() + 30 * 60 * 1000);
+
+    return match;
+  }
+
+  private calculatePartialFulfillmentStats(
+    plans: FulfillmentPlan[],
+    matches: Match[],
+  ): Array<{
+    orderId: string;
+    originalQuantity: number;
+    fulfilledQuantity: number;
+    remainingQuantity: number;
+    matches: string[];
+  }> {
+    const stats = new Map();
+
+    for (const plan of plans) {
+      const orderMatches = matches.filter(
+        (match) =>
+          match.buyerOrderId === plan.orderId ||
+          match.sellerOrderId === plan.orderId,
+      );
+
+      const fulfilledQuantity = orderMatches.reduce(
+        (sum, match) => sum + match.matchedQuantity,
+        0,
+      );
+
+      stats.set(plan.orderId, {
+        orderId: plan.orderId,
+        originalQuantity: plan.order.quantity,
+        fulfilledQuantity,
+        remainingQuantity: plan.order.quantity - fulfilledQuantity,
+        matches: orderMatches.map((match) => match.id),
+      });
+    }
+
+    return Array.from(stats.values());
+  }
+
+  private identifyRejectedOrders(plans: FulfillmentPlan[]): string[] {
+    return plans
+      .filter((plan) => plan.efficiency < 0.5)
+      .map((plan) => plan.orderId);
+  }
+
+  private isPriceCompatible(
+    order: Order,
+    partner: Order,
+    preferences: MatchingPreferencesDto,
+  ): boolean {
+    const orderPrice = order.price || 0;
+    const partnerPrice = partner.price || 0;
+
+    if (order.type === 'buy') {
+      if (orderPrice < partnerPrice) return false;
+    } else {
+      if (partnerPrice < orderPrice) return false;
+    }
+
+    if (
+      preferences.price?.maxPrice &&
+      partnerPrice > preferences.price.maxPrice
+    )
+      return false;
+    if (
+      preferences.price?.minPrice &&
+      partnerPrice < preferences.price.minPrice
+    )
+      return false;
+
+    const priceDifference = Math.abs(orderPrice - partnerPrice);
+    const tolerance = preferences.price?.priceTolerance || 10;
+
+    return priceDifference <= tolerance;
+  }
+
+  async optimizePartialFulfillment(matches: Match[]): Promise<{
+    optimizedMatches: Match[];
+    optimizationGain: number;
+    recommendations: string[];
+  }> {
+    const optimizationGain = this.calculateOptimizationGain(matches);
+    const recommendations = this.generateOptimizationRecommendations(matches);
+    const optimizedMatches = this.applyOptimizations(matches);
+
+    return {
+      optimizedMatches,
+      optimizationGain,
+      recommendations,
+    };
+  }
+
+  private calculateOptimizationGain(matches: Match[]): number {
+    const totalEfficiency = matches.reduce((sum, match) => {
+      const efficiency =
+        match.matchedQuantity /
+        (match.matchedQuantity + (match.remainingQuantity || 0));
+      return sum + efficiency;
+    }, 0);
+
+    return (totalEfficiency / matches.length) * 100;
+  }
+
+  private generateOptimizationRecommendations(matches: Match[]): string[] {
+    const recommendations: string[] = [];
+
+    const partialMatches = matches.filter(
+      (match) => match.type === MatchType.PARTIAL,
+    );
+    if (partialMatches.length > matches.length * 0.5) {
+      recommendations.push(
+        'Consider adjusting partial fulfillment threshold to reduce fragmentation',
+      );
+    }
+
+    const lowScoreMatches = matches.filter(
+      (match) => (match.matchingScore || 0) < 0.6,
+    );
+    if (lowScoreMatches.length > 0) {
+      recommendations.push(
+        'Review matching rules to improve quality of partial matches',
+      );
+    }
+
+    return recommendations;
+  }
+
+  private applyOptimizations(matches: Match[]): Match[] {
+    return matches.map((match) => {
+      if (match.matchingScore && match.matchingScore < 0.5) {
+        match.status = MatchStatus.REJECTED;
+        match.metadata = {
+          ...match.metadata,
+          auditTrail: [
+            ...(match.metadata?.auditTrail || []),
+            {
+              timestamp: new Date(),
+              action: 'optimized_out',
+              reason: 'Low matching score below optimization threshold',
+            },
+          ],
+        };
+      }
+      return match;
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/algorithms/priority-matching.algorithm.ts.html b/coverage/lcov-report/src/matching/algorithms/priority-matching.algorithm.ts.html new file mode 100644 index 0000000..3bcb928 --- /dev/null +++ b/coverage/lcov-report/src/matching/algorithms/priority-matching.algorithm.ts.html @@ -0,0 +1,1492 @@ + + + + + + Code coverage report for src/matching/algorithms/priority-matching.algorithm.ts + + + + + + + + + +
+
+

All files / src/matching/algorithms priority-matching.algorithm.ts

+
+ +
+ 0% + Statements + 0/469 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/469 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { Order } from '../../modules/energy/entities/order.entity';
+import { Match, MatchStatus, MatchType } from '../entities/match.entity';
+import {
+  MatchingRule,
+  RuleType,
+  RulePriority,
+} from '../entities/matching-rule.entity';
+import {
+  MatchingPreferencesDto,
+  MatchingStrategy,
+} from '../dto/matching-preferences.dto';
+
+export interface PriorityMatchResult {
+  matches: Match[];
+  rejectedOrders: string[];
+  processingTime: number;
+  algorithm: 'priority';
+}
+
+export interface OrderPriority {
+  orderId: string;
+  priority: number;
+  score: number;
+  factors: {
+    priceScore: number;
+    timeScore: number;
+    quantityScore: number;
+    reliabilityScore: number;
+  };
+}
+
+@Injectable()
+export class PriorityMatchingAlgorithm {
+  private readonly logger = new Logger(PriorityMatchingAlgorithm.name);
+
+  async findMatches(
+    buyOrders: Order[],
+    sellOrders: Order[],
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+  ): Promise<PriorityMatchResult> {
+    const startTime = Date.now();
+
+    this.logger.log(
+      `Starting priority matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`,
+    );
+
+    const prioritizedBuyOrders = this.calculateOrderPriorities(
+      buyOrders,
+      rules,
+      'buyer',
+    );
+    const prioritizedSellOrders = this.calculateOrderPriorities(
+      sellOrders,
+      rules,
+      'seller',
+    );
+
+    const matches: Match[] = [];
+    const rejectedOrders: string[] = [];
+
+    const availableSellOrders = [...prioritizedSellOrders];
+    const usedSellOrderIds = new Set<string>();
+
+    for (const buyOrder of prioritizedBuyOrders) {
+      let bestMatch: Order | null = null;
+      let bestScore = -1;
+
+      for (const sellOrder of availableSellOrders) {
+        if (usedSellOrderIds.has(sellOrder.id)) continue;
+
+        const compatibilityScore = this.calculateCompatibilityScore(
+          buyOrder,
+          sellOrder,
+          rules,
+          preferences,
+        );
+
+        if (
+          compatibilityScore > bestScore &&
+          this.isPriceCompatible(buyOrder, sellOrder, preferences)
+        ) {
+          bestScore = compatibilityScore;
+          bestMatch = sellOrder;
+        }
+      }
+
+      if (bestMatch && bestScore > 0.5) {
+        const match = this.createMatch(
+          buyOrder,
+          bestMatch,
+          bestScore,
+          preferences,
+        );
+        matches.push(match);
+        usedSellOrderIds.add(bestMatch.id);
+
+        this.logger.log(
+          `Created match: Buy ${buyOrder.id} -> Sell ${bestMatch.id} (Score: ${bestScore.toFixed(3)})`,
+        );
+      } else {
+        rejectedOrders.push(buyOrder.id);
+      }
+    }
+
+    const processingTime = Date.now() - startTime;
+
+    this.logger.log(
+      `Priority matching completed in ${processingTime}ms. Matches: ${matches.length}, Rejected: ${rejectedOrders.length}`,
+    );
+
+    return {
+      matches,
+      rejectedOrders,
+      processingTime,
+      algorithm: 'priority',
+    };
+  }
+
+  private calculateOrderPriorities(
+    orders: Order[],
+    rules: MatchingRule[],
+    orderType: 'buyer' | 'seller',
+  ): Order[] {
+    return orders
+      .map((order) => ({
+        order,
+        priority: this.calculateOrderPriority(order, rules, orderType),
+      }))
+      .sort((a, b) => b.priority - a.priority)
+      .map((item) => item.order);
+  }
+
+  private calculateOrderPriority(
+    order: Order,
+    rules: MatchingRule[],
+    orderType: 'buyer' | 'seller',
+  ): number {
+    let priority = 0;
+
+    const applicableRules = rules.filter((rule) => {
+      if (orderType === 'buyer' && !rule.appliesToBuyer) return false;
+      if (orderType === 'seller' && !rule.appliesToSeller) return false;
+      if (rule.status !== 'active') return false;
+      return true;
+    });
+
+    for (const rule of applicableRules) {
+      switch (rule.type) {
+        case RuleType.PRICE_PRIORITY:
+          if (orderType === 'buyer') {
+            priority += rule.weight * (1 / (order.price || 1));
+          } else {
+            priority += rule.weight * (order.price || 1);
+          }
+          break;
+
+        case RuleType.TIME_PRIORITY:
+          const hoursSinceCreation =
+            (Date.now() - order.createdAt.getTime()) / (1000 * 60 * 60);
+          priority += rule.weight * Math.min(hoursSinceCreation / 24, 1);
+          break;
+
+        case RuleType.SUPPLIER_RELIABILITY:
+          const reliabilityScore = order.supplier?.reliabilityScore || 0.5;
+          priority += rule.weight * reliabilityScore;
+          break;
+
+        case RuleType.MINIMUM_ORDER_SIZE:
+          if (order.quantity >= (rule.parameters?.minOrderSize || 0)) {
+            priority += rule.weight;
+          }
+          break;
+
+        case RuleType.MARKET_SEGMENT:
+          if (rule.parameters?.marketSegment === order.marketSegment) {
+            priority += rule.weight;
+          }
+          break;
+      }
+    }
+
+    return priority;
+  }
+
+  private calculateCompatibilityScore(
+    buyOrder: Order,
+    sellOrder: Order,
+    rules: MatchingRule[],
+    preferences: MatchingPreferencesDto,
+  ): number {
+    let score = 0;
+    let totalWeight = 0;
+
+    const priceScore = this.calculatePriceScore(
+      buyOrder,
+      sellOrder,
+      preferences,
+    );
+    const quantityScore = this.calculateQuantityScore(
+      buyOrder,
+      sellOrder,
+      preferences,
+    );
+    const timeScore = this.calculateTimeScore(buyOrder, sellOrder);
+    const reliabilityScore = this.calculateReliabilityScore(
+      buyOrder,
+      sellOrder,
+    );
+
+    const weights = this.getRuleWeights(rules);
+
+    score += priceScore * weights.price;
+    totalWeight += weights.price;
+
+    score += quantityScore * weights.quantity;
+    totalWeight += weights.quantity;
+
+    score += timeScore * weights.time;
+    totalWeight += weights.time;
+
+    score += reliabilityScore * weights.reliability;
+    totalWeight += weights.reliability;
+
+    if (preferences.geographic) {
+      const geographicScore = this.calculateGeographicScore(
+        buyOrder,
+        sellOrder,
+        preferences,
+      );
+      score += geographicScore * weights.geographic;
+      totalWeight += weights.geographic;
+    }
+
+    if (preferences.renewable?.preferRenewable) {
+      const renewableScore = this.calculateRenewableScore(
+        buyOrder,
+        sellOrder,
+        preferences,
+      );
+      score += renewableScore * weights.renewable;
+      totalWeight += weights.renewable;
+    }
+
+    return totalWeight > 0 ? score / totalWeight : 0;
+  }
+
+  private calculatePriceScore(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    const buyPrice = buyOrder.price || 0;
+    const sellPrice = sellOrder.price || 0;
+
+    if (buyPrice < sellPrice) return 0;
+
+    const priceDifference = buyPrice - sellPrice;
+    const tolerance = preferences.price?.priceTolerance || 10;
+
+    return Math.max(0, 1 - priceDifference / tolerance);
+  }
+
+  private calculateQuantityScore(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    const buyQuantity = buyOrder.quantity || 0;
+    const sellQuantity = sellOrder.quantity || 0;
+
+    if (preferences.quantity?.allowPartialFulfillment) {
+      const minQuantity = preferences.quantity.minimumQuantity || 0;
+      const maxQuantity = preferences.quantity.maximumQuantity || Infinity;
+
+      if (sellQuantity >= minQuantity && sellQuantity <= maxQuantity) {
+        return Math.min(sellQuantity / buyQuantity, 1);
+      }
+      return 0;
+    }
+
+    return buyQuantity === sellQuantity ? 1 : 0;
+  }
+
+  private calculateTimeScore(buyOrder: Order, sellOrder: Order): number {
+    const timeDiff = Math.abs(
+      buyOrder.createdAt.getTime() - sellOrder.createdAt.getTime(),
+    );
+    const maxTimeDiff = 24 * 60 * 60 * 1000; // 24 hours
+
+    return Math.max(0, 1 - timeDiff / maxTimeDiff);
+  }
+
+  private calculateReliabilityScore(buyOrder: Order, sellOrder: Order): number {
+    const buyReliability = buyOrder.supplier?.reliabilityScore || 0.5;
+    const sellReliability = sellOrder.supplier?.reliabilityScore || 0.5;
+
+    return (buyReliability + sellReliability) / 2;
+  }
+
+  private calculateGeographicScore(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    if (!buyOrder.location || !sellOrder.location) return 0.5;
+
+    const distance = this.calculateDistance(
+      buyOrder.location,
+      sellOrder.location,
+    );
+    const maxDistance = preferences.geographic?.maxDistance || 1000;
+
+    return Math.max(0, 1 - distance / maxDistance);
+  }
+
+  private calculateRenewableScore(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): number {
+    const buyRenewable = buyOrder.energyType?.isRenewable || false;
+    const sellRenewable = sellOrder.energyType?.isRenewable || false;
+
+    if (!preferences.renewable?.preferRenewable) return 0.5;
+
+    if (buyRenewable && sellRenewable) return 1;
+    if (buyRenewable || sellRenewable) return 0.5;
+    return 0.2;
+  }
+
+  private getRuleWeights(rules: MatchingRule[]): {
+    price: number;
+    quantity: number;
+    time: number;
+    reliability: number;
+    geographic: number;
+    renewable: number;
+  } {
+    const defaultWeights = {
+      price: 0.3,
+      quantity: 0.2,
+      time: 0.2,
+      reliability: 0.15,
+      geographic: 0.1,
+      renewable: 0.05,
+    };
+
+    const customWeights = { ...defaultWeights };
+
+    for (const rule of rules.filter((r) => r.status === 'active')) {
+      switch (rule.type) {
+        case RuleType.PRICE_PRIORITY:
+          customWeights.price += rule.weight || 0;
+          break;
+        case RuleType.QUANTITY_MATCH:
+          customWeights.quantity += rule.weight || 0;
+          break;
+        case RuleType.TIME_PRIORITY:
+          customWeights.time += rule.weight || 0;
+          break;
+        case RuleType.SUPPLIER_RELIABILITY:
+          customWeights.reliability += rule.weight || 0;
+          break;
+        case RuleType.GEOGRAPHIC_PROXIMITY:
+          customWeights.geographic += rule.weight || 0;
+          break;
+        case RuleType.RENEWABLE_PREFERENCE:
+          customWeights.renewable += rule.weight || 0;
+          break;
+      }
+    }
+
+    const total = Object.values(customWeights).reduce(
+      (sum, weight) => sum + weight,
+      0,
+    );
+
+    return Object.fromEntries(
+      Object.entries(customWeights).map(([key, value]) => [key, value / total]),
+    ) as typeof customWeights;
+  }
+
+  private isPriceCompatible(
+    buyOrder: Order,
+    sellOrder: Order,
+    preferences: MatchingPreferencesDto,
+  ): boolean {
+    const buyPrice = buyOrder.price || 0;
+    const sellPrice = sellOrder.price || 0;
+
+    if (buyPrice < sellPrice) return false;
+
+    if (preferences.price?.maxPrice && sellPrice > preferences.price.maxPrice)
+      return false;
+    if (preferences.price?.minPrice && sellPrice < preferences.price.minPrice)
+      return false;
+
+    const priceDifference = buyPrice - sellPrice;
+    const tolerance = preferences.price?.priceTolerance || 10;
+
+    return priceDifference <= tolerance;
+  }
+
+  private createMatch(
+    buyOrder: Order,
+    sellOrder: Order,
+    score: number,
+    preferences: MatchingPreferencesDto,
+  ): Match {
+    const matchedQuantity = Math.min(buyOrder.quantity, sellOrder.quantity);
+    const matchedPrice = (buyOrder.price + sellOrder.price) / 2;
+
+    const match = new Match();
+    match.buyerOrderId = buyOrder.id;
+    match.sellerOrderId = sellOrder.id;
+    match.matchedQuantity = matchedQuantity;
+    match.matchedPrice = matchedPrice;
+    match.matchingScore = score;
+    match.status = MatchStatus.PENDING;
+    match.type =
+      matchedQuantity < buyOrder.quantity ? MatchType.PARTIAL : MatchType.FULL;
+    match.remainingQuantity =
+      matchedQuantity < buyOrder.quantity
+        ? buyOrder.quantity - matchedQuantity
+        : null;
+    match.distance = this.calculateDistance(
+      buyOrder.location,
+      sellOrder.location,
+    );
+    match.metadata = {
+      algorithm: 'priority',
+      priority: score,
+      renewablePreference: preferences.renewable?.preferRenewable,
+      auditTrail: [
+        {
+          timestamp: new Date(),
+          action: 'match_created',
+          reason: `Priority matching with score ${score.toFixed(3)}`,
+        },
+      ],
+    };
+    match.expiresAt = new Date(Date.now() + 30 * 60 * 1000); // 30 minutes
+
+    return match;
+  }
+
+  private calculateDistance(location1: any, location2: any): number {
+    if (!location1 || !location2) return 0;
+
+    const lat1 = location1.latitude || 0;
+    const lon1 = location1.longitude || 0;
+    const lat2 = location2.latitude || 0;
+    const lon2 = location2.longitude || 0;
+
+    const R = 6371;
+    const dLat = ((lat2 - lat1) * Math.PI) / 180;
+    const dLon = ((lon2 - lon1) * Math.PI) / 180;
+    const a =
+      Math.sin(dLat / 2) * Math.sin(dLat / 2) +
+      Math.cos((lat1 * Math.PI) / 180) *
+        Math.cos((lat2 * Math.PI) / 180) *
+        Math.sin(dLon / 2) *
+        Math.sin(dLon / 2);
+    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+    return R * c;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/audit/audit.service.ts.html b/coverage/lcov-report/src/matching/audit/audit.service.ts.html new file mode 100644 index 0000000..05cbf56 --- /dev/null +++ b/coverage/lcov-report/src/matching/audit/audit.service.ts.html @@ -0,0 +1,1468 @@ + + + + + + Code coverage report for src/matching/audit/audit.service.ts + + + + + + + + + +
+
+

All files / src/matching/audit audit.service.ts

+
+ +
+ 0% + Statements + 0/461 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/461 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { Match } from '../entities/match.entity';
+import { MatchingRule } from '../entities/matching-rule.entity';
+
+export interface AuditEntry {
+  id: string;
+  entityType: 'match' | 'rule' | 'order';
+  entityId: string;
+  action: string;
+  previousState?: any;
+  newState?: any;
+  userId?: string;
+  timestamp: Date;
+  ipAddress?: string;
+  userAgent?: string;
+  reason?: string;
+  metadata?: any;
+}
+
+export interface AuditFilter {
+  entityType?: 'match' | 'rule' | 'order';
+  entityId?: string;
+  userId?: string;
+  action?: string;
+  startDate?: Date;
+  endDate?: Date;
+  limit?: number;
+  offset?: number;
+}
+
+export interface AuditReport {
+  totalEntries: number;
+  entries: AuditEntry[];
+  summary: {
+    actionsByType: Record<string, number>;
+    entitiesByType: Record<string, number>;
+    usersByActivity: Record<string, number>;
+    timeRange: { start: Date; end: Date };
+  };
+}
+
+@Injectable()
+export class AuditService {
+  private readonly logger = new Logger(AuditService.name);
+  private auditEntries: AuditEntry[] = [];
+
+  constructor(
+    @InjectRepository(Match)
+    private readonly matchRepository: Repository<Match>,
+    @InjectRepository(MatchingRule)
+    private readonly matchingRuleRepository: Repository<MatchingRule>,
+  ) {}
+
+  async logEntry(
+    entry: Omit<AuditEntry, 'id' | 'timestamp'>,
+  ): Promise<AuditEntry> {
+    const auditEntry: AuditEntry = {
+      id: `audit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
+      timestamp: new Date(),
+      ...entry,
+    };
+
+    this.auditEntries.push(auditEntry);
+
+    if (this.auditEntries.length > 10000) {
+      this.auditEntries = this.auditEntries.slice(-5000);
+    }
+
+    this.logger.debug(
+      `Audit entry logged: ${auditEntry.action} on ${auditEntry.entityType} ${auditEntry.entityId}`,
+    );
+
+    return auditEntry;
+  }
+
+  async logMatchCreation(
+    match: Match,
+    userId?: string,
+    reason?: string,
+  ): Promise<AuditEntry> {
+    return this.logEntry({
+      entityType: 'match',
+      entityId: match.id,
+      action: 'match_created',
+      newState: this.sanitizeMatch(match),
+      userId,
+      reason,
+      metadata: {
+        algorithm: match.metadata?.algorithm,
+        score: match.matchingScore,
+        type: match.type,
+      },
+    });
+  }
+
+  async logMatchUpdate(
+    match: Match,
+    previousState: Match,
+    userId?: string,
+    reason?: string,
+  ): Promise<AuditEntry> {
+    return this.logEntry({
+      entityType: 'match',
+      entityId: match.id,
+      action: 'match_updated',
+      previousState: this.sanitizeMatch(previousState),
+      newState: this.sanitizeMatch(match),
+      userId,
+      reason,
+      metadata: {
+        changes: this.detectChanges(previousState, match),
+      },
+    });
+  }
+
+  async logMatchDeletion(
+    match: Match,
+    userId?: string,
+    reason?: string,
+  ): Promise<AuditEntry> {
+    return this.logEntry({
+      entityType: 'match',
+      entityId: match.id,
+      action: 'match_deleted',
+      previousState: this.sanitizeMatch(match),
+      userId,
+      reason,
+    });
+  }
+
+  async logRuleCreation(
+    rule: MatchingRule,
+    userId?: string,
+  ): Promise<AuditEntry> {
+    return this.logEntry({
+      entityType: 'rule',
+      entityId: rule.id,
+      action: 'rule_created',
+      newState: this.sanitizeRule(rule),
+      userId,
+      metadata: {
+        ruleType: rule.type,
+        priority: rule.priority,
+      },
+    });
+  }
+
+  async logRuleUpdate(
+    rule: MatchingRule,
+    previousState: MatchingRule,
+    userId?: string,
+  ): Promise<AuditEntry> {
+    return this.logEntry({
+      entityType: 'rule',
+      entityId: rule.id,
+      action: 'rule_updated',
+      previousState: this.sanitizeRule(previousState),
+      newState: this.sanitizeRule(rule),
+      userId,
+      metadata: {
+        changes: this.detectChanges(previousState, rule),
+      },
+    });
+  }
+
+  async logRuleDeletion(
+    rule: MatchingRule,
+    userId?: string,
+    reason?: string,
+  ): Promise<AuditEntry> {
+    return this.logEntry({
+      entityType: 'rule',
+      entityId: rule.id,
+      action: 'rule_deleted',
+      previousState: this.sanitizeRule(rule),
+      userId,
+      reason,
+    });
+  }
+
+  async getAuditHistory(filter: AuditFilter): Promise<AuditReport> {
+    let filteredEntries = [...this.auditEntries];
+
+    if (filter.entityType) {
+      filteredEntries = filteredEntries.filter(
+        (entry) => entry.entityType === filter.entityType,
+      );
+    }
+
+    if (filter.entityId) {
+      filteredEntries = filteredEntries.filter(
+        (entry) => entry.entityId === filter.entityId,
+      );
+    }
+
+    if (filter.userId) {
+      filteredEntries = filteredEntries.filter(
+        (entry) => entry.userId === filter.userId,
+      );
+    }
+
+    if (filter.action) {
+      filteredEntries = filteredEntries.filter(
+        (entry) => entry.action === filter.action,
+      );
+    }
+
+    if (filter.startDate) {
+      filteredEntries = filteredEntries.filter(
+        (entry) => entry.timestamp >= filter.startDate,
+      );
+    }
+
+    if (filter.endDate) {
+      filteredEntries = filteredEntries.filter(
+        (entry) => entry.timestamp <= filter.endDate,
+      );
+    }
+
+    filteredEntries.sort(
+      (a, b) => b.timestamp.getTime() - a.timestamp.getTime(),
+    );
+
+    const offset = filter.offset || 0;
+    const limit = filter.limit || 100;
+    const paginatedEntries = filteredEntries.slice(offset, offset + limit);
+
+    const summary = this.generateSummary(filteredEntries);
+
+    return {
+      totalEntries: filteredEntries.length,
+      entries: paginatedEntries,
+      summary,
+    };
+  }
+
+  async getMatchAuditHistory(matchId: string): Promise<AuditEntry[]> {
+    return this.getAuditHistory({
+      entityType: 'match',
+      entityId: matchId,
+    }).then((report) => report.entries);
+  }
+
+  async getRuleAuditHistory(ruleId: string): Promise<AuditEntry[]> {
+    return this.getAuditHistory({
+      entityType: 'rule',
+      entityId: ruleId,
+    }).then((report) => report.entries);
+  }
+
+  async getUserActivity(
+    userId: string,
+    startDate?: Date,
+    endDate?: Date,
+  ): Promise<AuditEntry[]> {
+    return this.getAuditHistory({
+      userId,
+      startDate,
+      endDate,
+    }).then((report) => report.entries);
+  }
+
+  async generateAuditReport(
+    startDate: Date,
+    endDate: Date,
+  ): Promise<AuditReport> {
+    return this.getAuditHistory({
+      startDate,
+      endDate,
+      limit: 10000,
+    });
+  }
+
+  async exportAuditData(
+    filter: AuditFilter,
+    format: 'json' | 'csv' = 'json',
+  ): Promise<string> {
+    const report = await this.getAuditHistory({ ...filter, limit: 10000 });
+
+    if (format === 'json') {
+      return JSON.stringify(report, null, 2);
+    }
+
+    if (format === 'csv') {
+      return this.convertToCSV(report.entries);
+    }
+
+    throw new Error(`Unsupported export format: ${format}`);
+  }
+
+  private sanitizeMatch(match: Match): any {
+    return {
+      id: match.id,
+      buyerOrderId: match.buyerOrderId,
+      sellerOrderId: match.sellerOrderId,
+      matchedQuantity: match.matchedQuantity,
+      matchedPrice: match.matchedPrice,
+      status: match.status,
+      type: match.type,
+      matchingScore: match.matchingScore,
+      createdAt: match.createdAt,
+      updatedAt: match.updatedAt,
+    };
+  }
+
+  private sanitizeRule(rule: MatchingRule): any {
+    return {
+      id: rule.id,
+      name: rule.name,
+      type: rule.type,
+      priority: rule.priority,
+      status: rule.status,
+      weight: rule.weight,
+      isDefault: rule.isDefault,
+      createdAt: rule.createdAt,
+      updatedAt: rule.updatedAt,
+    };
+  }
+
+  private detectChanges<T>(
+    previous: T,
+    current: T,
+  ): Record<string, { from: any; to: any }> {
+    const changes: Record<string, { from: any; to: any }> = {};
+
+    for (const key in current) {
+      if (current[key] !== previous[key]) {
+        changes[key] = {
+          from: previous[key],
+          to: current[key],
+        };
+      }
+    }
+
+    return changes;
+  }
+
+  private generateSummary(entries: AuditEntry[]): AuditReport['summary'] {
+    const actionsByType: Record<string, number> = {};
+    const entitiesByType: Record<string, number> = {};
+    const usersByActivity: Record<string, number> = {};
+
+    let earliestDate = new Date();
+    let latestDate = new Date(0);
+
+    for (const entry of entries) {
+      actionsByType[entry.action] = (actionsByType[entry.action] || 0) + 1;
+      entitiesByType[entry.entityType] =
+        (entitiesByType[entry.entityType] || 0) + 1;
+
+      if (entry.userId) {
+        usersByActivity[entry.userId] =
+          (usersByActivity[entry.userId] || 0) + 1;
+      }
+
+      if (entry.timestamp < earliestDate) {
+        earliestDate = entry.timestamp;
+      }
+
+      if (entry.timestamp > latestDate) {
+        latestDate = entry.timestamp;
+      }
+    }
+
+    return {
+      actionsByType,
+      entitiesByType,
+      usersByActivity,
+      timeRange: {
+        start: earliestDate,
+        end: latestDate,
+      },
+    };
+  }
+
+  private convertToCSV(entries: AuditEntry[]): string {
+    const headers = [
+      'ID',
+      'Entity Type',
+      'Entity ID',
+      'Action',
+      'User ID',
+      'Timestamp',
+      'IP Address',
+      'Reason',
+      'Metadata',
+    ];
+
+    const rows = entries.map((entry) => [
+      entry.id,
+      entry.entityType,
+      entry.entityId,
+      entry.action,
+      entry.userId || '',
+      entry.timestamp.toISOString(),
+      entry.ipAddress || '',
+      entry.reason || '',
+      JSON.stringify(entry.metadata || {}),
+    ]);
+
+    const csvContent = [headers, ...rows]
+      .map((row) => row.map((field) => `"${field}"`).join(','))
+      .join('\n');
+
+    return csvContent;
+  }
+
+  async cleanupOldEntries(retentionDays: number = 90): Promise<number> {
+    const cutoffDate = new Date();
+    cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
+
+    const initialCount = this.auditEntries.length;
+    this.auditEntries = this.auditEntries.filter(
+      (entry) => entry.timestamp >= cutoffDate,
+    );
+    const deletedCount = initialCount - this.auditEntries.length;
+
+    this.logger.log(
+      `Cleaned up ${deletedCount} old audit entries (older than ${retentionDays} days)`,
+    );
+
+    return deletedCount;
+  }
+
+  async getAuditStatistics(): Promise<{
+    totalEntries: number;
+    entriesByType: Record<string, number>;
+    entriesByAction: Record<string, number>;
+    entriesByUser: Record<string, number>;
+    recentActivity: AuditEntry[];
+  }> {
+    const totalEntries = this.auditEntries.length;
+    const entriesByType: Record<string, number> = {};
+    const entriesByAction: Record<string, number> = {};
+    const entriesByUser: Record<string, number> = {};
+
+    for (const entry of this.auditEntries) {
+      entriesByType[entry.entityType] =
+        (entriesByType[entry.entityType] || 0) + 1;
+      entriesByAction[entry.action] = (entriesByAction[entry.action] || 0) + 1;
+
+      if (entry.userId) {
+        entriesByUser[entry.userId] = (entriesByUser[entry.userId] || 0) + 1;
+      }
+    }
+
+    const recentActivity = this.auditEntries
+      .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())
+      .slice(0, 10);
+
+    return {
+      totalEntries,
+      entriesByType,
+      entriesByAction,
+      entriesByUser,
+      recentActivity,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/audit/index.html b/coverage/lcov-report/src/matching/audit/index.html new file mode 100644 index 0000000..9b56170 --- /dev/null +++ b/coverage/lcov-report/src/matching/audit/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/matching/audit + + + + + + + + + +
+
+

All files src/matching/audit

+
+ +
+ 0% + Statements + 0/461 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/461 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
audit.service.ts +
+
0%0/4610%0/10%0/10%0/461
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/dto/index.html b/coverage/lcov-report/src/matching/dto/index.html new file mode 100644 index 0000000..7b70675 --- /dev/null +++ b/coverage/lcov-report/src/matching/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/matching/dto + + + + + + + + + +
+
+

All files src/matching/dto

+
+ +
+ 0% + Statements + 0/214 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/214 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
matching-preferences.dto.ts +
+
0%0/2140%0/10%0/10%0/214
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/dto/matching-preferences.dto.ts.html b/coverage/lcov-report/src/matching/dto/matching-preferences.dto.ts.html new file mode 100644 index 0000000..72dc4f0 --- /dev/null +++ b/coverage/lcov-report/src/matching/dto/matching-preferences.dto.ts.html @@ -0,0 +1,727 @@ + + + + + + Code coverage report for src/matching/dto/matching-preferences.dto.ts + + + + + + + + + +
+
+

All files / src/matching/dto matching-preferences.dto.ts

+
+ +
+ 0% + Statements + 0/214 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/214 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsEnum,
+  IsNumber,
+  IsBoolean,
+  IsOptional,
+  IsArray,
+  IsString,
+  Min,
+  Max,
+  ValidateNested,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+
+export enum EnergyType {
+  SOLAR = 'solar',
+  WIND = 'wind',
+  HYDRO = 'hydro',
+  NUCLEAR = 'nuclear',
+  FOSSIL = 'fossil',
+  BIOMASS = 'biomass',
+  GEOTHERMAL = 'geothermal',
+}
+
+export enum MatchingStrategy {
+  PRICE_FIRST = 'price_first',
+  PROXIMITY_FIRST = 'proximity_first',
+  RENEWABLE_FIRST = 'renewable_first',
+  BALANCED = 'balanced',
+  CUSTOM = 'custom',
+}
+
+export enum GeographicScope {
+  LOCAL = 'local',
+  REGIONAL = 'regional',
+  NATIONAL = 'national',
+  INTERNATIONAL = 'international',
+}
+
+export class PricePreferences {
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  priceTolerance: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  maxPrice?: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  minPrice?: number;
+
+  @IsOptional()
+  @IsBoolean()
+  preferFixedPrice?: boolean;
+}
+
+export class GeographicPreferences {
+  @IsEnum(GeographicScope)
+  scope: GeographicScope;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  maxDistance?: number;
+
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  preferredRegions?: string[];
+
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  excludedRegions?: string[];
+}
+
+export class RenewablePreferences {
+  @IsBoolean()
+  preferRenewable: boolean;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  minimumRenewablePercentage?: number;
+
+  @IsOptional()
+  @IsArray()
+  @IsEnum(EnergyType, { each: true })
+  preferredRenewableTypes?: EnergyType[];
+
+  @IsOptional()
+  @IsBoolean()
+  allowMixed?: boolean;
+}
+
+export class QuantityPreferences {
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  minimumQuantity?: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  maximumQuantity?: number;
+
+  @IsOptional()
+  @IsBoolean()
+  allowPartialFulfillment?: boolean;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  partialFulfillmentThreshold?: number;
+}
+
+export class TimePreferences {
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(168)
+  matchingWindowHours?: number;
+
+  @IsOptional()
+  @IsArray()
+  @IsNumber({}, { each: true })
+  @Min(0)
+  @Max(23)
+  preferredHours?: number[];
+
+  @IsOptional()
+  @IsArray()
+  @IsNumber({}, { each: true })
+  @Min(1)
+  @Max(7)
+  preferredDays?: number[];
+
+  @IsOptional()
+  @IsBoolean()
+  allowImmediateMatching?: boolean;
+}
+
+export class QualityPreferences {
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  minimumReliabilityScore?: number;
+
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  preferredSuppliers?: string[];
+
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  excludedSuppliers?: string[];
+
+  @IsOptional()
+  @IsBoolean()
+  prioritizeVerifiedSuppliers?: boolean;
+}
+
+export class MatchingPreferencesDto {
+  @IsEnum(MatchingStrategy)
+  strategy: MatchingStrategy;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => PricePreferences)
+  price?: PricePreferences;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => GeographicPreferences)
+  geographic?: GeographicPreferences;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => RenewablePreferences)
+  renewable?: RenewablePreferences;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => QuantityPreferences)
+  quantity?: QuantityPreferences;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => TimePreferences)
+  time?: TimePreferences;
+
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => QualityPreferences)
+  quality?: QualityPreferences;
+
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  customRules?: string[];
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  priorityScore?: number;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/entities/index.html b/coverage/lcov-report/src/matching/entities/index.html new file mode 100644 index 0000000..375afc3 --- /dev/null +++ b/coverage/lcov-report/src/matching/entities/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/matching/entities + + + + + + + + + +
+
+

All files src/matching/entities

+
+ +
+ 0% + Statements + 0/234 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/234 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
match.entity.ts +
+
0%0/1030%0/10%0/10%0/103
matching-rule.entity.ts +
+
0%0/1310%0/10%0/10%0/131
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/entities/match.entity.ts.html b/coverage/lcov-report/src/matching/entities/match.entity.ts.html new file mode 100644 index 0000000..a099090 --- /dev/null +++ b/coverage/lcov-report/src/matching/entities/match.entity.ts.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for src/matching/entities/match.entity.ts + + + + + + + + + +
+
+

All files / src/matching/entities match.entity.ts

+
+ +
+ 0% + Statements + 0/103 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/103 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  ManyToOne,
+  JoinColumn,
+} from 'typeorm';
+import { Order } from '../../modules/energy/entities/order.entity';
+
+export enum MatchStatus {
+  PENDING = 'pending',
+  CONFIRMED = 'confirmed',
+  REJECTED = 'rejected',
+  PARTIALLY_FULFILLED = 'partially_fulfilled',
+  COMPLETED = 'completed',
+  CANCELLED = 'cancelled',
+}
+
+export enum MatchType {
+  FULL = 'full',
+  PARTIAL = 'partial',
+  SPLIT = 'split',
+}
+
+@Entity('matches')
+export class Match {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ name: 'buyer_order_id' })
+  buyerOrderId: string;
+
+  @Column({ name: 'seller_order_id' })
+  sellerOrderId: string;
+
+  @Column({ type: 'decimal', precision: 10, scale: 2 })
+  matchedQuantity: number;
+
+  @Column({ type: 'decimal', precision: 10, scale: 4 })
+  matchedPrice: number;
+
+  @Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
+  remainingQuantity: number;
+
+  @Column({
+    type: 'enum',
+    enum: MatchStatus,
+    default: MatchStatus.PENDING,
+  })
+  status: MatchStatus;
+
+  @Column({
+    type: 'enum',
+    enum: MatchType,
+    default: MatchType.FULL,
+  })
+  type: MatchType;
+
+  @Column({ type: 'decimal', precision: 8, scale: 4, nullable: true })
+  distance: number;
+
+  @Column({ type: 'decimal', precision: 5, scale: 2, nullable: true })
+  matchingScore: number;
+
+  @Column({ type: 'json', nullable: true })
+  metadata: {
+    algorithm?: string;
+    priority?: number;
+    renewablePreference?: boolean;
+    conflictResolution?: string;
+    auditTrail?: Array<{
+      timestamp: Date;
+      action: string;
+      reason: string;
+      userId?: string;
+    }>;
+  };
+
+  @Column({ name: 'buyer_confirmed_at', type: 'datetime', nullable: true })
+  buyerConfirmedAt: Date;
+
+  @Column({ name: 'seller_confirmed_at', type: 'datetime', nullable: true })
+  sellerConfirmedAt: Date;
+
+  @Column({ name: 'expires_at', type: 'datetime', nullable: true })
+  expiresAt: Date;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+
+  @ManyToOne(() => Order, { nullable: true })
+  @JoinColumn({ name: 'buyer_order_id' })
+  buyerOrder: Order;
+
+  @ManyToOne(() => Order, { nullable: true })
+  @JoinColumn({ name: 'seller_order_id' })
+  sellerOrder: Order;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/entities/matching-rule.entity.ts.html b/coverage/lcov-report/src/matching/entities/matching-rule.entity.ts.html new file mode 100644 index 0000000..655e424 --- /dev/null +++ b/coverage/lcov-report/src/matching/entities/matching-rule.entity.ts.html @@ -0,0 +1,478 @@ + + + + + + Code coverage report for src/matching/entities/matching-rule.entity.ts + + + + + + + + + +
+
+

All files / src/matching/entities matching-rule.entity.ts

+
+ +
+ 0% + Statements + 0/131 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/131 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+} from 'typeorm';
+
+export enum RuleType {
+  PRICE_PRIORITY = 'price_priority',
+  TIME_PRIORITY = 'time_priority',
+  GEOGRAPHIC_PROXIMITY = 'geographic_proximity',
+  RENEWABLE_PREFERENCE = 'renewable_preference',
+  QUANTITY_MATCH = 'quantity_match',
+  MINIMUM_ORDER_SIZE = 'minimum_order_size',
+  MAXIMUM_DISTANCE = 'maximum_distance',
+  PRICE_TOLERANCE = 'price_tolerance',
+  SUPPLIER_RELIABILITY = 'supplier_reliability',
+  MARKET_SEGMENT = 'market_segment',
+}
+
+export enum RulePriority {
+  LOW = 1,
+  MEDIUM = 2,
+  HIGH = 3,
+  CRITICAL = 4,
+}
+
+export enum RuleStatus {
+  ACTIVE = 'active',
+  INACTIVE = 'inactive',
+  SUSPENDED = 'suspended',
+}
+
+@Entity('matching_rules')
+export class MatchingRule {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ length: 255 })
+  name: string;
+
+  @Column({ type: 'text', nullable: true })
+  description: string;
+
+  @Column({
+    type: 'enum',
+    enum: RuleType,
+  })
+  type: RuleType;
+
+  @Column({
+    type: 'enum',
+    enum: RulePriority,
+    default: RulePriority.MEDIUM,
+  })
+  priority: RulePriority;
+
+  @Column({
+    type: 'enum',
+    enum: RuleStatus,
+    default: RuleStatus.ACTIVE,
+  })
+  status: RuleStatus;
+
+  @Column({ type: 'decimal', precision: 5, scale: 2, nullable: true })
+  weight: number;
+
+  @Column({ type: 'json', nullable: true })
+  parameters: {
+    minPrice?: number;
+    maxPrice?: number;
+    priceTolerance?: number;
+    maxDistance?: number;
+    minOrderSize?: number;
+    maxOrderSize?: number;
+    renewablePreference?: boolean;
+    renewablePercentage?: number;
+    timeWindow?: number;
+    reliabilityThreshold?: number;
+    marketSegment?: string;
+    customRules?: Array<{
+      condition: string;
+      value: any;
+      weight: number;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  conditions: {
+    buyerType?: string[];
+    sellerType?: string[];
+    energyType?: string[];
+    geographicRegion?: string[];
+    timeRestrictions?: {
+      startHour?: number;
+      endHour?: number;
+      daysOfWeek?: number[];
+    };
+  };
+
+  @Column({ name: 'is_default', default: false })
+  isDefault: boolean;
+
+  @Column({ name: 'is_system_rule', default: false })
+  isSystemRule: boolean;
+
+  @Column({ name: 'applies_to_buyer', default: true })
+  appliesToBuyer: boolean;
+
+  @Column({ name: 'applies_to_seller', default: true })
+  appliesToSeller: boolean;
+
+  @Column({ name: 'effective_from', type: 'datetime', nullable: true })
+  effectiveFrom: Date;
+
+  @Column({ name: 'effective_to', type: 'datetime', nullable: true })
+  effectiveTo: Date;
+
+  @Column({ name: 'created_by', nullable: true })
+  createdBy: string;
+
+  @Column({ name: 'updated_by', nullable: true })
+  updatedBy: string;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/events/index.html b/coverage/lcov-report/src/matching/events/index.html new file mode 100644 index 0000000..d6e54ed --- /dev/null +++ b/coverage/lcov-report/src/matching/events/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/matching/events + + + + + + + + + +
+
+

All files src/matching/events

+
+ +
+ 0% + Statements + 0/450 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/450 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
matching-events.service.ts +
+
0%0/4500%0/10%0/10%0/450
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/events/matching-events.service.ts.html b/coverage/lcov-report/src/matching/events/matching-events.service.ts.html new file mode 100644 index 0000000..1408b67 --- /dev/null +++ b/coverage/lcov-report/src/matching/events/matching-events.service.ts.html @@ -0,0 +1,1435 @@ + + + + + + Code coverage report for src/matching/events/matching-events.service.ts + + + + + + + + + +
+
+

All files / src/matching/events matching-events.service.ts

+
+ +
+ 0% + Statements + 0/450 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/450 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, EventEmitter, OnModuleInit } from '@nestjs/common';
+import {
+  WebSocketGateway,
+  WebSocketServer,
+  SubscribeMessage,
+  OnGatewayConnection,
+  OnGatewayDisconnect,
+} from '@nestjs/websockets';
+import { Server, Socket } from 'socket.io';
+import { Match, MatchStatus } from '../entities/match.entity';
+import { MatchingService, MatchingEvent } from '../matching.service';
+import { AuditService } from '../audit/audit.service';
+
+export interface MatchingEventData {
+  event: MatchingEvent;
+  recipients?: string[];
+  channels?: string[];
+}
+
+export interface NotificationPayload {
+  type:
+    | 'match_created'
+    | 'match_confirmed'
+    | 'match_rejected'
+    | 'match_expired'
+    | 'conflict_resolved';
+  title: string;
+  message: string;
+  data: any;
+  priority: 'low' | 'medium' | 'high' | 'urgent';
+  timestamp: Date;
+  userId?: string;
+  orderId?: string;
+  matchId?: string;
+}
+
+@WebSocketGateway({
+  cors: {
+    origin: '*',
+    methods: ['GET', 'POST'],
+    credentials: true,
+  },
+  namespace: '/matching',
+})
+@Injectable()
+export class MatchingEventsService
+  implements OnModuleInit, OnGatewayConnection, OnGatewayDisconnect
+{
+  @WebSocketServer()
+  server: Server;
+
+  private readonly logger = new Logger(MatchingEventsService.name);
+  private readonly eventEmitter = new EventEmitter();
+  private connectedClients = new Map<string, Socket>();
+  private userSubscriptions = new Map<string, Set<string>>();
+
+  constructor(
+    private readonly matchingService: MatchingService,
+    private readonly auditService: AuditService,
+  ) {}
+
+  async onModuleInit() {
+    this.setupEventHandlers();
+    this.logger.log('Matching events service initialized');
+  }
+
+  handleConnection(client: Socket) {
+    this.logger.log(`Client connected: ${client.id}`);
+    this.connectedClients.set(client.id, client);
+
+    client.on(
+      'authenticate',
+      async (data: { userId: string; token?: string }) => {
+        await this.authenticateClient(client, data.userId);
+      },
+    );
+
+    client.on('subscribe', async (data: { channels: string[] }) => {
+      await this.subscribeToChannels(client, data.channels);
+    });
+
+    client.on('unsubscribe', async (data: { channels: string[] }) => {
+      await this.unsubscribeFromChannels(client, data.channels);
+    });
+
+    client.emit('connected', {
+      message: 'Connected to matching events service',
+      clientId: client.id,
+      timestamp: new Date(),
+    });
+  }
+
+  handleDisconnect(client: Socket) {
+    this.logger.log(`Client disconnected: ${client.id}`);
+    this.connectedClients.delete(client.id);
+
+    for (const [userId, subscriptions] of this.userSubscriptions) {
+      if (subscriptions.has(client.id)) {
+        subscriptions.delete(client.id);
+      }
+    }
+  }
+
+  @SubscribeMessage('subscribe_to_order')
+  async handleSubscribeToOrder(client: Socket, orderId: string) {
+    const room = `order_${orderId}`;
+    await client.join(room);
+
+    this.logger.debug(`Client ${client.id} subscribed to order ${orderId}`);
+
+    client.emit('subscribed', { type: 'order', id: orderId });
+  }
+
+  @SubscribeMessage('subscribe_to_user')
+  async handleSubscribeToUser(client: Socket, userId: string) {
+    const room = `user_${userId}`;
+    await client.join(room);
+
+    if (!this.userSubscriptions.has(userId)) {
+      this.userSubscriptions.set(userId, new Set());
+    }
+    this.userSubscriptions.get(userId).add(client.id);
+
+    this.logger.debug(`Client ${client.id} subscribed to user ${userId}`);
+
+    client.emit('subscribed', { type: 'user', id: userId });
+  }
+
+  @SubscribeMessage('subscribe_to_matches')
+  async handleSubscribeToMatches(client: Socket) {
+    const room = 'matches';
+    await client.join(room);
+
+    this.logger.debug(`Client ${client.id} subscribed to all matches`);
+
+    client.emit('subscribed', { type: 'matches' });
+  }
+
+  @SubscribeMessage('unsubscribe_from_order')
+  async handleUnsubscribeFromOrder(client: Socket, orderId: string) {
+    const room = `order_${orderId}`;
+    await client.leave(room);
+
+    this.logger.debug(`Client ${client.id} unsubscribed from order ${orderId}`);
+
+    client.emit('unsubscribed', { type: 'order', id: orderId });
+  }
+
+  private setupEventHandlers() {
+    this.matchingService.onMatchingEvent(async (event: MatchingEvent) => {
+      await this.handleMatchingEvent(event);
+    });
+
+    this.eventEmitter.on(
+      'notification',
+      async (notification: NotificationPayload) => {
+        await this.sendNotification(notification);
+      },
+    );
+  }
+
+  async handleMatchingEvent(event: MatchingEvent) {
+    await this.auditService.logEntry({
+      entityType: 'match',
+      entityId: event.data.matchId || 'unknown',
+      action: event.type,
+      newState: event.data,
+      metadata: {
+        eventType: event.type,
+        timestamp: event.timestamp,
+      },
+    });
+
+    const notification = this.createNotificationFromEvent(event);
+    await this.sendNotification(notification);
+
+    await this.broadcastEvent(event);
+  }
+
+  createNotificationFromEvent(event: MatchingEvent): NotificationPayload {
+    const baseNotification: Partial<NotificationPayload> = {
+      data: event.data,
+      timestamp: event.timestamp,
+      matchId: event.data.matchId,
+      orderId: event.data.buyerOrderId || event.data.sellerOrderId,
+    };
+
+    switch (event.type) {
+      case 'match_created':
+        return {
+          ...baseNotification,
+          type: 'match_created',
+          title: 'New Match Created',
+          message: `A new match has been created between buyer ${event.data.buyerOrderId} and seller ${event.data.sellerOrderId}`,
+          priority: 'medium',
+        };
+
+      case 'match_confirmed':
+        return {
+          ...baseNotification,
+          type: 'match_confirmed',
+          title: 'Match Confirmed',
+          message: `Match ${event.data.matchId} has been confirmed`,
+          priority: 'high',
+          userId: event.data.confirmedBy,
+        };
+
+      case 'match_rejected':
+        return {
+          ...baseNotification,
+          type: 'match_rejected',
+          title: 'Match Rejected',
+          message: `Match ${event.data.matchId} has been rejected`,
+          priority: 'high',
+          userId: event.data.rejectedBy,
+        };
+
+      case 'match_expired':
+        return {
+          ...baseNotification,
+          type: 'match_expired',
+          title: 'Match Expired',
+          message: `Match ${event.data.matchId} has expired`,
+          priority: 'medium',
+        };
+
+      case 'conflict_resolved':
+        return {
+          ...baseNotification,
+          type: 'conflict_resolved',
+          title: 'Conflict Resolved',
+          message: `Matching conflict has been resolved`,
+          priority: 'high',
+        };
+
+      default:
+        return {
+          ...baseNotification,
+          type: event.type,
+          title: 'Matching Event',
+          message: `A matching event occurred: ${event.type}`,
+          priority: 'low',
+        } as NotificationPayload;
+    }
+  }
+
+  async sendNotification(notification: NotificationPayload) {
+    const channels = this.determineNotificationChannels(notification);
+
+    for (const channel of channels) {
+      this.server.to(channel).emit('notification', notification);
+    }
+
+    if (notification.userId) {
+      this.server
+        .to(`user_${notification.userId}`)
+        .emit('notification', notification);
+    }
+
+    if (notification.orderId) {
+      this.server
+        .to(`order_${notification.orderId}`)
+        .emit('notification', notification);
+    }
+
+    this.logger.debug(
+      `Notification sent: ${notification.type} to channels: ${channels.join(', ')}`,
+    );
+  }
+
+  async broadcastEvent(event: MatchingEvent) {
+    this.server.emit('matching_event', event);
+    this.server.to('matches').emit('matching_event', event);
+
+    if (event.data.buyerOrderId) {
+      this.server
+        .to(`order_${event.data.buyerOrderId}`)
+        .emit('matching_event', event);
+    }
+
+    if (event.data.sellerOrderId) {
+      this.server
+        .to(`order_${event.data.sellerOrderId}`)
+        .emit('matching_event', event);
+    }
+
+    this.logger.debug(`Event broadcasted: ${event.type}`);
+  }
+
+  private determineNotificationChannels(
+    notification: NotificationPayload,
+  ): string[] {
+    const channels: string[] = [];
+
+    switch (notification.type) {
+      case 'match_created':
+        channels.push('matches');
+        if (
+          notification.priority === 'high' ||
+          notification.priority === 'urgent'
+        ) {
+          channels.push('urgent_matches');
+        }
+        break;
+
+      case 'match_confirmed':
+      case 'match_rejected':
+        channels.push('match_updates');
+        break;
+
+      case 'match_expired':
+        channels.push('expired_matches');
+        break;
+
+      case 'conflict_resolved':
+        channels.push('conflict_resolution');
+        break;
+
+      default:
+        channels.push('general');
+        break;
+    }
+
+    return channels;
+  }
+
+  async sendCustomNotification(
+    notification: Omit<NotificationPayload, 'timestamp'>,
+  ) {
+    const fullNotification: NotificationPayload = {
+      ...notification,
+      timestamp: new Date(),
+    };
+
+    await this.sendNotification(fullNotification);
+  }
+
+  async broadcastToAllClients(event: string, data: any) {
+    this.server.emit(event, data);
+  }
+
+  async broadcastToChannel(channel: string, event: string, data: any) {
+    this.server.to(channel).emit(event, data);
+  }
+
+  async broadcastToUser(userId: string, event: string, data: any) {
+    this.server.to(`user_${userId}`).emit(event, data);
+  }
+
+  async broadcastToOrder(orderId: string, event: string, data: any) {
+    this.server.to(`order_${orderId}`).emit(event, data);
+  }
+
+  private async authenticateClient(client: Socket, userId: string) {
+    client.data.userId = userId;
+
+    const room = `user_${userId}`;
+    await client.join(room);
+
+    if (!this.userSubscriptions.has(userId)) {
+      this.userSubscriptions.set(userId, new Set());
+    }
+    this.userSubscriptions.get(userId).add(client.id);
+
+    this.logger.debug(`Client ${client.id} authenticated as user ${userId}`);
+
+    client.emit('authenticated', { userId, timestamp: new Date() });
+  }
+
+  private async subscribeToChannels(client: Socket, channels: string[]) {
+    for (const channel of channels) {
+      await client.join(channel);
+    }
+
+    this.logger.debug(
+      `Client ${client.id} subscribed to channels: ${channels.join(', ')}`,
+    );
+
+    client.emit('subscribed', { type: 'channels', channels });
+  }
+
+  private async unsubscribeFromChannels(client: Socket, channels: string[]) {
+    for (const channel of channels) {
+      await client.leave(channel);
+    }
+
+    this.logger.debug(
+      `Client ${client.id} unsubscribed from channels: ${channels.join(', ')}`,
+    );
+
+    client.emit('unsubscribed', { type: 'channels', channels });
+  }
+
+  getConnectedClientsCount(): number {
+    return this.connectedClients.size;
+  }
+
+  getSubscribedUsersCount(): number {
+    return this.userSubscriptions.size;
+  }
+
+  async getActiveChannels(): Promise<string[]> {
+    const sockets = await this.server.fetchSockets();
+    const channels = new Set<string>();
+
+    for (const socket of sockets) {
+      const socketRooms = socket.rooms;
+      for (const room of socketRooms) {
+        if (room !== socket.id) {
+          channels.add(room);
+        }
+      }
+    }
+
+    return Array.from(channels);
+  }
+
+  async sendSystemMessage(
+    message: string,
+    priority: 'info' | 'warning' | 'error' = 'info',
+  ) {
+    const systemMessage = {
+      type: 'system_message',
+      message,
+      priority,
+      timestamp: new Date(),
+    };
+
+    this.server.emit('system_message', systemMessage);
+  }
+
+  async sendMatchingStatistics(stats: any) {
+    this.server.to('matches').emit('matching_statistics', {
+      ...stats,
+      timestamp: new Date(),
+    });
+  }
+
+  async emitMatchingPerformanceMetrics(metrics: {
+    processingTime: number;
+    successRate: number;
+    totalMatches: number;
+    algorithmPerformance: Record<string, number>;
+  }) {
+    this.server.to('performance').emit('performance_metrics', {
+      ...metrics,
+      timestamp: new Date(),
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/index.html b/coverage/lcov-report/src/matching/index.html new file mode 100644 index 0000000..dec5f99 --- /dev/null +++ b/coverage/lcov-report/src/matching/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/matching + + + + + + + + + +
+
+

All files src/matching

+
+ +
+ 0% + Statements + 0/678 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/678 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
matching.module.ts +
+
0%0/240%0/10%0/10%0/24
matching.service.ts +
+
0%0/6540%0/10%0/10%0/654
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/matching.module.ts.html b/coverage/lcov-report/src/matching/matching.module.ts.html new file mode 100644 index 0000000..a09f497 --- /dev/null +++ b/coverage/lcov-report/src/matching/matching.module.ts.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for src/matching/matching.module.ts + + + + + + + + + +
+
+

All files / src/matching matching.module.ts

+
+ +
+ 0% + Statements + 0/24 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { MatchingService } from './matching.service';
+import { Match } from './entities/match.entity';
+import { MatchingRule } from './entities/matching-rule.entity';
+import { PriorityMatchingAlgorithm } from './algorithms/priority-matching.algorithm';
+import { GeographicMatchingAlgorithm } from './algorithms/geographic-matching.algorithm';
+import { PartialFulfillmentAlgorithm } from './algorithms/partial-fulfillment.algorithm';
+import { AuditService } from './audit/audit.service';
+import { MatchingEventsService } from './events/matching-events.service';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([Match, MatchingRule])],
+  providers: [
+    MatchingService,
+    PriorityMatchingAlgorithm,
+    GeographicMatchingAlgorithm,
+    PartialFulfillmentAlgorithm,
+    AuditService,
+    MatchingEventsService,
+  ],
+  exports: [MatchingService, AuditService, MatchingEventsService],
+})
+export class MatchingModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/matching/matching.service.ts.html b/coverage/lcov-report/src/matching/matching.service.ts.html new file mode 100644 index 0000000..40ea3da --- /dev/null +++ b/coverage/lcov-report/src/matching/matching.service.ts.html @@ -0,0 +1,2047 @@ + + + + + + Code coverage report for src/matching/matching.service.ts + + + + + + + + + +
+
+

All files / src/matching matching.service.ts

+
+ +
+ 0% + Statements + 0/654 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/654 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit, EventEmitter } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource, LessThan } from 'typeorm';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { Order } from '../modules/energy/entities/order.entity';
+import { Match, MatchStatus, MatchType } from './entities/match.entity';
+import {
+  MatchingRule,
+  RuleStatus,
+  RuleType,
+} from './entities/matching-rule.entity';
+import {
+  MatchingPreferencesDto,
+  MatchingStrategy,
+} from './dto/matching-preferences.dto';
+import {
+  PriorityMatchingAlgorithm,
+  PriorityMatchResult,
+} from './algorithms/priority-matching.algorithm';
+import {
+  GeographicMatchingAlgorithm,
+  GeographicMatchResult,
+} from './algorithms/geographic-matching.algorithm';
+import {
+  PartialFulfillmentAlgorithm,
+  PartialFulfillmentResult,
+} from './algorithms/partial-fulfillment.algorithm';
+
+export interface MatchingEvent {
+  type:
+    | 'match_created'
+    | 'match_confirmed'
+    | 'match_rejected'
+    | 'match_expired'
+    | 'conflict_resolved';
+  data: any;
+  timestamp: Date;
+}
+
+export interface MatchingMetrics {
+  totalOrders: number;
+  totalMatches: number;
+  successRate: number;
+  averageProcessingTime: number;
+  matchesByType: Record<MatchType, number>;
+  matchesByStatus: Record<MatchStatus, number>;
+  algorithmPerformance: Record<string, number>;
+}
+
+export interface ConflictResolution {
+  conflictId: string;
+  conflictingMatches: Match[];
+  resolution: 'keep_all' | 'keep_best' | 'keep_first' | 'reject_all';
+  resolvedMatches: Match[];
+  rejectedMatches: Match[];
+  reason: string;
+}
+
+@Injectable()
+export class MatchingService implements OnModuleInit {
+  private readonly logger = new Logger(MatchingService.name);
+  private readonly eventEmitter = new EventEmitter();
+  private matchingInProgress = false;
+  private orderQueue: Order[] = [];
+  private activeRules: MatchingRule[] = [];
+  private metrics: MatchingMetrics = {
+    totalOrders: 0,
+    totalMatches: 0,
+    successRate: 0,
+    averageProcessingTime: 0,
+    matchesByType: {} as Record<MatchType, number>,
+    matchesByStatus: {} as Record<MatchStatus, number>,
+    algorithmPerformance: {},
+  };
+
+  constructor(
+    @InjectRepository(Match)
+    private readonly matchRepository: Repository<Match>,
+    @InjectRepository(MatchingRule)
+    private readonly matchingRuleRepository: Repository<MatchingRule>,
+    @InjectRepository(Order)
+    private readonly orderRepository: Repository<Order>,
+    private readonly dataSource: DataSource,
+    private readonly priorityAlgorithm: PriorityMatchingAlgorithm,
+    private readonly geographicAlgorithm: GeographicMatchingAlgorithm,
+    private readonly partialFulfillmentAlgorithm: PartialFulfillmentAlgorithm,
+  ) {}
+
+  async onModuleInit() {
+    await this.loadActiveRules();
+    await this.initializeMetrics();
+    this.startRealTimeMatching();
+    this.logger.log('Matching service initialized successfully');
+  }
+
+  async loadActiveRules() {
+    this.activeRules = await this.matchingRuleRepository.find({
+      where: { status: RuleStatus.ACTIVE },
+      order: { priority: 'DESC' },
+    });
+    this.logger.log(`Loaded ${this.activeRules.length} active matching rules`);
+  }
+
+  async initializeMetrics() {
+    const totalOrders = await this.orderRepository.count();
+    const totalMatches = await this.matchRepository.count();
+
+    this.metrics.totalOrders = totalOrders;
+    this.metrics.totalMatches = totalMatches;
+
+    const matchesByType = await this.matchRepository
+      .createQueryBuilder('match')
+      .select('match.type', 'type')
+      .addSelect('COUNT(*)', 'count')
+      .groupBy('match.type')
+      .getRawMany();
+
+    matchesByType.forEach((item) => {
+      this.metrics.matchesByType[item.type as MatchType] = parseInt(item.count);
+    });
+
+    const matchesByStatus = await this.matchRepository
+      .createQueryBuilder('match')
+      .select('match.status', 'status')
+      .addSelect('COUNT(*)', 'count')
+      .groupBy('match.status')
+      .getRawMany();
+
+    matchesByStatus.forEach((item) => {
+      this.metrics.matchesByStatus[item.status as MatchStatus] = parseInt(
+        item.count,
+      );
+    });
+  }
+
+  startRealTimeMatching() {
+    setInterval(() => {
+      if (!this.matchingInProgress) {
+        this.processOrderQueue();
+      }
+    }, 5000);
+  }
+
+  async addOrderToQueue(order: Order) {
+    this.orderQueue.push(order);
+    this.logger.log(`Order ${order.id} added to matching queue`);
+
+    if (!this.matchingInProgress) {
+      setImmediate(() => this.processOrderQueue());
+    }
+  }
+
+  async processOrderQueue() {
+    if (this.matchingInProgress || this.orderQueue.length === 0) {
+      return;
+    }
+
+    this.matchingInProgress = true;
+    const startTime = Date.now();
+
+    try {
+      const ordersToProcess = [...this.orderQueue];
+      this.orderQueue = [];
+
+      const buyOrders = ordersToProcess.filter((order) => order.type === 'buy');
+      const sellOrders = ordersToProcess.filter(
+        (order) => order.type === 'sell',
+      );
+
+      const pendingOrders = await this.getPendingOrders();
+      const allBuyOrders = [
+        ...buyOrders,
+        ...pendingOrders.filter((order) => order.type === 'buy'),
+      ];
+      const allSellOrders = [
+        ...sellOrders,
+        ...pendingOrders.filter((order) => order.type === 'sell'),
+      ];
+
+      const preferences = this.getDefaultPreferences();
+      const results = await this.runMatchingAlgorithms(
+        allBuyOrders,
+        allSellOrders,
+        preferences,
+      );
+
+      const conflicts = await this.detectConflicts(results.matches);
+      if (conflicts.length > 0) {
+        const resolvedMatches = await this.resolveConflicts(conflicts);
+        results.matches = resolvedMatches;
+      }
+
+      await this.saveMatches(results.matches);
+      await this.updateOrderStatuses(results.matches);
+      await this.emitMatchingEvents(results.matches);
+
+      const processingTime = Date.now() - startTime;
+      await this.updateMetrics(results, processingTime);
+
+      this.logger.log(
+        `Processed ${ordersToProcess.length} orders in ${processingTime}ms. Created ${results.matches.length} matches`,
+      );
+    } catch (error) {
+      this.logger.error('Error during order processing', error);
+    } finally {
+      this.matchingInProgress = false;
+    }
+  }
+
+  async getPendingOrders(): Promise<Order[]> {
+    return this.orderRepository.find({
+      where: { status: 'pending' as any },
+      order: { createdAt: 'ASC' },
+    });
+  }
+
+  async runMatchingAlgorithms(
+    buyOrders: Order[],
+    sellOrders: Order[],
+    preferences: MatchingPreferencesDto,
+  ) {
+    const allMatches: Match[] = [];
+    const allRejectedOrders: string[] = [];
+    let totalProcessingTime = 0;
+
+    if (
+      preferences.strategy === MatchingStrategy.PRIORITY ||
+      preferences.strategy === MatchingStrategy.BALANCED
+    ) {
+      const priorityResult = await this.priorityAlgorithm.findMatches(
+        buyOrders,
+        sellOrders,
+        this.activeRules,
+        preferences,
+      );
+      allMatches.push(...priorityResult.matches);
+      allRejectedOrders.push(...priorityResult.rejectedOrders);
+      totalProcessingTime += priorityResult.processingTime;
+    }
+
+    if (
+      preferences.strategy === MatchingStrategy.PROXIMITY_FIRST ||
+      preferences.strategy === MatchingStrategy.BALANCED
+    ) {
+      const geoResult = await this.geographicAlgorithm.findMatches(
+        buyOrders,
+        sellOrders,
+        this.activeRules,
+        preferences,
+      );
+      allMatches.push(...geoResult.matches);
+      allRejectedOrders.push(...geoResult.rejectedOrders);
+      totalProcessingTime += geoResult.processingTime;
+    }
+
+    if (preferences.quantity?.allowPartialFulfillment) {
+      const partialResult = await this.partialFulfillmentAlgorithm.findMatches(
+        buyOrders,
+        sellOrders,
+        this.activeRules,
+        preferences,
+      );
+      allMatches.push(...partialResult.matches);
+      allRejectedOrders.push(...partialResult.rejectedOrders);
+      totalProcessingTime += partialResult.processingTime;
+    }
+
+    const deduplicatedMatches = this.deduplicateMatches(allMatches);
+    const finalMatches = this.selectBestMatches(
+      deduplicatedMatches,
+      buyOrders.length + sellOrders.length,
+    );
+
+    return {
+      matches: finalMatches,
+      rejectedOrders: allRejectedOrders,
+      processingTime: totalProcessingTime,
+    };
+  }
+
+  deduplicateMatches(matches: Match[]): Match[] {
+    const uniqueKeys = new Set<string>();
+    const deduplicated: Match[] = [];
+
+    for (const match of matches) {
+      const key = `${match.buyerOrderId}-${match.sellerOrderId}`;
+      if (!uniqueKeys.has(key)) {
+        uniqueKeys.add(key);
+        deduplicated.push(match);
+      }
+    }
+
+    return deduplicated;
+  }
+
+  selectBestMatches(matches: Match[], totalOrders: number): Match[] {
+    const maxMatches = Math.min(matches.length, Math.floor(totalOrders * 0.8));
+
+    return matches
+      .sort((a, b) => (b.matchingScore || 0) - (a.matchingScore || 0))
+      .slice(0, maxMatches);
+  }
+
+  async detectConflicts(
+    matches: Match[],
+  ): Promise<Array<{ matches: Match[]; conflictType: string }>> {
+    const conflicts: Array<{ matches: Match[]; conflictType: string }> = [];
+    const orderMatches = new Map<string, Match[]>();
+
+    for (const match of matches) {
+      if (!orderMatches.has(match.buyerOrderId)) {
+        orderMatches.set(match.buyerOrderId, []);
+      }
+      orderMatches.get(match.buyerOrderId).push(match);
+
+      if (!orderMatches.has(match.sellerOrderId)) {
+        orderMatches.set(match.sellerOrderId, []);
+      }
+      orderMatches.get(match.sellerOrderId).push(match);
+    }
+
+    for (const [orderId, orderMatches] of orderMatches) {
+      if (orderMatches.length > 1) {
+        conflicts.push({
+          matches: orderMatches,
+          conflictType: 'multiple_matches_same_order',
+        });
+      }
+    }
+
+    return conflicts;
+  }
+
+  async resolveConflicts(
+    conflicts: Array<{ matches: Match[]; conflictType: string }>,
+  ): Promise<Match[]> {
+    const resolvedMatches: Match[] = [];
+    const rejectedMatchIds = new Set<string>();
+
+    for (const conflict of conflicts) {
+      const resolution = await this.resolveConflict(conflict);
+
+      resolvedMatches.push(...resolution.resolvedMatches);
+      resolution.rejectedMatches.forEach((match) =>
+        rejectedMatchIds.add(match.id),
+      );
+    }
+
+    return resolvedMatches.filter((match) => !rejectedMatchIds.has(match.id));
+  }
+
+  async resolveConflict(conflict: {
+    matches: Match[];
+    conflictType: string;
+  }): Promise<ConflictResolution> {
+    const conflictId = `conflict_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+
+    const sortedMatches = conflict.matches.sort(
+      (a, b) => (b.matchingScore || 0) - (a.matchingScore || 0),
+    );
+
+    const bestMatch = sortedMatches[0];
+    const resolvedMatches = [bestMatch];
+    const rejectedMatches = sortedMatches.slice(1);
+
+    const resolution: ConflictResolution = {
+      conflictId,
+      conflictingMatches: conflict.matches,
+      resolution: 'keep_best',
+      resolvedMatches,
+      rejectedMatches,
+      reason: `Kept best match with score ${(bestMatch.matchingScore || 0).toFixed(3)}`,
+    };
+
+    await this.logConflictResolution(resolution);
+
+    return resolution;
+  }
+
+  async logConflictResolution(resolution: ConflictResolution) {
+    this.logger.warn(
+      `Conflict resolved: ${resolution.conflictId} - ${resolution.reason}`,
+    );
+
+    for (const match of resolution.resolvedMatches) {
+      if (!match.metadata) match.metadata = {};
+      if (!match.metadata.auditTrail) match.metadata.auditTrail = [];
+
+      match.metadata.auditTrail.push({
+        timestamp: new Date(),
+        action: 'conflict_resolved',
+        reason: resolution.reason,
+        conflictId: resolution.conflictId,
+      } as any);
+    }
+  }
+
+  async saveMatches(matches: Match[]): Promise<Match[]> {
+    if (matches.length === 0) return [];
+
+    const savedMatches = await this.matchRepository.save(matches);
+
+    for (const match of savedMatches) {
+      this.emitEvent('match_created', {
+        matchId: match.id,
+        buyerOrderId: match.buyerOrderId,
+        sellerOrderId: match.sellerOrderId,
+        quantity: match.matchedQuantity,
+        price: match.matchedPrice,
+        score: match.matchingScore,
+      });
+    }
+
+    return savedMatches;
+  }
+
+  async updateOrderStatuses(matches: Match[]) {
+    for (const match of matches) {
+      await this.updateOrderStatus(match.buyerOrderId, 'matched');
+      await this.updateOrderStatus(match.sellerOrderId, 'matched');
+    }
+  }
+
+  async updateOrderStatus(orderId: string, status: string) {
+    await this.orderRepository.update(orderId, { status: status as any });
+  }
+
+  async emitMatchingEvents(matches: Match[]) {
+    for (const match of matches) {
+      this.emitEvent('match_created', {
+        matchId: match.id,
+        buyerOrderId: match.buyerOrderId,
+        sellerOrderId: match.sellerOrderId,
+        quantity: match.matchedQuantity,
+        price: match.matchedPrice,
+        algorithm: match.metadata?.algorithm,
+        score: match.matchingScore,
+      });
+    }
+  }
+
+  emitEvent(type: string, data: any) {
+    const event: MatchingEvent = {
+      type: type as any,
+      data,
+      timestamp: new Date(),
+    };
+
+    this.eventEmitter.emit('matching', event);
+  }
+
+  async updateMetrics(results: any, processingTime: number) {
+    this.metrics.totalOrders += results.rejectedOrders.length;
+    this.metrics.totalMatches += results.matches.length;
+    this.metrics.successRate =
+      this.metrics.totalMatches / (this.metrics.totalOrders || 1);
+    this.metrics.averageProcessingTime =
+      (this.metrics.averageProcessingTime + processingTime) / 2;
+
+    for (const match of results.matches) {
+      this.metrics.matchesByType[match.type] =
+        (this.metrics.matchesByType[match.type] || 0) + 1;
+      this.metrics.matchesByStatus[match.status] =
+        (this.metrics.matchesByStatus[match.status] || 0) + 1;
+    }
+  }
+
+  getDefaultPreferences(): MatchingPreferencesDto {
+    return {
+      strategy: MatchingStrategy.BALANCED,
+      price: {
+        priceTolerance: 10,
+        preferFixedPrice: false,
+      },
+      geographic: {
+        scope: 'regional' as any,
+        maxDistance: 500,
+      },
+      renewable: {
+        preferRenewable: true,
+        minimumRenewablePercentage: 50,
+        allowMixed: true,
+      },
+      quantity: {
+        allowPartialFulfillment: true,
+        partialFulfillmentThreshold: 30,
+      },
+      time: {
+        matchingWindowHours: 24,
+        allowImmediateMatching: true,
+      },
+      quality: {
+        minimumReliabilityScore: 0.7,
+        prioritizeVerifiedSuppliers: true,
+      },
+    };
+  }
+
+  async confirmMatch(matchId: string, userId: string): Promise<Match> {
+    const match = await this.matchRepository.findOne({
+      where: { id: matchId },
+    });
+    if (!match) {
+      throw new Error(`Match ${matchId} not found`);
+    }
+
+    if (match.status !== MatchStatus.PENDING) {
+      throw new Error(`Match ${matchId} is not in pending status`);
+    }
+
+    match.status = MatchStatus.CONFIRMED;
+
+    if (!match.metadata) match.metadata = {};
+    if (!match.metadata.auditTrail) match.metadata.auditTrail = [];
+
+    match.metadata.auditTrail.push({
+      timestamp: new Date(),
+      action: 'match_confirmed',
+      reason: `Match confirmed by user ${userId}`,
+      userId,
+    });
+
+    const savedMatch = await this.matchRepository.save(match);
+
+    this.emitEvent('match_confirmed', {
+      matchId: savedMatch.id,
+      confirmedBy: userId,
+    });
+
+    return savedMatch;
+  }
+
+  async rejectMatch(
+    matchId: string,
+    userId: string,
+    reason?: string,
+  ): Promise<Match> {
+    const match = await this.matchRepository.findOne({
+      where: { id: matchId },
+    });
+    if (!match) {
+      throw new Error(`Match ${matchId} not found`);
+    }
+
+    match.status = MatchStatus.REJECTED;
+
+    if (!match.metadata) match.metadata = {};
+    if (!match.metadata.auditTrail) match.metadata.auditTrail = [];
+
+    match.metadata.auditTrail.push({
+      timestamp: new Date(),
+      action: 'match_rejected',
+      reason: reason || `Match rejected by user ${userId}`,
+      userId,
+    });
+
+    const savedMatch = await this.matchRepository.save(match);
+
+    this.emitEvent('match_rejected', {
+      matchId: savedMatch.id,
+      rejectedBy: userId,
+      reason,
+    });
+
+    await this.updateOrderStatus(match.buyerOrderId, 'pending');
+    await this.updateOrderStatus(match.sellerOrderId, 'pending');
+
+    return savedMatch;
+  }
+
+  async getMetrics(): Promise<MatchingMetrics> {
+    return { ...this.metrics };
+  }
+
+  async getMatchesByOrder(orderId: string): Promise<Match[]> {
+    return this.matchRepository.find({
+      where: [{ buyerOrderId: orderId }, { sellerOrderId: orderId }],
+      order: { createdAt: 'DESC' },
+    });
+  }
+
+  async getActiveMatches(): Promise<Match[]> {
+    return this.matchRepository.find({
+      where: { status: MatchStatus.PENDING },
+      order: { createdAt: 'ASC' },
+    });
+  }
+
+  @Cron(CronExpression.EVERY_MINUTE)
+  async cleanupExpiredMatches() {
+    const expiredMatches = await this.matchRepository.find({
+      where: {
+        expiresAt: LessThan(new Date()),
+        status: MatchStatus.PENDING,
+      },
+    });
+
+    if (expiredMatches.length > 0) {
+      for (const match of expiredMatches) {
+        match.status = MatchStatus.CANCELLED;
+
+        if (!match.metadata) match.metadata = {};
+        if (!match.metadata.auditTrail) match.metadata.auditTrail = [];
+
+        match.metadata.auditTrail.push({
+          timestamp: new Date(),
+          action: 'match_expired',
+          reason: 'Match expired due to timeout',
+        });
+
+        await this.matchRepository.save(match);
+        await this.updateOrderStatus(match.buyerOrderId, 'pending');
+        await this.updateOrderStatus(match.sellerOrderId, 'pending');
+
+        this.emitEvent('match_expired', {
+          matchId: match.id,
+          expiredAt: new Date(),
+        });
+      }
+
+      this.logger.log(`Cleaned up ${expiredMatches.length} expired matches`);
+    }
+  }
+
+  onMatchingEvent(callback: (event: MatchingEvent) => void) {
+    this.eventEmitter.on('matching', callback);
+  }
+
+  async forceMatching(preferences?: MatchingPreferencesDto): Promise<Match[]> {
+    const allOrders = await this.orderRepository.find({
+      where: { status: 'pending' as any },
+    });
+
+    if (allOrders.length === 0) return [];
+
+    const buyOrders = allOrders.filter((order) => order.type === 'buy');
+    const sellOrders = allOrders.filter((order) => order.type === 'sell');
+
+    const matchingPreferences = preferences || this.getDefaultPreferences();
+    const results = await this.runMatchingAlgorithms(
+      buyOrders,
+      sellOrders,
+      matchingPreferences,
+    );
+
+    const conflicts = await this.detectConflicts(results.matches);
+    if (conflicts.length > 0) {
+      const resolvedMatches = await this.resolveConflicts(conflicts);
+      results.matches = resolvedMatches;
+    }
+
+    return await this.saveMatches(results.matches);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/dao/dao.controller.ts.html b/coverage/lcov-report/src/modules/dao/dao.controller.ts.html new file mode 100644 index 0000000..908a64f --- /dev/null +++ b/coverage/lcov-report/src/modules/dao/dao.controller.ts.html @@ -0,0 +1,232 @@ + + + + + + Code coverage report for src/modules/dao/dao.controller.ts + + + + + + + + + +
+
+

All files / src/modules/dao dao.controller.ts

+
+ +
+ 0% + Statements + 0/49 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
+import { DaoService } from './dao.service';
+import { CreateProposalDto } from './dto/create-proposal.dto';
+import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
+
+@Controller('dao')
+@ApiTags('dao')
+export class DaoController {
+  constructor(private readonly daoService: DaoService) {}
+
+  @Get()
+  @ApiOperation({ summary: 'Get all proposals' })
+  async findAll() {
+    return this.daoService.findAll();
+  }
+
+  @Get(':id')
+  @ApiOperation({ summary: 'Get proposal by ID' })
+  async findOne(@Param('id') id: string) {
+    return this.daoService.findOne(id);
+  }
+
+  @Post()
+  @ApiOperation({ summary: 'Create new proposal' })
+  async create(@Body() createProposalDto: CreateProposalDto) {
+    return this.daoService.create(createProposalDto);
+  }
+
+  @Post(':id/vote')
+  @ApiOperation({ summary: 'Vote on proposal' })
+  async vote(
+    @Param('id') id: string,
+    @Body() voteDto: { userId: string; support: boolean },
+  ) {
+    return this.daoService.vote(id, voteDto.userId, voteDto.support);
+  }
+
+  @Post(':id/finalize')
+  @ApiOperation({ summary: 'Finalize proposal' })
+  async finalize(@Param('id') id: string) {
+    return this.daoService.finalize(id);
+  }
+
+  @Get('active')
+  @ApiOperation({ summary: 'Get active proposals' })
+  async getActiveProposals() {
+    return this.daoService.getActiveProposals();
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/dao/dao.service.ts.html b/coverage/lcov-report/src/modules/dao/dao.service.ts.html new file mode 100644 index 0000000..a43158c --- /dev/null +++ b/coverage/lcov-report/src/modules/dao/dao.service.ts.html @@ -0,0 +1,325 @@ + + + + + + Code coverage report for src/modules/dao/dao.service.ts + + + + + + + + + +
+
+

All files / src/modules/dao dao.service.ts

+
+ +
+ 0% + Statements + 0/80 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/80 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import { Proposal } from './entities/proposal.entity';
+
+export interface CreateProposalDto {
+  title: string;
+  description: string;
+  location: string;
+  amount: number;
+  proposerId: string;
+}
+
+export interface VoteDto {
+  userId: string;
+  support: boolean;
+}
+
+@Injectable()
+export class DaoService {
+  private readonly proposals: Proposal[] = [];
+
+  async findAll(): Promise<Proposal[]> {
+    return this.proposals;
+  }
+
+  async findOne(id: string): Promise<Proposal | null> {
+    return this.proposals.find((proposal) => proposal.id === id) || null;
+  }
+
+  async create(createProposalDto: CreateProposalDto): Promise<Proposal> {
+    const proposal: Proposal = {
+      id: Date.now().toString(),
+      title: createProposalDto.title,
+      description: createProposalDto.description,
+      location: createProposalDto.location,
+      amount: createProposalDto.amount,
+      proposerId: createProposalDto.proposerId,
+      votesFor: 0,
+      votesAgainst: 0,
+      status: 'active',
+      endTime: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7 days from now
+      createdAt: new Date(),
+      updatedAt: new Date(),
+    };
+
+    this.proposals.push(proposal);
+    return proposal;
+  }
+
+  async vote(
+    id: string,
+    userId: string,
+    support: boolean,
+  ): Promise<Proposal | null> {
+    const proposal = this.proposals.find((p) => p.id === id);
+    if (proposal && proposal.status === 'active') {
+      if (support) {
+        proposal.votesFor++;
+      } else {
+        proposal.votesAgainst++;
+      }
+      proposal.updatedAt = new Date();
+    }
+    return proposal || null;
+  }
+
+  async finalize(id: string): Promise<Proposal | null> {
+    const proposal = this.proposals.find((p) => p.id === id);
+    if (proposal) {
+      const totalVotes = proposal.votesFor + proposal.votesAgainst;
+      proposal.status =
+        proposal.votesFor > proposal.votesAgainst ? 'passed' : 'rejected';
+      proposal.updatedAt = new Date();
+    }
+    return proposal || null;
+  }
+
+  async getActiveProposals(): Promise<Proposal[]> {
+    return this.proposals.filter((proposal) => proposal.status === 'active');
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/dao/dto/create-proposal.dto.ts.html b/coverage/lcov-report/src/modules/dao/dto/create-proposal.dto.ts.html new file mode 100644 index 0000000..98693f6 --- /dev/null +++ b/coverage/lcov-report/src/modules/dao/dto/create-proposal.dto.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for src/modules/dao/dto/create-proposal.dto.ts + + + + + + + + + +
+
+

All files / src/modules/dao/dto create-proposal.dto.ts

+
+ +
+ 0% + Statements + 0/19 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { IsNumber, IsString, Min } from 'class-validator';
+
+export class CreateProposalDto {
+  @IsString()
+  title: string;
+
+  @IsString()
+  description: string;
+
+  @IsString()
+  location: string;
+
+  @IsNumber()
+  @Min(0)
+  amount: number;
+
+  @IsString()
+  proposerId: string;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/dao/dto/index.html b/coverage/lcov-report/src/modules/dao/dto/index.html new file mode 100644 index 0000000..45870dc --- /dev/null +++ b/coverage/lcov-report/src/modules/dao/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/modules/dao/dto + + + + + + + + + +
+
+

All files src/modules/dao/dto

+
+ +
+ 0% + Statements + 0/19 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
create-proposal.dto.ts +
+
0%0/190%0/10%0/10%0/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/dao/entities/index.html b/coverage/lcov-report/src/modules/dao/entities/index.html new file mode 100644 index 0000000..08dfeec --- /dev/null +++ b/coverage/lcov-report/src/modules/dao/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/modules/dao/entities + + + + + + + + + +
+
+

All files src/modules/dao/entities

+
+ +
+ 0% + Statements + 0/14 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
proposal.entity.ts +
+
0%0/140%0/10%0/10%0/14
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/dao/entities/proposal.entity.ts.html b/coverage/lcov-report/src/modules/dao/entities/proposal.entity.ts.html new file mode 100644 index 0000000..03c663d --- /dev/null +++ b/coverage/lcov-report/src/modules/dao/entities/proposal.entity.ts.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for src/modules/dao/entities/proposal.entity.ts + + + + + + + + + +
+
+

All files / src/modules/dao/entities proposal.entity.ts

+
+ +
+ 0% + Statements + 0/14 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
export interface Proposal {
+  id: string;
+  title: string;
+  description: string;
+  location: string;
+  amount: number;
+  proposerId: string;
+  votesFor: number;
+  votesAgainst: number;
+  status: 'active' | 'passed' | 'rejected';
+  endTime: Date;
+  createdAt: Date;
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/dao/index.html b/coverage/lcov-report/src/modules/dao/index.html new file mode 100644 index 0000000..72bb956 --- /dev/null +++ b/coverage/lcov-report/src/modules/dao/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/modules/dao + + + + + + + + + +
+
+

All files src/modules/dao

+
+ +
+ 0% + Statements + 0/129 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/129 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
dao.controller.ts +
+
0%0/490%0/10%0/10%0/49
dao.service.ts +
+
0%0/800%0/10%0/10%0/80
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/energy/dto/create-energy-trade.dto.ts.html b/coverage/lcov-report/src/modules/energy/dto/create-energy-trade.dto.ts.html new file mode 100644 index 0000000..aafeb09 --- /dev/null +++ b/coverage/lcov-report/src/modules/energy/dto/create-energy-trade.dto.ts.html @@ -0,0 +1,106 @@ + + + + + + Code coverage report for src/modules/energy/dto/create-energy-trade.dto.ts + + + + + + + + + +
+
+

All files / src/modules/energy/dto create-energy-trade.dto.ts

+
+ +
+ 0% + Statements + 0/7 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8  +  +  +  +  +  +  + 
export class CreateEnergyTradeDto {
+  sellerId: string;
+  buyerId: string;
+  amount: number;
+  price: number;
+  type: 'buy' | 'sell';
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/energy/dto/index.html b/coverage/lcov-report/src/modules/energy/dto/index.html new file mode 100644 index 0000000..67dc0ba --- /dev/null +++ b/coverage/lcov-report/src/modules/energy/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/modules/energy/dto + + + + + + + + + +
+
+

All files src/modules/energy/dto

+
+ +
+ 0% + Statements + 0/7 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
create-energy-trade.dto.ts +
+
0%0/70%0/10%0/10%0/7
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/energy/energy.controller.ts.html b/coverage/lcov-report/src/modules/energy/energy.controller.ts.html new file mode 100644 index 0000000..d98b479 --- /dev/null +++ b/coverage/lcov-report/src/modules/energy/energy.controller.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/modules/energy/energy.controller.ts + + + + + + + + + +
+
+

All files / src/modules/energy energy.controller.ts

+
+ +
+ 0% + Statements + 0/46 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
+import { EnergyService } from './energy.service';
+import { CreateEnergyTradeDto } from './dto/create-energy-trade.dto';
+import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
+
+@Controller('energy')
+@ApiTags('energy')
+export class EnergyController {
+  constructor(private readonly energyService: EnergyService) {}
+
+  @Get()
+  @ApiOperation({ summary: 'Get all energy trades' })
+  async findAll() {
+    return this.energyService.findAll();
+  }
+
+  @Get(':id')
+  @ApiOperation({ summary: 'Get energy trade by ID' })
+  async findOne(@Param('id') id: string) {
+    return this.energyService.findOne(id);
+  }
+
+  @Post()
+  @ApiOperation({ summary: 'Create new energy trade' })
+  async create(@Body() createEnergyTradeDto: CreateEnergyTradeDto) {
+    return this.energyService.create(createEnergyTradeDto);
+  }
+
+  @Post(':id/execute')
+  @ApiOperation({ summary: 'Execute energy trade' })
+  async executeTrade(@Param('id') id: string) {
+    return this.energyService.executeTrade(id);
+  }
+
+  @Get('market-price')
+  @ApiOperation({ summary: 'Get current market price' })
+  async getMarketPrice() {
+    return this.energyService.getMarketPrice();
+  }
+
+  @Get('user/:userId')
+  @ApiOperation({ summary: 'Get user energy trades' })
+  async getUserTrades(@Param('userId') userId: string) {
+    return this.energyService.getUserTrades(userId);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/energy/energy.service.ts.html b/coverage/lcov-report/src/modules/energy/energy.service.ts.html new file mode 100644 index 0000000..a13ba07 --- /dev/null +++ b/coverage/lcov-report/src/modules/energy/energy.service.ts.html @@ -0,0 +1,301 @@ + + + + + + Code coverage report for src/modules/energy/energy.service.ts + + + + + + + + + +
+
+

All files / src/modules/energy energy.service.ts

+
+ +
+ 0% + Statements + 0/72 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import { EnergyTrade } from './entities/energy-trade.entity';
+
+export interface CreateEnergyTradeDto {
+  sellerId: string;
+  buyerId: string;
+  amount: number;
+  price: number;
+  type: 'buy' | 'sell';
+}
+
+export interface MarketPriceDto {
+  price: number;
+  timestamp: number;
+  volume24h: number;
+}
+
+@Injectable()
+export class EnergyService {
+  private readonly trades: EnergyTrade[] = [];
+  private marketPrice = 0.08; // Mock market price
+
+  async findAll(): Promise<EnergyTrade[]> {
+    return this.trades;
+  }
+
+  async findOne(id: string): Promise<EnergyTrade | null> {
+    return this.trades.find((trade) => trade.id === id) || null;
+  }
+
+  async create(
+    createEnergyTradeDto: CreateEnergyTradeDto,
+  ): Promise<EnergyTrade> {
+    const trade: EnergyTrade = {
+      id: Date.now().toString(),
+      sellerId: createEnergyTradeDto.sellerId,
+      buyerId: createEnergyTradeDto.buyerId,
+      amount: createEnergyTradeDto.amount,
+      price: createEnergyTradeDto.price,
+      type: createEnergyTradeDto.type,
+      status: 'pending',
+      createdAt: new Date(),
+      updatedAt: new Date(),
+    };
+
+    this.trades.push(trade);
+    return trade;
+  }
+
+  async executeTrade(id: string): Promise<EnergyTrade | null> {
+    const trade = this.trades.find((t) => t.id === id);
+    if (trade) {
+      trade.status = 'executed';
+      trade.updatedAt = new Date();
+    }
+    return trade || null;
+  }
+
+  async getMarketPrice(): Promise<MarketPriceDto> {
+    return {
+      price: this.marketPrice,
+      timestamp: Date.now(),
+      volume24h: 1250000, // Mock volume
+    };
+  }
+
+  async getUserTrades(userId: string): Promise<EnergyTrade[]> {
+    return this.trades.filter(
+      (trade) => trade.sellerId === userId || trade.buyerId === userId,
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/energy/entities/energy-trade.entity.ts.html b/coverage/lcov-report/src/modules/energy/entities/energy-trade.entity.ts.html new file mode 100644 index 0000000..1bc0ab4 --- /dev/null +++ b/coverage/lcov-report/src/modules/energy/entities/energy-trade.entity.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/modules/energy/entities/energy-trade.entity.ts + + + + + + + + + +
+
+

All files / src/modules/energy/entities energy-trade.entity.ts

+
+ +
+ 0% + Statements + 0/11 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12  +  +  +  +  +  +  +  +  +  +  + 
export interface EnergyTrade {
+  id: string;
+  sellerId: string;
+  buyerId: string;
+  amount: number;
+  price: number;
+  type: 'buy' | 'sell';
+  status: 'pending' | 'executed' | 'cancelled';
+  createdAt: Date;
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/energy/entities/index.html b/coverage/lcov-report/src/modules/energy/entities/index.html new file mode 100644 index 0000000..b0c8417 --- /dev/null +++ b/coverage/lcov-report/src/modules/energy/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/modules/energy/entities + + + + + + + + + +
+
+

All files src/modules/energy/entities

+
+ +
+ 0% + Statements + 0/11 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
energy-trade.entity.ts +
+
0%0/110%0/10%0/10%0/11
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/energy/index.html b/coverage/lcov-report/src/modules/energy/index.html new file mode 100644 index 0000000..d5ff828 --- /dev/null +++ b/coverage/lcov-report/src/modules/energy/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/modules/energy + + + + + + + + + +
+
+

All files src/modules/energy

+
+ +
+ 0% + Statements + 0/118 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/118 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
energy.controller.ts +
+
0%0/460%0/10%0/10%0/46
energy.service.ts +
+
0%0/720%0/10%0/10%0/72
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/alerts/alert.service.ts.html b/coverage/lcov-report/src/monitoring/alerts/alert.service.ts.html new file mode 100644 index 0000000..b5af859 --- /dev/null +++ b/coverage/lcov-report/src/monitoring/alerts/alert.service.ts.html @@ -0,0 +1,1291 @@ + + + + + + Code coverage report for src/monitoring/alerts/alert.service.ts + + + + + + + + + +
+
+

All files / src/monitoring/alerts alert.service.ts

+
+ +
+ 0% + Statements + 0/402 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/402 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  TransactionStatusEntity,
+  TransactionStatus,
+  TransactionPriority,
+} from '../entities/transaction-status.entity';
+
+export interface AlertChannel {
+  name: string;
+  send(alert: Alert): Promise<void>;
+  isEnabled(): boolean;
+}
+
+export interface Alert {
+  type: string;
+  severity: 'low' | 'medium' | 'high' | 'critical';
+  message: string;
+  transactionHash: string;
+  metadata?: Record<string, any>;
+  timestamp: Date;
+}
+
+export class EmailAlertChannel implements AlertChannel {
+  name = 'email';
+
+  isEnabled(): boolean {
+    return process.env.ALERT_EMAIL_ENABLED === 'true';
+  }
+
+  async send(alert: Alert): Promise<void> {
+    if (!this.isEnabled()) return;
+
+    this.logger.log(`Email alert sent: ${alert.message}`);
+  }
+}
+
+export class SlackAlertChannel implements AlertChannel {
+  name = 'slack';
+
+  isEnabled(): boolean {
+    return process.env.ALERT_SLACK_ENABLED === 'true';
+  }
+
+  async send(alert: Alert): Promise<void> {
+    if (!this.isEnabled()) return;
+
+    this.logger.log(`Slack alert sent: ${alert.message}`);
+  }
+}
+
+export class WebhookAlertChannel implements AlertChannel {
+  name = 'webhook';
+
+  isEnabled(): boolean {
+    return process.env.ALERT_WEBHOOK_ENABLED === 'true';
+  }
+
+  async send(alert: Alert): Promise<void> {
+    if (!this.isEnabled()) return;
+
+    this.logger.log(`Webhook alert sent: ${alert.message}`);
+  }
+}
+
+@Injectable()
+export class AlertService {
+  private readonly logger = new Logger(AlertService.name);
+  private readonly channels: Map<string, AlertChannel> = new Map();
+  private readonly alertHistory = new Map<string, Alert[]>();
+  private readonly rateLimiter = new Map<string, number>();
+
+  constructor(
+    @InjectRepository(TransactionStatusEntity)
+    private readonly transactionStatusRepository: Repository<TransactionStatusEntity>,
+  ) {
+    this.channels.set('email', new EmailAlertChannel());
+    this.channels.set('slack', new SlackAlertChannel());
+    this.channels.set('webhook', new WebhookAlertChannel());
+  }
+
+  async sendStatusChangeAlert(
+    transaction: TransactionStatusEntity,
+    oldStatus: TransactionStatus,
+    newStatus: TransactionStatus,
+  ): Promise<void> {
+    const severity = this.getAlertSeverity(newStatus, transaction.priority);
+    const message = `Transaction ${transaction.transactionHash} status changed from ${oldStatus} to ${newStatus}`;
+
+    const alert: Alert = {
+      type: 'status_change',
+      severity,
+      message,
+      transactionHash: transaction.transactionHash,
+      metadata: {
+        oldStatus,
+        newStatus,
+        priority: transaction.priority,
+        retryCount: transaction.retryCount,
+      },
+      timestamp: new Date(),
+    };
+
+    await this.sendAlert(alert);
+    await this.recordAlert(transaction, alert);
+  }
+
+  async sendCriticalAlert(
+    message: string,
+    metadata?: Record<string, any>,
+  ): Promise<void> {
+    const alert: Alert = {
+      type: 'critical',
+      severity: 'critical',
+      message,
+      transactionHash: metadata?.transactionHash || 'system',
+      metadata,
+      timestamp: new Date(),
+    };
+
+    await this.sendAlert(alert);
+  }
+
+  async sendFailureAlert(
+    transaction: TransactionStatusEntity,
+    errorMessage: string,
+  ): Promise<void> {
+    const severity =
+      transaction.priority === TransactionPriority.CRITICAL
+        ? 'critical'
+        : 'high';
+    const message = `Transaction ${transaction.transactionHash} failed: ${errorMessage}`;
+
+    const alert: Alert = {
+      type: 'failure',
+      severity,
+      message,
+      transactionHash: transaction.transactionHash,
+      metadata: {
+        errorMessage,
+        retryCount: transaction.retryCount,
+        maxRetries: transaction.maxRetries,
+        priority: transaction.priority,
+      },
+      timestamp: new Date(),
+    };
+
+    await this.sendAlert(alert);
+    await this.recordAlert(transaction, alert);
+  }
+
+  async sendTimeoutAlert(transaction: TransactionStatusEntity): Promise<void> {
+    const severity =
+      transaction.priority === TransactionPriority.CRITICAL
+        ? 'critical'
+        : 'high';
+    const message = `Transaction ${transaction.transactionHash} timed out after 5 minutes`;
+
+    const alert: Alert = {
+      type: 'timeout',
+      severity,
+      message,
+      transactionHash: transaction.transactionHash,
+      metadata: {
+        timeoutDuration: 300000,
+        priority: transaction.priority,
+      },
+      timestamp: new Date(),
+    };
+
+    await this.sendAlert(alert);
+    await this.recordAlert(transaction, alert);
+  }
+
+  async sendRetryAlert(
+    transaction: TransactionStatusEntity,
+    attempt: number,
+  ): Promise<void> {
+    const message = `Retrying transaction ${transaction.transactionHash} (attempt ${attempt}/${transaction.maxRetries})`;
+
+    const alert: Alert = {
+      type: 'retry',
+      severity: 'medium',
+      message,
+      transactionHash: transaction.transactionHash,
+      metadata: {
+        attempt,
+        maxRetries: transaction.maxRetries,
+        priority: transaction.priority,
+      },
+      timestamp: new Date(),
+    };
+
+    await this.sendAlert(alert);
+    await this.recordAlert(transaction, alert);
+  }
+
+  async sendPerformanceAlert(
+    metric: string,
+    value: number,
+    threshold: number,
+    metadata?: Record<string, any>,
+  ): Promise<void> {
+    const message = `Performance alert: ${metric} is ${value} (threshold: ${threshold})`;
+
+    const alert: Alert = {
+      type: 'performance',
+      severity: value > threshold * 1.5 ? 'critical' : 'high',
+      message,
+      transactionHash: 'system',
+      metadata: {
+        metric,
+        value,
+        threshold,
+        ...metadata,
+      },
+      timestamp: new Date(),
+    };
+
+    await this.sendAlert(alert);
+  }
+
+  private async sendAlert(alert: Alert): Promise<void> {
+    if (this.isRateLimited(alert.type)) {
+      this.logger.warn(`Alert type ${alert.type} is rate limited`);
+      return;
+    }
+
+    const enabledChannels = Array.from(this.channels.values()).filter(
+      (channel) =>
+        channel.isEnabled() &&
+        this.shouldSendToChannel(alert.severity, channel.name),
+    );
+
+    const promises = enabledChannels.map((channel) =>
+      channel
+        .send(alert)
+        .catch((error) =>
+          this.logger.error(`Failed to send alert via ${channel.name}:`, error),
+        ),
+    );
+
+    await Promise.allSettled(promises);
+
+    this.updateRateLimiter(alert.type);
+    this.logger.log(`Alert sent: ${alert.message} (${alert.severity})`);
+  }
+
+  private async recordAlert(
+    transaction: TransactionStatusEntity,
+    alert: Alert,
+  ): Promise<void> {
+    const alerts = this.alertHistory.get(transaction.transactionHash) || [];
+    alerts.push(alert);
+
+    if (alerts.length > 100) {
+      alerts.shift();
+    }
+
+    this.alertHistory.set(transaction.transactionHash, alerts);
+
+    const entityAlerts = transaction.alerts || [];
+    entityAlerts.push({
+      type: alert.type,
+      message: alert.message,
+      severity: alert.severity,
+      sentAt: alert.timestamp,
+    });
+
+    await this.transactionStatusRepository.update(
+      { transactionHash: transaction.transactionHash },
+      { alerts: entityAlerts },
+    );
+  }
+
+  private getAlertSeverity(
+    status: TransactionStatus,
+    priority: TransactionPriority,
+  ): 'low' | 'medium' | 'high' | 'critical' {
+    if (
+      status === TransactionStatus.FAILED ||
+      status === TransactionStatus.TIMEOUT
+    ) {
+      return priority === TransactionPriority.CRITICAL ? 'critical' : 'high';
+    }
+
+    if (status === TransactionStatus.RETRYING) {
+      return priority === TransactionPriority.CRITICAL ? 'high' : 'medium';
+    }
+
+    return 'low';
+  }
+
+  private shouldSendToChannel(severity: string, channelName: string): boolean {
+    const channelThresholds: Record<string, string[]> = {
+      email: ['medium', 'high', 'critical'],
+      slack: ['high', 'critical'],
+      webhook: ['critical'],
+    };
+
+    const threshold = channelThresholds[channelName] || ['critical'];
+    return threshold.includes(severity);
+  }
+
+  private isRateLimited(alertType: string): boolean {
+    const now = Date.now();
+    const lastSent = this.rateLimiter.get(alertType) || 0;
+    const rateLimitWindow = 60000;
+
+    return now - lastSent < rateLimitWindow;
+  }
+
+  private updateRateLimiter(alertType: string): void {
+    this.rateLimiter.set(alertType, Date.now());
+  }
+
+  async getAlertHistory(transactionHash: string): Promise<Alert[]> {
+    return this.alertHistory.get(transactionHash) || [];
+  }
+
+  async getSystemAlerts(limit: number = 100): Promise<Alert[]> {
+    const allAlerts: Alert[] = [];
+
+    for (const alerts of this.alertHistory.values()) {
+      allAlerts.push(...alerts);
+    }
+
+    return allAlerts
+      .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())
+      .slice(0, limit);
+  }
+
+  getAlertStats(): {
+    totalAlerts: number;
+    alertsByType: Record<string, number>;
+    alertsBySeverity: Record<string, number>;
+    rateLimitedTypes: string[];
+  } {
+    const allAlerts: Alert[] = [];
+
+    for (const alerts of this.alertHistory.values()) {
+      allAlerts.push(...alerts);
+    }
+
+    const alertsByType = allAlerts.reduce(
+      (acc, alert) => {
+        acc[alert.type] = (acc[alert.type] || 0) + 1;
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+
+    const alertsBySeverity = allAlerts.reduce(
+      (acc, alert) => {
+        acc[alert.severity] = (acc[alert.severity] || 0) + 1;
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+
+    return {
+      totalAlerts: allAlerts.length,
+      alertsByType,
+      alertsBySeverity,
+      rateLimitedTypes: Array.from(this.rateLimiter.keys()),
+    };
+  }
+
+  registerAlertChannel(channel: AlertChannel): void {
+    this.channels.set(channel.name, channel);
+    this.logger.log(`Registered alert channel: ${channel.name}`);
+  }
+
+  async testAlertChannels(): Promise<Record<string, boolean>> {
+    const testAlert: Alert = {
+      type: 'test',
+      severity: 'low',
+      message: 'Test alert from monitoring system',
+      transactionHash: 'test',
+      timestamp: new Date(),
+    };
+
+    const results: Record<string, boolean> = {};
+
+    for (const [name, channel] of this.channels) {
+      if (channel.isEnabled()) {
+        try {
+          await channel.send(testAlert);
+          results[name] = true;
+        } catch (error) {
+          results[name] = false;
+          this.logger.error(`Test failed for channel ${name}:`, error);
+        }
+      } else {
+        results[name] = false;
+      }
+    }
+
+    return results;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/alerts/index.html b/coverage/lcov-report/src/monitoring/alerts/index.html new file mode 100644 index 0000000..1730dbf --- /dev/null +++ b/coverage/lcov-report/src/monitoring/alerts/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/monitoring/alerts + + + + + + + + + +
+
+

All files src/monitoring/alerts

+
+ +
+ 0% + Statements + 0/402 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/402 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
alert.service.ts +
+
0%0/4020%0/10%0/10%0/402
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/dto/index.html b/coverage/lcov-report/src/monitoring/dto/index.html new file mode 100644 index 0000000..077dbe8 --- /dev/null +++ b/coverage/lcov-report/src/monitoring/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/monitoring/dto + + + + + + + + + +
+
+

All files src/monitoring/dto

+
+ +
+ 0% + Statements + 0/317 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/317 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transaction-status.dto.ts +
+
0%0/3170%0/10%0/10%0/317
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/dto/transaction-status.dto.ts.html b/coverage/lcov-report/src/monitoring/dto/transaction-status.dto.ts.html new file mode 100644 index 0000000..c9ec8fa --- /dev/null +++ b/coverage/lcov-report/src/monitoring/dto/transaction-status.dto.ts.html @@ -0,0 +1,1036 @@ + + + + + + Code coverage report for src/monitoring/dto/transaction-status.dto.ts + + + + + + + + + +
+
+

All files / src/monitoring/dto transaction-status.dto.ts

+
+ +
+ 0% + Statements + 0/317 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/317 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsEnum,
+  IsOptional,
+  IsNumber,
+  IsDateString,
+  IsObject,
+  IsBoolean,
+  IsArray,
+  ValidateNested,
+  IsUUID,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import {
+  TransactionStatus,
+  TransactionPriority,
+} from '../entities/transaction-status.entity';
+
+export class CreateTransactionStatusDto {
+  @IsString()
+  transactionHash: string;
+
+  @IsOptional()
+  @IsEnum(TransactionPriority)
+  priority?: TransactionPriority;
+
+  @IsOptional()
+  @IsString()
+  sourceAccount?: string;
+
+  @IsOptional()
+  @IsString()
+  destinationAccount?: string;
+
+  @IsOptional()
+  @IsNumber()
+  amount?: number;
+
+  @IsOptional()
+  @IsString()
+  assetCode?: string;
+
+  @IsOptional()
+  @IsString()
+  assetIssuer?: string;
+
+  @IsOptional()
+  @IsString()
+  memo?: string;
+
+  @IsOptional()
+  @IsObject()
+  metadata?: Record<string, any>;
+
+  @IsOptional()
+  @IsNumber()
+  maxRetries?: number;
+
+  @IsOptional()
+  @IsDateString()
+  timeoutAt?: string;
+}
+
+export class UpdateTransactionStatusDto {
+  @IsOptional()
+  @IsEnum(TransactionStatus)
+  status?: TransactionStatus;
+
+  @IsOptional()
+  @IsString()
+  errorMessage?: string;
+
+  @IsOptional()
+  @IsObject()
+  metadata?: Record<string, any>;
+
+  @IsOptional()
+  @IsNumber()
+  retryCount?: number;
+
+  @IsOptional()
+  @IsNumber()
+  ledgerSequence?: number;
+
+  @IsOptional()
+  @IsDateString()
+  confirmedAt?: string;
+
+  @IsOptional()
+  @IsDateString()
+  lastRetryAt?: string;
+
+  @IsOptional()
+  @IsDateString()
+  timeoutAt?: string;
+
+  @IsOptional()
+  @IsDateString()
+  expiresAt?: string;
+
+  @IsOptional()
+  @IsBoolean()
+  isArchived?: boolean;
+}
+
+export class TransactionStatusQueryDto {
+  @IsOptional()
+  @IsEnum(TransactionStatus)
+  status?: TransactionStatus;
+
+  @IsOptional()
+  @IsEnum(TransactionPriority)
+  priority?: TransactionPriority;
+
+  @IsOptional()
+  @IsString()
+  sourceAccount?: string;
+
+  @IsOptional()
+  @IsString()
+  destinationAccount?: string;
+
+  @IsOptional()
+  @IsDateString()
+  startDate?: string;
+
+  @IsOptional()
+  @IsDateString()
+  endDate?: string;
+
+  @IsOptional()
+  @IsNumber()
+  minAmount?: number;
+
+  @IsOptional()
+  @IsNumber()
+  maxAmount?: number;
+
+  @IsOptional()
+  @IsNumber()
+  page?: number = 1;
+
+  @IsOptional()
+  @IsNumber()
+  limit?: number = 50;
+
+  @IsOptional()
+  @IsString()
+  sortBy?: string = 'createdAt';
+
+  @IsOptional()
+  @IsString()
+  sortOrder?: 'ASC' | 'DESC' = 'DESC';
+}
+
+export class TransactionAlertDto {
+  @IsString()
+  type: string;
+
+  @IsString()
+  message: string;
+
+  @IsString()
+  severity: string;
+
+  @IsDateString()
+  sentAt: string;
+}
+
+export class TransactionStatusResponseDto {
+  @IsUUID()
+  id: string;
+
+  @IsString()
+  transactionHash: string;
+
+  @IsEnum(TransactionStatus)
+  status: TransactionStatus;
+
+  @IsEnum(TransactionPriority)
+  priority: TransactionPriority;
+
+  @IsOptional()
+  @IsString()
+  sourceAccount?: string;
+
+  @IsOptional()
+  @IsString()
+  destinationAccount?: string;
+
+  @IsOptional()
+  @IsNumber()
+  amount?: number;
+
+  @IsOptional()
+  @IsString()
+  assetCode?: string;
+
+  @IsOptional()
+  @IsString()
+  assetIssuer?: string;
+
+  @IsOptional()
+  @IsString()
+  memo?: string;
+
+  @IsOptional()
+  @IsString()
+  errorMessage?: string;
+
+  @IsOptional()
+  @IsObject()
+  metadata?: Record<string, any>;
+
+  @IsNumber()
+  retryCount: number;
+
+  @IsNumber()
+  maxRetries: number;
+
+  @IsOptional()
+  @IsNumber()
+  ledgerSequence?: number;
+
+  @IsOptional()
+  @IsDateString()
+  confirmedAt?: string;
+
+  @IsOptional()
+  @IsDateString()
+  lastRetryAt?: string;
+
+  @IsOptional()
+  @IsDateString()
+  timeoutAt?: string;
+
+  @IsDateString()
+  createdAt: string;
+
+  @IsDateString()
+  updatedAt: string;
+
+  @IsOptional()
+  @IsDateString()
+  expiresAt?: string;
+
+  @IsBoolean()
+  isArchived: boolean;
+
+  @IsOptional()
+  @IsArray()
+  @ValidateNested({ each: true })
+  @Type(() => TransactionAlertDto)
+  alerts?: TransactionAlertDto[];
+}
+
+export class TransactionAnalyticsDto {
+  @IsNumber()
+  totalTransactions: number;
+
+  @IsNumber()
+  pendingTransactions: number;
+
+  @IsNumber()
+  confirmedTransactions: number;
+
+  @IsNumber()
+  failedTransactions: number;
+
+  @IsNumber()
+  retryingTransactions: number;
+
+  @IsNumber()
+  timeoutTransactions: number;
+
+  @IsNumber()
+  successRate: number;
+
+  @IsNumber()
+  averageConfirmationTime: number;
+
+  @IsNumber()
+  averageRetryCount: number;
+
+  @IsObject()
+  statusBreakdown: Record<TransactionStatus, number>;
+
+  @IsObject()
+  priorityBreakdown: Record<TransactionPriority, number>;
+
+  @IsObject()
+  hourlyStats: Record<
+    string,
+    {
+      count: number;
+      successRate: number;
+      averageTime: number;
+    }
+  >;
+}
+
+export class RetryTransactionDto {
+  @IsUUID()
+  transactionId: string;
+
+  @IsOptional()
+  @IsEnum(TransactionPriority)
+  priority?: TransactionPriority;
+
+  @IsOptional()
+  @IsNumber()
+  maxRetries?: number;
+
+  @IsOptional()
+  @IsNumber()
+  retryDelay?: number;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/entities/index.html b/coverage/lcov-report/src/monitoring/entities/index.html new file mode 100644 index 0000000..f27f0c0 --- /dev/null +++ b/coverage/lcov-report/src/monitoring/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/monitoring/entities + + + + + + + + + +
+
+

All files src/monitoring/entities

+
+ +
+ 0% + Statements + 0/112 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/112 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transaction-status.entity.ts +
+
0%0/1120%0/10%0/10%0/112
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/entities/transaction-status.entity.ts.html b/coverage/lcov-report/src/monitoring/entities/transaction-status.entity.ts.html new file mode 100644 index 0000000..239a84f --- /dev/null +++ b/coverage/lcov-report/src/monitoring/entities/transaction-status.entity.ts.html @@ -0,0 +1,421 @@ + + + + + + Code coverage report for src/monitoring/entities/transaction-status.entity.ts + + + + + + + + + +
+
+

All files / src/monitoring/entities transaction-status.entity.ts

+
+ +
+ 0% + Statements + 0/112 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/112 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+
+export enum TransactionStatus {
+  PENDING = 'pending',
+  CONFIRMED = 'confirmed',
+  FAILED = 'failed',
+  RETRYING = 'retrying',
+  TIMEOUT = 'timeout',
+}
+
+export enum TransactionPriority {
+  LOW = 'low',
+  MEDIUM = 'medium',
+  HIGH = 'high',
+  CRITICAL = 'critical',
+}
+
+@Entity('transaction_status')
+@Index(['transactionHash'])
+@Index(['status'])
+@Index(['createdAt'])
+@Index(['priority'])
+export class TransactionStatusEntity {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ unique: true })
+  transactionHash: string;
+
+  @Column({
+    type: 'enum',
+    enum: TransactionStatus,
+    default: TransactionStatus.PENDING,
+  })
+  status: TransactionStatus;
+
+  @Column({
+    type: 'enum',
+    enum: TransactionPriority,
+    default: TransactionPriority.MEDIUM,
+  })
+  priority: TransactionPriority;
+
+  @Column({ nullable: true })
+  sourceAccount: string;
+
+  @Column({ nullable: true })
+  destinationAccount: string;
+
+  @Column({ type: 'decimal', precision: 20, scale: 7, nullable: true })
+  amount: number;
+
+  @Column({ nullable: true })
+  assetCode: string;
+
+  @Column({ nullable: true })
+  assetIssuer: string;
+
+  @Column({ nullable: true })
+  memo: string;
+
+  @Column({ type: 'text', nullable: true })
+  errorMessage: string;
+
+  @Column({ type: 'json', nullable: true })
+  metadata: Record<string, any>;
+
+  @Column({ default: 0 })
+  retryCount: number;
+
+  @Column({ default: 3 })
+  maxRetries: number;
+
+  @Column({ type: 'bigint', nullable: true })
+  ledgerSequence: number;
+
+  @Column({ type: 'timestamp', nullable: true })
+  confirmedAt: Date;
+
+  @Column({ type: 'timestamp', nullable: true })
+  lastRetryAt: Date;
+
+  @Column({ type: 'timestamp', nullable: true })
+  timeoutAt: Date;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @UpdateDateColumn()
+  updatedAt: Date;
+
+  @Column({ type: 'timestamp', nullable: true })
+  expiresAt: Date;
+
+  @Column({ default: false })
+  isArchived: boolean;
+
+  @Column({ type: 'json', nullable: true })
+  alerts: Array<{
+    type: string;
+    message: string;
+    severity: string;
+    sentAt: Date;
+  }>;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/index.html b/coverage/lcov-report/src/monitoring/index.html new file mode 100644 index 0000000..aa93c4b --- /dev/null +++ b/coverage/lcov-report/src/monitoring/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/monitoring + + + + + + + + + +
+
+

All files src/monitoring

+
+ +
+ 0% + Statements + 0/559 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/559 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
monitoring.controller.ts +
+
0%0/400%0/10%0/10%0/40
monitoring.module.ts +
+
0%0/300%0/10%0/10%0/30
transaction-monitor.service.ts +
+
0%0/4890%0/10%0/10%0/489
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/monitoring.controller.ts.html b/coverage/lcov-report/src/monitoring/monitoring.controller.ts.html new file mode 100644 index 0000000..dd6eb65 --- /dev/null +++ b/coverage/lcov-report/src/monitoring/monitoring.controller.ts.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for src/monitoring/monitoring.controller.ts + + + + + + + + + +
+
+

All files / src/monitoring monitoring.controller.ts

+
+ +
+ 0% + Statements + 0/40 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, Post, Body, Query, Param } from '@nestjs/common';
+import { TransactionMonitorService } from './transaction-monitor.service';
+import {
+  CreateTransactionStatusDto,
+  TransactionStatusQueryDto,
+} from './dto/transaction-status.dto';
+
+@Controller('monitoring')
+export class MonitoringController {
+  constructor(
+    private readonly transactionMonitorService: TransactionMonitorService,
+  ) {}
+
+  @Post('transactions')
+  async createTransaction(@Body() createDto: CreateTransactionStatusDto) {
+    return this.transactionMonitorService.createTransaction(createDto);
+  }
+
+  @Get('transactions/:hash')
+  async getTransaction(@Param('hash') hash: string) {
+    return this.transactionMonitorService.getTransaction(hash);
+  }
+
+  @Get('transactions')
+  async getTransactions(@Query() query: TransactionStatusQueryDto) {
+    return this.transactionMonitorService.getTransactions(query);
+  }
+
+  @Get('analytics')
+  async getAnalytics(
+    @Query('timeRange') timeRange: 'hour' | 'day' | 'week' | 'month' = 'day',
+  ) {
+    return this.transactionMonitorService.getTransactionAnalytics(timeRange);
+  }
+
+  @Get('stats')
+  async getMonitoringStats() {
+    return this.transactionMonitorService.getMonitoringStats();
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/monitoring.module.ts.html b/coverage/lcov-report/src/monitoring/monitoring.module.ts.html new file mode 100644 index 0000000..24ba7af --- /dev/null +++ b/coverage/lcov-report/src/monitoring/monitoring.module.ts.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/monitoring/monitoring.module.ts + + + + + + + + + +
+
+

All files / src/monitoring monitoring.module.ts

+
+ +
+ 0% + Statements + 0/30 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ScheduleModule } from '@nestjs/schedule';
+import { TransactionStatusEntity } from './entities/transaction-status.entity';
+import { TransactionMonitorService } from './transaction-monitor.service';
+import { RetryService } from './retry/retry.service';
+import { AlertService } from './alerts/alert.service';
+import { TransactionWorkflowService } from './workflows/transaction.workflow';
+import { MonitoringController } from './monitoring.controller';
+
+@Module({
+  imports: [
+    TypeOrmModule.forFeature([TransactionStatusEntity]),
+    ScheduleModule,
+  ],
+  controllers: [MonitoringController],
+  providers: [
+    TransactionMonitorService,
+    RetryService,
+    AlertService,
+    TransactionWorkflowService,
+  ],
+  exports: [
+    TransactionMonitorService,
+    RetryService,
+    AlertService,
+    TransactionWorkflowService,
+  ],
+})
+export class MonitoringModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/retry/index.html b/coverage/lcov-report/src/monitoring/retry/index.html new file mode 100644 index 0000000..cbe7def --- /dev/null +++ b/coverage/lcov-report/src/monitoring/retry/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/monitoring/retry + + + + + + + + + +
+
+

All files src/monitoring/retry

+
+ +
+ 0% + Statements + 0/434 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/434 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
retry.service.ts +
+
0%0/4340%0/10%0/10%0/434
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/retry/retry.service.ts.html b/coverage/lcov-report/src/monitoring/retry/retry.service.ts.html new file mode 100644 index 0000000..8b45386 --- /dev/null +++ b/coverage/lcov-report/src/monitoring/retry/retry.service.ts.html @@ -0,0 +1,1387 @@ + + + + + + Code coverage report for src/monitoring/retry/retry.service.ts + + + + + + + + + +
+
+

All files / src/monitoring/retry retry.service.ts

+
+ +
+ 0% + Statements + 0/434 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/434 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleDestroy } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  TransactionStatusEntity,
+  TransactionStatus,
+  TransactionPriority,
+} from '../entities/transaction-status.entity';
+import { RetryTransactionDto } from '../dto/transaction-status.dto';
+
+const StellarSdk = require('stellar-sdk');
+
+export interface RetryStrategy {
+  calculateDelay(attempt: number, priority: TransactionPriority): number;
+  shouldRetry(error: any, attempt: number, maxRetries: number): boolean;
+}
+
+export class ExponentialBackoffStrategy implements RetryStrategy {
+  calculateDelay(attempt: number, priority: TransactionPriority): number {
+    const baseDelay = this.getBaseDelay(priority);
+    const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);
+    const jitter = Math.random() * 1000;
+    return Math.min(exponentialDelay + jitter, 30000);
+  }
+
+  shouldRetry(error: any, attempt: number, maxRetries: number): boolean {
+    if (attempt >= maxRetries) {
+      return false;
+    }
+
+    const nonRetryableErrors = [
+      'tx_insufficient_fee',
+      'tx_no_source_account',
+      'tx_bad_auth',
+      'tx_bad_auth_extra',
+      'tx_internal_error',
+    ];
+
+    const errorMessage = error?.message?.toLowerCase() || '';
+
+    return !nonRetryableErrors.some((nonRetryableError) =>
+      errorMessage.includes(nonRetryableError),
+    );
+  }
+
+  private getBaseDelay(priority: TransactionPriority): number {
+    switch (priority) {
+      case TransactionPriority.CRITICAL:
+        return 1000;
+      case TransactionPriority.HIGH:
+        return 2000;
+      case TransactionPriority.MEDIUM:
+        return 5000;
+      case TransactionPriority.LOW:
+        return 10000;
+      default:
+        return 5000;
+    }
+  }
+}
+
+export class LinearBackoffStrategy implements RetryStrategy {
+  calculateDelay(attempt: number, priority: TransactionPriority): number {
+    const baseDelay = this.getBaseDelay(priority);
+    return baseDelay * attempt;
+  }
+
+  shouldRetry(error: any, attempt: number, maxRetries: number): boolean {
+    return attempt < maxRetries && this.isTransientError(error);
+  }
+
+  private isTransientError(error: any): boolean {
+    const transientErrors = [
+      'timeout',
+      'network',
+      'connection',
+      'rate_limit',
+      'server_error',
+    ];
+
+    const errorMessage = error?.message?.toLowerCase() || '';
+    return transientErrors.some((transientError) =>
+      errorMessage.includes(transientError),
+    );
+  }
+
+  private getBaseDelay(priority: TransactionPriority): number {
+    switch (priority) {
+      case TransactionPriority.CRITICAL:
+        return 500;
+      case TransactionPriority.HIGH:
+        return 1000;
+      case TransactionPriority.MEDIUM:
+        return 2000;
+      case TransactionPriority.LOW:
+        return 5000;
+      default:
+        return 2000;
+    }
+  }
+}
+
+@Injectable()
+export class RetryService {
+  private readonly logger = new Logger(RetryService.name);
+  private readonly retryQueue = new Map<string, NodeJS.Timeout>();
+  private readonly activeRetries = new Set<string>();
+  private readonly strategies: Map<string, RetryStrategy> = new Map();
+
+  constructor(
+    @InjectRepository(TransactionStatusEntity)
+    private readonly transactionStatusRepository: Repository<TransactionStatusEntity>,
+  ) {
+    this.strategies.set('exponential', new ExponentialBackoffStrategy());
+    this.strategies.set('linear', new LinearBackoffStrategy());
+    this.strategies.set('default', new ExponentialBackoffStrategy());
+  }
+
+  async scheduleRetry(
+    transaction: TransactionStatusEntity,
+    strategy: string = 'exponential',
+  ): Promise<void> {
+    if (this.activeRetries.has(transaction.transactionHash)) {
+      this.logger.warn(
+        `Retry already in progress for transaction ${transaction.transactionHash}`,
+      );
+      return;
+    }
+
+    const retryStrategy =
+      this.strategies.get(strategy) || this.strategies.get('default');
+
+    if (
+      !retryStrategy.shouldRetry(
+        { message: transaction.errorMessage },
+        transaction.retryCount,
+        transaction.maxRetries,
+      )
+    ) {
+      this.logger.log(
+        `Transaction ${transaction.transactionHash} should not be retried`,
+      );
+      return;
+    }
+
+    const delay = retryStrategy.calculateDelay(
+      transaction.retryCount + 1,
+      transaction.priority,
+    );
+
+    this.activeRetries.add(transaction.transactionHash);
+
+    const retryTimeout = setTimeout(async () => {
+      try {
+        await this.executeRetry(transaction);
+      } catch (error) {
+        this.logger.error(
+          `Retry failed for transaction ${transaction.transactionHash}:`,
+          error,
+        );
+      } finally {
+        this.activeRetries.delete(transaction.transactionHash);
+        this.retryQueue.delete(transaction.transactionHash);
+      }
+    }, delay);
+
+    this.retryQueue.set(transaction.transactionHash, retryTimeout);
+
+    await this.updateTransactionForRetry(transaction);
+
+    this.logger.log(
+      `Scheduled retry for transaction ${transaction.transactionHash} in ${delay}ms (attempt ${transaction.retryCount + 1}/${transaction.maxRetries})`,
+    );
+  }
+
+  async manualRetry(
+    retryDto: RetryTransactionDto,
+  ): Promise<TransactionStatusEntity> {
+    const transaction = await this.transactionStatusRepository.findOne({
+      where: { id: retryDto.transactionId },
+    });
+
+    if (!transaction) {
+      throw new Error(
+        `Transaction with ID ${retryDto.transactionId} not found`,
+      );
+    }
+
+    if (
+      transaction.status !== TransactionStatus.FAILED &&
+      transaction.status !== TransactionStatus.TIMEOUT
+    ) {
+      throw new Error(
+        `Cannot retry transaction with status ${transaction.status}`,
+      );
+    }
+
+    if (retryDto.priority) {
+      transaction.priority = retryDto.priority;
+    }
+
+    if (retryDto.maxRetries) {
+      transaction.maxRetries = retryDto.maxRetries;
+    }
+
+    await this.cancelRetry(transaction.transactionHash);
+
+    await this.scheduleRetry(transaction);
+
+    return transaction;
+  }
+
+  async executeRetry(transaction: TransactionStatusEntity): Promise<void> {
+    this.logger.log(
+      `Executing retry for transaction ${transaction.transactionHash}`,
+    );
+
+    try {
+      const transactionStatus = await this.checkTransactionOnNetwork(
+        transaction.transactionHash,
+      );
+
+      if (transactionStatus.successful) {
+        await this.transactionStatusRepository.update(
+          { transactionHash: transaction.transactionHash },
+          {
+            status: TransactionStatus.CONFIRMED,
+            confirmedAt: new Date(),
+            ledgerSequence: transactionStatus.ledger,
+            errorMessage: undefined,
+          },
+        );
+
+        this.logger.log(
+          `Transaction ${transaction.transactionHash} was confirmed during retry check`,
+        );
+        return;
+      }
+
+      if (!transactionStatus.successful) {
+        throw new Error(
+          `Transaction failed on network: ${transactionStatus.result_xdr}`,
+        );
+      }
+    } catch (error: any) {
+      const retryStrategy = this.strategies.get('exponential');
+
+      transaction.retryCount++;
+      transaction.errorMessage = error.message;
+      transaction.lastRetryAt = new Date();
+
+      if (transaction.retryCount >= transaction.maxRetries) {
+        transaction.status = TransactionStatus.FAILED;
+        await this.transactionStatusRepository.save(transaction);
+
+        this.logger.error(
+          `Transaction ${transaction.transactionHash} failed after ${transaction.maxRetries} retries`,
+        );
+
+        throw new Error(
+          `Transaction failed after maximum retries: ${error.message}`,
+        );
+      }
+
+      if (
+        retryStrategy.shouldRetry(
+          error,
+          transaction.retryCount,
+          transaction.maxRetries,
+        )
+      ) {
+        transaction.status = TransactionStatus.RETRYING;
+        await this.transactionStatusRepository.save(transaction);
+
+        await this.scheduleRetry(transaction);
+      } else {
+        transaction.status = TransactionStatus.FAILED;
+        await this.transactionStatusRepository.save(transaction);
+
+        this.logger.error(
+          `Transaction ${transaction.transactionHash} marked as failed due to non-retryable error: ${error.message}`,
+        );
+
+        throw new Error(`Non-retryable error: ${error.message}`);
+      }
+    }
+  }
+
+  private async checkTransactionOnNetwork(
+    transactionHash: string,
+  ): Promise<any> {
+    const StellarSdk = require('stellar-sdk');
+    const server = new StellarSdk.Horizon.Server(
+      process.env.STELLAR_HORIZON_URL || 'https://horizon-testnet.stellar.org',
+    );
+
+    try {
+      return await server.transactions().transaction(transactionHash).call();
+    } catch (error: any) {
+      if (error.response?.status === 404) {
+        throw new Error('Transaction not found on network');
+      }
+      throw error;
+    }
+  }
+
+  private async updateTransactionForRetry(
+    transaction: TransactionStatusEntity,
+  ): Promise<void> {
+    await this.transactionStatusRepository.update(
+      { transactionHash: transaction.transactionHash },
+      {
+        status: TransactionStatus.RETRYING,
+        retryCount: transaction.retryCount + 1,
+        lastRetryAt: new Date(),
+      },
+    );
+  }
+
+  async cancelRetry(transactionHash: string): Promise<void> {
+    const retryTimeout = this.retryQueue.get(transactionHash);
+    if (retryTimeout) {
+      clearTimeout(retryTimeout);
+      this.retryQueue.delete(transactionHash);
+      this.activeRetries.delete(transactionHash);
+
+      await this.transactionStatusRepository.update(
+        { transactionHash },
+        { status: TransactionStatus.FAILED },
+      );
+
+      this.logger.log(`Cancelled retry for transaction ${transactionHash}`);
+    }
+  }
+
+  async cancelAllRetries(): Promise<void> {
+    const retryHashes = Array.from(this.retryQueue.keys());
+
+    for (const hash of retryHashes) {
+      await this.cancelRetry(hash);
+    }
+
+    this.logger.log(`Cancelled ${retryHashes.length} pending retries`);
+  }
+
+  getRetryStats(): {
+    activeRetries: number;
+    queuedRetries: number;
+    retryStrategies: string[];
+  } {
+    return {
+      activeRetries: this.activeRetries.size,
+      queuedRetries: this.retryQueue.size,
+      retryStrategies: Array.from(this.strategies.keys()),
+    };
+  }
+
+  async getRetryHistory(transactionHash: string): Promise<{
+    transactionHash: string;
+    retryCount: number;
+    maxRetries: number;
+    lastRetryAt?: Date;
+    retryHistory: Array<{
+      attempt: number;
+      timestamp: Date;
+      error?: string;
+      delay: number;
+    }>;
+  }> {
+    const transaction = await this.transactionStatusRepository.findOne({
+      where: { transactionHash },
+    });
+
+    if (!transaction) {
+      throw new Error(`Transaction ${transactionHash} not found`);
+    }
+
+    const retryHistory: Array<{
+      attempt: number;
+      timestamp: Date;
+      error?: string;
+      delay: number;
+    }> = [];
+
+    for (let i = 1; i <= transaction.retryCount; i++) {
+      const strategy = this.strategies.get('exponential');
+      const delay = strategy.calculateDelay(i, transaction.priority);
+
+      retryHistory.push({
+        attempt: i,
+        timestamp: new Date(transaction.createdAt.getTime() + delay * i),
+        delay,
+      });
+    }
+
+    return {
+      transactionHash: transaction.transactionHash,
+      retryCount: transaction.retryCount,
+      maxRetries: transaction.maxRetries,
+      lastRetryAt: transaction.lastRetryAt,
+      retryHistory,
+    };
+  }
+
+  async prioritizeRetries(): Promise<void> {
+    const retryingTransactions = await this.transactionStatusRepository.find({
+      where: { status: TransactionStatus.RETRYING },
+      order: [{ priority: 'DESC' }, { lastRetryAt: 'ASC' }] as any,
+    });
+
+    for (const transaction of retryingTransactions) {
+      if (!this.activeRetries.has(transaction.transactionHash)) {
+        await this.scheduleRetry(transaction, 'exponential');
+      }
+    }
+
+    this.logger.log(
+      `Reprioritized ${retryingTransactions.length} retrying transactions`,
+    );
+  }
+
+  registerRetryStrategy(name: string, strategy: RetryStrategy): void {
+    this.strategies.set(name, strategy);
+    this.logger.log(`Registered retry strategy: ${name}`);
+  }
+
+  getRetryStrategy(name: string): RetryStrategy | undefined {
+    return this.strategies.get(name);
+  }
+
+  async onModuleDestroy(): Promise<void> {
+    await this.cancelAllRetries();
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/transaction-monitor.service.ts.html b/coverage/lcov-report/src/monitoring/transaction-monitor.service.ts.html new file mode 100644 index 0000000..6ad438a --- /dev/null +++ b/coverage/lcov-report/src/monitoring/transaction-monitor.service.ts.html @@ -0,0 +1,1552 @@ + + + + + + Code coverage report for src/monitoring/transaction-monitor.service.ts + + + + + + + + + +
+
+

All files / src/monitoring transaction-monitor.service.ts

+
+ +
+ 0% + Statements + 0/489 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/489 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, LessThan, MoreThan, Between } from 'typeorm';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import {
+  TransactionStatusEntity,
+  TransactionStatus,
+  TransactionPriority,
+} from './entities/transaction-status.entity';
+import {
+  CreateTransactionStatusDto,
+  TransactionStatusQueryDto,
+  TransactionAnalyticsDto,
+} from './dto/transaction-status.dto';
+import { RetryService } from './retry/retry.service';
+import { AlertService } from './alerts/alert.service';
+
+const StellarSdk = require('stellar-sdk');
+
+@Injectable()
+export class TransactionMonitorService implements OnModuleInit {
+  private readonly logger = new Logger(TransactionMonitorService.name);
+  private readonly server: any;
+  private readonly monitoredTransactions = new Map<string, NodeJS.Timeout>();
+
+  constructor(
+    @InjectRepository(TransactionStatusEntity)
+    private readonly transactionStatusRepository: Repository<TransactionStatusEntity>,
+    private readonly retryService: RetryService,
+    private readonly alertService: AlertService,
+  ) {
+    this.server = new StellarSdk.Horizon.Server(
+      process.env.STELLAR_HORIZON_URL || 'https://horizon-testnet.stellar.org',
+    );
+  }
+
+  async onModuleInit() {
+    this.logger.log('Transaction Monitor Service initialized');
+    await this.loadPendingTransactions();
+  }
+
+  async createTransaction(
+    createDto: CreateTransactionStatusDto,
+  ): Promise<TransactionStatusEntity> {
+    const transaction = this.transactionStatusRepository.create({
+      ...createDto,
+      status: TransactionStatus.PENDING,
+      retryCount: 0,
+      maxRetries: createDto.maxRetries || 3,
+    });
+
+    const savedTransaction =
+      await this.transactionStatusRepository.save(transaction);
+
+    this.startMonitoring(savedTransaction.transactionHash);
+
+    this.logger.log(
+      `Created transaction monitor for ${savedTransaction.transactionHash}`,
+    );
+    return savedTransaction;
+  }
+
+  async getTransaction(
+    transactionHash: string,
+  ): Promise<TransactionStatusEntity | null> {
+    return this.transactionStatusRepository.findOne({
+      where: { transactionHash },
+    });
+  }
+
+  async getTransactions(query: TransactionStatusQueryDto): Promise<{
+    transactions: TransactionStatusEntity[];
+    total: number;
+  }> {
+    const {
+      status,
+      priority,
+      sourceAccount,
+      destinationAccount,
+      startDate,
+      endDate,
+      minAmount,
+      maxAmount,
+      page = 1,
+      limit = 50,
+      sortBy = 'createdAt',
+      sortOrder = 'DESC',
+    } = query;
+
+    const where: any = {};
+
+    if (status) where.status = status;
+    if (priority) where.priority = priority;
+    if (sourceAccount) where.sourceAccount = sourceAccount;
+    if (destinationAccount) where.destinationAccount = destinationAccount;
+    if (minAmount !== undefined) where.amount = MoreThan(minAmount);
+    if (maxAmount !== undefined)
+      where.amount = { ...where.amount, LessThan: maxAmount };
+    if (startDate && endDate) {
+      where.createdAt = Between(new Date(startDate), new Date(endDate));
+    } else if (startDate) {
+      where.createdAt = MoreThan(new Date(startDate));
+    } else if (endDate) {
+      where.createdAt = LessThan(new Date(endDate));
+    }
+
+    const [transactions, total] =
+      await this.transactionStatusRepository.findAndCount({
+        where,
+        order: { [sortBy]: sortOrder },
+        skip: (page - 1) * limit,
+        take: limit,
+      });
+
+    return { transactions, total };
+  }
+
+  async updateTransactionStatus(
+    transactionHash: string,
+    status: TransactionStatus,
+    errorMessage?: string,
+  ): Promise<TransactionStatusEntity | null> {
+    const transaction = await this.getTransaction(transactionHash);
+    if (!transaction) {
+      this.logger.warn(`Transaction ${transactionHash} not found`);
+      return null;
+    }
+
+    const oldStatus = transaction.status;
+    transaction.status = status;
+    transaction.updatedAt = new Date();
+
+    if (status === TransactionStatus.CONFIRMED) {
+      transaction.confirmedAt = new Date();
+      this.stopMonitoring(transactionHash);
+      this.logger.log(`Transaction ${transactionHash} confirmed`);
+    } else if (status === TransactionStatus.FAILED) {
+      transaction.errorMessage = errorMessage || undefined;
+      this.stopMonitoring(transactionHash);
+
+      if (transaction.retryCount < transaction.maxRetries) {
+        await this.retryService.scheduleRetry(transaction);
+      } else {
+        await this.alertService.sendCriticalAlert(
+          `Transaction ${transactionHash} failed after ${transaction.maxRetries} retries`,
+          { transactionHash, errorMessage, retryCount: transaction.retryCount },
+        );
+      }
+    }
+
+    await this.transactionStatusRepository.save(transaction);
+
+    if (oldStatus !== status) {
+      await this.alertService.sendStatusChangeAlert(
+        transaction,
+        oldStatus,
+        status,
+      );
+    }
+
+    return transaction;
+  }
+
+  private async loadPendingTransactions(): Promise<void> {
+    const pendingTransactions = await this.transactionStatusRepository.find({
+      where: { status: TransactionStatus.PENDING },
+    });
+
+    this.logger.log(
+      `Loading ${pendingTransactions.length} pending transactions for monitoring`,
+    );
+
+    for (const transaction of pendingTransactions) {
+      this.startMonitoring(transaction.transactionHash);
+    }
+  }
+
+  private startMonitoring(transactionHash: string): void {
+    if (this.monitoredTransactions.has(transactionHash)) {
+      return;
+    }
+
+    const monitorInterval = setInterval(async () => {
+      await this.checkTransactionStatus(transactionHash);
+    }, 5000);
+
+    this.monitoredTransactions.set(transactionHash, monitorInterval);
+  }
+
+  private stopMonitoring(transactionHash: string): void {
+    const monitorInterval = this.monitoredTransactions.get(transactionHash);
+    if (monitorInterval) {
+      clearInterval(monitorInterval);
+      this.monitoredTransactions.delete(transactionHash);
+    }
+  }
+
+  private async checkTransactionStatus(transactionHash: string): Promise<void> {
+    try {
+      const transaction = await this.getTransaction(transactionHash);
+      if (!transaction || transaction.status !== TransactionStatus.PENDING) {
+        this.stopMonitoring(transactionHash);
+        return;
+      }
+
+      const stellarTransaction = await this.server
+        .transactions()
+        .transaction(transactionHash)
+        .call();
+
+      if (stellarTransaction.successful) {
+        await this.updateTransactionStatus(
+          transactionHash,
+          TransactionStatus.CONFIRMED,
+        );
+
+        await this.transactionStatusRepository.update(
+          { transactionHash },
+          { ledgerSequence: stellarTransaction.ledger },
+        );
+      } else {
+        await this.updateTransactionStatus(
+          transactionHash,
+          TransactionStatus.FAILED,
+          stellarTransaction.result_xdr ||
+            'Transaction failed on Stellar network',
+        );
+      }
+    } catch (error: any) {
+      if (error.response?.status === 404) {
+        return;
+      }
+
+      this.logger.error(
+        `Error checking transaction ${transactionHash}:`,
+        error,
+      );
+
+      const transaction = await this.getTransaction(transactionHash);
+      if (transaction) {
+        const now = new Date();
+        const timeoutDuration = 5 * 60 * 1000;
+
+        if (now.getTime() - transaction.createdAt.getTime() > timeoutDuration) {
+          await this.updateTransactionStatus(
+            transactionHash,
+            TransactionStatus.TIMEOUT,
+            'Transaction timed out',
+          );
+        }
+      }
+    }
+  }
+
+  @Cron(CronExpression.EVERY_MINUTE)
+  async handleTimeoutTransactions(): Promise<void> {
+    const timeoutThreshold = new Date(Date.now() - 5 * 60 * 1000);
+
+    const timeoutTransactions = await this.transactionStatusRepository.find({
+      where: {
+        status: TransactionStatus.PENDING,
+        createdAt: LessThan(timeoutThreshold),
+      },
+    });
+
+    for (const transaction of timeoutTransactions) {
+      await this.updateTransactionStatus(
+        transaction.transactionHash,
+        TransactionStatus.TIMEOUT,
+        'Transaction timed out after 5 minutes',
+      );
+    }
+  }
+
+  async getTransactionAnalytics(
+    timeRange: 'hour' | 'day' | 'week' | 'month' = 'day',
+  ): Promise<TransactionAnalyticsDto> {
+    const now = new Date();
+    let startDate: Date;
+
+    switch (timeRange) {
+      case 'hour':
+        startDate = new Date(now.getTime() - 60 * 60 * 1000);
+        break;
+      case 'day':
+        startDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);
+        break;
+      case 'week':
+        startDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
+        break;
+      case 'month':
+        startDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
+        break;
+    }
+
+    const transactions = await this.transactionStatusRepository.find({
+      where: {
+        createdAt: MoreThan(startDate),
+      },
+    });
+
+    const totalTransactions = transactions.length;
+    const pendingTransactions = transactions.filter(
+      (t) => t.status === TransactionStatus.PENDING,
+    ).length;
+    const confirmedTransactions = transactions.filter(
+      (t) => t.status === TransactionStatus.CONFIRMED,
+    ).length;
+    const failedTransactions = transactions.filter(
+      (t) => t.status === TransactionStatus.FAILED,
+    ).length;
+    const retryingTransactions = transactions.filter(
+      (t) => t.status === TransactionStatus.RETRYING,
+    ).length;
+    const timeoutTransactions = transactions.filter(
+      (t) => t.status === TransactionStatus.TIMEOUT,
+    ).length;
+
+    const successRate =
+      totalTransactions > 0
+        ? (confirmedTransactions / totalTransactions) * 100
+        : 0;
+
+    const confirmedTx = transactions.filter(
+      (t) => t.status === TransactionStatus.CONFIRMED && t.confirmedAt,
+    );
+    const averageConfirmationTime =
+      confirmedTx.length > 0
+        ? confirmedTx.reduce((sum, tx) => {
+            const time = tx.confirmedAt.getTime() - tx.createdAt.getTime();
+            return sum + time;
+          }, 0) /
+          confirmedTx.length /
+          1000
+        : 0;
+
+    const averageRetryCount =
+      transactions.length > 0
+        ? transactions.reduce((sum, tx) => sum + tx.retryCount, 0) /
+          transactions.length
+        : 0;
+
+    const statusBreakdown = transactions.reduce(
+      (acc, tx) => {
+        acc[tx.status] = (acc[tx.status] || 0) + 1;
+        return acc;
+      },
+      {} as Record<TransactionStatus, number>,
+    );
+
+    const priorityBreakdown = transactions.reduce(
+      (acc, tx) => {
+        acc[tx.priority] = (acc[tx.priority] || 0) + 1;
+        return acc;
+      },
+      {} as Record<TransactionPriority, number>,
+    );
+
+    const hourlyStats = this.calculateHourlyStats(transactions, startDate, now);
+
+    return {
+      totalTransactions,
+      pendingTransactions,
+      confirmedTransactions,
+      failedTransactions,
+      retryingTransactions,
+      timeoutTransactions,
+      successRate,
+      averageConfirmationTime,
+      averageRetryCount,
+      statusBreakdown,
+      priorityBreakdown,
+      hourlyStats,
+    };
+  }
+
+  private calculateHourlyStats(
+    transactions: TransactionStatusEntity[],
+    startDate: Date,
+    endDate: Date,
+  ): Record<
+    string,
+    { count: number; successRate: number; averageTime: number }
+  > {
+    const hourlyStats: Record<
+      string,
+      { count: number; successRate: number; averageTime: number }
+    > = {};
+    const hours = Math.ceil(
+      (endDate.getTime() - startDate.getTime()) / (60 * 60 * 1000),
+    );
+
+    for (let i = 0; i < hours; i++) {
+      const hourStart = new Date(startDate.getTime() + i * 60 * 60 * 1000);
+      const hourEnd = new Date(hourStart.getTime() + 60 * 60 * 1000);
+      const hourKey = hourStart.toISOString().substring(0, 13);
+
+      const hourTransactions = transactions.filter(
+        (tx) => tx.createdAt >= hourStart && tx.createdAt < hourEnd,
+      );
+
+      const confirmedInHour = hourTransactions.filter(
+        (tx) => tx.status === TransactionStatus.CONFIRMED,
+      );
+      const successRate =
+        hourTransactions.length > 0
+          ? (confirmedInHour.length / hourTransactions.length) * 100
+          : 0;
+
+      const avgTime =
+        confirmedInHour.length > 0
+          ? confirmedInHour.reduce((sum, tx) => {
+              if (tx.confirmedAt) {
+                return (
+                  sum +
+                  (tx.confirmedAt.getTime() - tx.createdAt.getTime()) / 1000
+                );
+              }
+              return sum;
+            }, 0) / confirmedInHour.length
+          : 0;
+
+      hourlyStats[hourKey] = {
+        count: hourTransactions.length,
+        successRate,
+        averageTime: avgTime,
+      };
+    }
+
+    return hourlyStats;
+  }
+
+  async archiveOldTransactions(): Promise<void> {
+    const archiveThreshold = new Date(Date.now() - 365 * 24 * 60 * 60 * 1000);
+
+    const oldTransactions = await this.transactionStatusRepository.find({
+      where: {
+        createdAt: LessThan(archiveThreshold),
+        isArchived: false,
+      },
+    });
+
+    for (const transaction of oldTransactions) {
+      transaction.isArchived = true;
+      await this.transactionStatusRepository.save(transaction);
+    }
+
+    this.logger.log(`Archived ${oldTransactions.length} old transactions`);
+  }
+
+  @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
+  async performDailyMaintenance(): Promise<void> {
+    await this.archiveOldTransactions();
+    await this.cleanupExpiredTransactions();
+  }
+
+  private async cleanupExpiredTransactions(): Promise<void> {
+    const expiredTransactions = await this.transactionStatusRepository.find({
+      where: {
+        expiresAt: LessThan(new Date()),
+        status: TransactionStatus.PENDING,
+      },
+    });
+
+    for (const transaction of expiredTransactions) {
+      await this.updateTransactionStatus(
+        transaction.transactionHash,
+        TransactionStatus.FAILED,
+        'Transaction expired',
+      );
+    }
+
+    this.logger.log(
+      `Cleaned up ${expiredTransactions.length} expired transactions`,
+    );
+  }
+
+  getMonitoringStats(): {
+    activeMonitors: number;
+    totalTransactions: number;
+    pendingTransactions: number;
+  } {
+    return {
+      activeMonitors: this.monitoredTransactions.size,
+      totalTransactions: 0,
+      pendingTransactions: 0,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/workflows/index.html b/coverage/lcov-report/src/monitoring/workflows/index.html new file mode 100644 index 0000000..ba3780d --- /dev/null +++ b/coverage/lcov-report/src/monitoring/workflows/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/monitoring/workflows + + + + + + + + + +
+
+

All files src/monitoring/workflows

+
+ +
+ 0% + Statements + 0/487 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/487 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transaction.workflow.ts +
+
0%0/4870%0/10%0/10%0/487
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/monitoring/workflows/transaction.workflow.ts.html b/coverage/lcov-report/src/monitoring/workflows/transaction.workflow.ts.html new file mode 100644 index 0000000..3e8b732 --- /dev/null +++ b/coverage/lcov-report/src/monitoring/workflows/transaction.workflow.ts.html @@ -0,0 +1,1546 @@ + + + + + + Code coverage report for src/monitoring/workflows/transaction.workflow.ts + + + + + + + + + +
+
+

All files / src/monitoring/workflows transaction.workflow.ts

+
+ +
+ 0% + Statements + 0/487 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/487 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  TransactionStatusEntity,
+  TransactionStatus,
+  TransactionPriority,
+} from '../entities/transaction-status.entity';
+import { TransactionMonitorService } from '../transaction-monitor.service';
+import { RetryService } from '../retry/retry.service';
+import { AlertService } from '../alerts/alert.service';
+
+const StellarSdk = require('stellar-sdk');
+
+export interface WorkflowStep {
+  name: string;
+  execute(context: TransactionWorkflowContext): Promise<void>;
+  rollback?(context: TransactionWorkflowContext): Promise<void>;
+  retryPolicy?: {
+    maxAttempts: number;
+    delay: number;
+    backoffMultiplier?: number;
+  };
+}
+
+export interface TransactionWorkflowContext {
+  transaction: TransactionStatusEntity;
+  stellarTransaction?: any;
+  server: any;
+  metadata: Record<string, any>;
+  stepResults: Map<string, any>;
+}
+
+export enum WorkflowStatus {
+  PENDING = 'pending',
+  RUNNING = 'running',
+  COMPLETED = 'completed',
+  FAILED = 'failed',
+  CANCELLED = 'cancelled',
+}
+
+@Injectable()
+export class TransactionWorkflowService {
+  private readonly logger = new Logger(TransactionWorkflowService.name);
+  private readonly activeWorkflows = new Map<
+    string,
+    {
+      status: WorkflowStatus;
+      currentStep: number;
+      steps: WorkflowStep[];
+      context: TransactionWorkflowContext;
+      startTime: Date;
+    }
+  >();
+
+  constructor(
+    @InjectRepository(TransactionStatusEntity)
+    private readonly transactionStatusRepository: Repository<TransactionStatusEntity>,
+    private readonly transactionMonitorService: TransactionMonitorService,
+    private readonly retryService: RetryService,
+    private readonly alertService: AlertService,
+  ) {}
+
+  async createWorkflow(
+    transactionHash: string,
+    workflowType: 'standard' | 'priority' | 'batch' = 'standard',
+  ): Promise<string> {
+    const transaction = await this.transactionStatusRepository.findOne({
+      where: { transactionHash },
+    });
+
+    if (!transaction) {
+      throw new Error(`Transaction ${transactionHash} not found`);
+    }
+
+    const steps = this.getWorkflowSteps(workflowType, transaction);
+    const context: TransactionWorkflowContext = {
+      transaction,
+      server: new (require('stellar-sdk').Horizon.Server)(
+        process.env.STELLAR_HORIZON_URL ||
+          'https://horizon-testnet.stellar.org',
+      ),
+      metadata: {},
+      stepResults: new Map(),
+    };
+
+    const workflowId = `${transactionHash}_${Date.now()}`;
+
+    this.activeWorkflows.set(workflowId, {
+      status: WorkflowStatus.PENDING,
+      currentStep: 0,
+      steps,
+      context,
+      startTime: new Date(),
+    });
+
+    this.logger.log(
+      `Created workflow ${workflowId} for transaction ${transactionHash}`,
+    );
+
+    return workflowId;
+  }
+
+  async executeWorkflow(workflowId: string): Promise<void> {
+    const workflow = this.activeWorkflows.get(workflowId);
+    if (!workflow) {
+      throw new Error(`Workflow ${workflowId} not found`);
+    }
+
+    workflow.status = WorkflowStatus.RUNNING;
+
+    try {
+      for (let i = workflow.currentStep; i < workflow.steps.length; i++) {
+        const step = workflow.steps[i];
+        workflow.currentStep = i;
+
+        this.logger.log(
+          `Executing step ${i + 1}/${workflow.steps.length}: ${step.name}`,
+        );
+
+        await this.executeStepWithRetry(step, workflow.context);
+
+        workflow.context.stepResults.set(step.name, {
+          completed: true,
+          timestamp: new Date(),
+        });
+      }
+
+      workflow.status = WorkflowStatus.COMPLETED;
+
+      await this.transactionStatusRepository.update(
+        { transactionHash: workflow.context.transaction.transactionHash },
+        { status: TransactionStatus.CONFIRMED, confirmedAt: new Date() },
+      );
+
+      await this.alertService.sendCriticalAlert(
+        `Workflow ${workflowId} completed successfully for transaction ${workflow.context.transaction.transactionHash}`,
+      );
+
+      this.logger.log(`Workflow ${workflowId} completed successfully`);
+    } catch (error: any) {
+      workflow.status = WorkflowStatus.FAILED;
+
+      await this.handleWorkflowFailure(workflowId, error);
+
+      this.logger.error(`Workflow ${workflowId} failed:`, error);
+
+      throw error;
+    } finally {
+      this.activeWorkflows.delete(workflowId);
+    }
+  }
+
+  private async executeStepWithRetry(
+    step: WorkflowStep,
+    context: TransactionWorkflowContext,
+  ): Promise<void> {
+    const maxAttempts = step.retryPolicy?.maxAttempts || 1;
+    let lastError: Error | null = null;
+
+    for (let attempt = 1; attempt <= maxAttempts; attempt++) {
+      try {
+        await step.execute(context);
+        return;
+      } catch (error: any) {
+        lastError = error;
+
+        this.logger.warn(
+          `Step ${step.name} failed (attempt ${attempt}/${maxAttempts}):`,
+          error.message,
+        );
+
+        if (attempt < maxAttempts) {
+          const delay = this.calculateRetryDelay(step, attempt);
+          await this.sleep(delay);
+        }
+      }
+    }
+
+    if (step.rollback) {
+      try {
+        await step.rollback(context);
+        this.logger.log(`Step ${step.name} rolled back successfully`);
+      } catch (rollbackError: any) {
+        this.logger.error(
+          `Rollback failed for step ${step.name}:`,
+          rollbackError,
+        );
+      }
+    }
+
+    throw lastError;
+  }
+
+  private calculateRetryDelay(step: WorkflowStep, attempt: number): number {
+    if (!step.retryPolicy) return 1000;
+
+    const { delay, backoffMultiplier = 2 } = step.retryPolicy;
+    return delay * Math.pow(backoffMultiplier, attempt - 1);
+  }
+
+  private async handleWorkflowFailure(
+    workflowId: string,
+    error: Error,
+  ): Promise<void> {
+    const workflow = this.activeWorkflows.get(workflowId);
+    if (!workflow) return;
+
+    const { transaction } = workflow.context;
+
+    await this.transactionStatusRepository.update(
+      { transactionHash: transaction.transactionHash },
+      {
+        status: TransactionStatus.FAILED,
+        errorMessage: error.message,
+      },
+    );
+
+    await this.alertService.sendFailureAlert(transaction, error.message);
+
+    if (transaction.retryCount < transaction.maxRetries) {
+      await this.retryService.scheduleRetry(transaction);
+    }
+  }
+
+  private getWorkflowSteps(
+    workflowType: string,
+    transaction: TransactionStatusEntity,
+  ): WorkflowStep[] {
+    const baseSteps: WorkflowStep[] = [
+      {
+        name: 'validate_transaction',
+        execute: async (context) => {
+          if (!context.transaction.transactionHash) {
+            throw new Error('Transaction hash is required');
+          }
+          context.metadata.validated = true;
+        },
+        retryPolicy: { maxAttempts: 3, delay: 1000 },
+      },
+      {
+        name: 'check_network_status',
+        execute: async (context) => {
+          try {
+            const networkStatus = await context.server.root().call();
+            context.metadata.networkStatus = networkStatus;
+          } catch (error) {
+            throw new Error(`Network status check failed: ${error.message}`);
+          }
+        },
+        retryPolicy: { maxAttempts: 5, delay: 2000, backoffMultiplier: 1.5 },
+      },
+      {
+        name: 'verify_transaction_exists',
+        execute: async (context) => {
+          try {
+            const stellarTx = await context.server
+              .transactions()
+              .transaction(context.transaction.transactionHash)
+              .call();
+
+            context.stellarTransaction = stellarTx;
+            context.metadata.verified = true;
+          } catch (error: any) {
+            if (error.response?.status === 404) {
+              throw new Error('Transaction not found on network');
+            }
+            throw error;
+          }
+        },
+        retryPolicy: { maxAttempts: 10, delay: 5000 },
+      },
+      {
+        name: 'validate_transaction_success',
+        execute: async (context) => {
+          if (!context.stellarTransaction.successful) {
+            throw new Error(
+              `Transaction failed: ${context.stellarTransaction.result_xdr}`,
+            );
+          }
+          context.metadata.successValidated = true;
+        },
+      },
+      {
+        name: 'update_ledger_info',
+        execute: async (context) => {
+          await this.transactionStatusRepository.update(
+            { transactionHash: context.transaction.transactionHash },
+            {
+              ledgerSequence: context.stellarTransaction.ledger,
+              confirmedAt: new Date(),
+            },
+          );
+          context.metadata.ledgerUpdated = true;
+        },
+        retryPolicy: { maxAttempts: 3, delay: 1000 },
+      },
+    ];
+
+    switch (workflowType) {
+      case 'priority':
+        return [
+          ...baseSteps,
+          {
+            name: 'priority_verification',
+            execute: async (context) => {
+              if (
+                context.transaction.priority !== TransactionPriority.CRITICAL
+              ) {
+                throw new Error('Priority workflow requires critical priority');
+              }
+              context.metadata.priorityVerified = true;
+            },
+          },
+          {
+            name: 'enhanced_monitoring',
+            execute: async (context) => {
+              await this.alertService.sendCriticalAlert(
+                `Priority transaction ${context.transaction.transactionHash} is being processed with enhanced monitoring`,
+              );
+              context.metadata.enhancedMonitoring = true;
+            },
+          },
+        ];
+
+      case 'batch':
+        return [
+          ...baseSteps,
+          {
+            name: 'batch_validation',
+            execute: async (context) => {
+              const batchTransactions =
+                await this.transactionStatusRepository.find({
+                  where: {
+                    status: TransactionStatus.PENDING,
+                    priority: TransactionPriority.LOW,
+                  },
+                  take: 10,
+                });
+
+              context.metadata.batchSize = batchTransactions.length;
+              context.metadata.batchValidated = true;
+            },
+            retryPolicy: { maxAttempts: 2, delay: 1000 },
+          },
+        ];
+
+      default:
+        return baseSteps;
+    }
+  }
+
+  async cancelWorkflow(workflowId: string): Promise<void> {
+    const workflow = this.activeWorkflows.get(workflowId);
+    if (!workflow) {
+      throw new Error(`Workflow ${workflowId} not found`);
+    }
+
+    workflow.status = WorkflowStatus.CANCELLED;
+
+    await this.transactionStatusRepository.update(
+      { transactionHash: workflow.context.transaction.transactionHash },
+      { status: TransactionStatus.FAILED, errorMessage: 'Workflow cancelled' },
+    );
+
+    this.activeWorkflows.delete(workflowId);
+
+    this.logger.log(`Workflow ${workflowId} cancelled`);
+  }
+
+  async getWorkflowStatus(workflowId: string): Promise<{
+    status: WorkflowStatus;
+    currentStep: number;
+    totalSteps: number;
+    startTime: Date;
+    elapsedMs: number;
+  } | null> {
+    const workflow = this.activeWorkflows.get(workflowId);
+    if (!workflow) return null;
+
+    return {
+      status: workflow.status,
+      currentStep: workflow.currentStep,
+      totalSteps: workflow.steps.length,
+      startTime: workflow.startTime,
+      elapsedMs: Date.now() - workflow.startTime.getTime(),
+    };
+  }
+
+  async getActiveWorkflows(): Promise<
+    Array<{
+      workflowId: string;
+      transactionHash: string;
+      status: WorkflowStatus;
+      currentStep: number;
+      totalSteps: number;
+      startTime: Date;
+    }>
+  > {
+    const workflows: Array<{
+      workflowId: string;
+      transactionHash: string;
+      status: WorkflowStatus;
+      currentStep: number;
+      totalSteps: number;
+      startTime: Date;
+    }> = [];
+
+    for (const [workflowId, workflow] of Array.from(
+      this.activeWorkflows.entries(),
+    )) {
+      workflows.push({
+        workflowId,
+        transactionHash: workflow.context.transaction.transactionHash,
+        status: workflow.status,
+        currentStep: workflow.currentStep,
+        totalSteps: workflow.steps.length,
+        startTime: workflow.startTime,
+      });
+    }
+
+    return workflows;
+  }
+
+  async cleanupExpiredWorkflows(): Promise<void> {
+    const now = Date.now();
+    const expiredWorkflows: string[] = [];
+
+    for (const [workflowId, workflow] of Array.from(
+      this.activeWorkflows.entries(),
+    )) {
+      const elapsed = now - workflow.startTime.getTime();
+      const timeoutMs = 30 * 60 * 1000;
+
+      if (elapsed > timeoutMs) {
+        expiredWorkflows.push(workflowId);
+      }
+    }
+
+    for (const workflowId of expiredWorkflows) {
+      await this.cancelWorkflow(workflowId);
+    }
+
+    if (expiredWorkflows.length > 0) {
+      this.logger.log(
+        `Cleaned up ${expiredWorkflows.length} expired workflows`,
+      );
+    }
+  }
+
+  private sleep(ms: number): Promise<void> {
+    return new Promise((resolve) => setTimeout(resolve, ms));
+  }
+
+  getWorkflowStats(): {
+    activeWorkflows: number;
+    completedWorkflows: number;
+    failedWorkflows: number;
+    averageExecutionTime: number;
+  } {
+    const workflows = Array.from(this.activeWorkflows.values());
+
+    const completed = workflows.filter(
+      (w) => w.status === WorkflowStatus.COMPLETED,
+    ).length;
+    const failed = workflows.filter(
+      (w) => w.status === WorkflowStatus.FAILED,
+    ).length;
+
+    const executionTimes = workflows
+      .filter((w) => w.status === WorkflowStatus.COMPLETED)
+      .map((w) => Date.now() - w.startTime.getTime());
+
+    const averageExecutionTime =
+      executionTimes.length > 0
+        ? executionTimes.reduce((sum, time) => sum + time, 0) /
+          executionTimes.length
+        : 0;
+
+    return {
+      activeWorkflows: workflows.length,
+      completedWorkflows: completed,
+      failedWorkflows: failed,
+      averageExecutionTime,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/dto/index.html b/coverage/lcov-report/src/multisig/dto/index.html new file mode 100644 index 0000000..cbd4420 --- /dev/null +++ b/coverage/lcov-report/src/multisig/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/multisig/dto + + + + + + + + + +
+
+

All files src/multisig/dto

+
+ +
+ 0% + Statements + 0/302 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/302 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
multisig.dto.ts +
+
0%0/3020%0/10%0/10%0/302
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/dto/multisig.dto.ts.html b/coverage/lcov-report/src/multisig/dto/multisig.dto.ts.html new file mode 100644 index 0000000..dadaf69 --- /dev/null +++ b/coverage/lcov-report/src/multisig/dto/multisig.dto.ts.html @@ -0,0 +1,991 @@ + + + + + + Code coverage report for src/multisig/dto/multisig.dto.ts + + + + + + + + + +
+
+

All files / src/multisig/dto multisig.dto.ts

+
+ +
+ 0% + Statements + 0/302 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/302 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsArray,
+  IsNumber,
+  IsEnum,
+  IsOptional,
+  IsJSON,
+  Min,
+  Max,
+  Length,
+  ValidateNested,
+  IsDecimal,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { WalletStatus } from '../entities/multisig-wallet.entity';
+import { TransactionType, SignatureStatus } from '../entities/signature.entity';
+
+export class CreateMultisigWalletDto {
+  @IsString()
+  @Length(3, 100)
+  name: string;
+
+  @IsString()
+  @Length(10, 500)
+  description: string;
+
+  @IsArray()
+  @IsString({ each: true })
+  signers: string[];
+
+  @IsNumber()
+  @Min(2)
+  @Max(15)
+  threshold: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(2)
+  @Max(15)
+  recoveryThreshold?: number;
+
+  @IsOptional()
+  @IsJSON()
+  metadata?: Record<string, any>;
+}
+
+export class SignTransactionDto {
+  @IsString()
+  transactionHash: string;
+
+  @IsString()
+  signature: string;
+
+  @IsEnum(TransactionType)
+  transactionType: TransactionType;
+
+  @IsJSON()
+  transactionData: Record<string, any>;
+
+  @IsOptional()
+  @IsDecimal()
+  amount?: string;
+
+  @IsOptional()
+  @IsString()
+  recipient?: string;
+
+  @IsOptional()
+  @IsJSON()
+  auditData?: {
+    ipAddress?: string;
+    userAgent?: string;
+    deviceId?: string;
+    location?: string;
+  };
+}
+
+export class RevokeSignatureDto {
+  @IsString()
+  transactionHash: string;
+
+  @IsString()
+  @Length(5, 200)
+  reason: string;
+}
+
+export class InitiateRecoveryDto {
+  @IsString()
+  walletId: string;
+
+  @IsString()
+  @Length(5, 200)
+  reason: string;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(2)
+  @Max(15)
+  newThreshold?: number;
+
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  newSigners?: string[];
+}
+
+export class ExecuteTransactionDto {
+  @IsString()
+  transactionHash: string;
+
+  @IsOptional()
+  @IsJSON()
+  executionData?: Record<string, any>;
+}
+
+export class UpdateWalletDto {
+  @IsOptional()
+  @IsString()
+  @Length(3, 100)
+  name?: string;
+
+  @IsOptional()
+  @IsString()
+  @Length(10, 500)
+  description?: string;
+
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  signers?: string[];
+
+  @IsOptional()
+  @IsNumber()
+  @Min(2)
+  @Max(15)
+  threshold?: string;
+
+  @IsOptional()
+  @IsEnum(WalletStatus)
+  status?: WalletStatus;
+
+  @IsOptional()
+  @IsJSON()
+  metadata?: Record<string, any>;
+}
+
+export class MultisigWalletResponseDto {
+  id: string;
+  address: string;
+  name: string;
+  description: string;
+  creatorId: string;
+  signers: string[];
+  threshold: number;
+  status: WalletStatus;
+  nonce: number;
+  metadata?: Record<string, any>;
+  recoveryThreshold?: number;
+  recoveryInitiatedAt?: Date;
+  recoveryInitiatedBy?: string;
+  createdAt: Date;
+  updatedAt: Date;
+  lastTransactionAt?: Date;
+  transactionCount: number;
+  isRecoveryMode: boolean;
+  requiredSignatures: number;
+}
+
+export class SignatureResponseDto {
+  id: string;
+  walletId: string;
+  transactionHash: string;
+  signerId: string;
+  status: SignatureStatus;
+  transactionType: TransactionType;
+  transactionData: Record<string, any>;
+  amount?: string;
+  recipient?: string;
+  expiresAt: Date;
+  signedAt?: Date;
+  revokedAt?: Date;
+  executedAt?: Date;
+  executionTxHash?: string;
+  auditData?: {
+    ipAddress?: string;
+    userAgent?: string;
+    deviceId?: string;
+    location?: string;
+  };
+  revocationReason?: string;
+  createdAt: Date;
+  processedAt?: Date;
+  isExpired: boolean;
+  isValid: boolean;
+  canRevoke: boolean;
+  timeToExpiry: number;
+}
+
+export class TransactionStatusDto {
+  @IsString()
+  transactionHash: string;
+
+  @IsString()
+  walletId: string;
+
+  @IsNumber()
+  totalSigners: number;
+
+  @IsNumber()
+  requiredSignatures: number;
+
+  @IsNumber()
+  collectedSignatures: number;
+
+  @IsArray()
+  @ValidateNested({ each: true })
+  @Type(() => SignatureResponseDto)
+  signatures: SignatureResponseDto[];
+
+  @IsString()
+  status: 'pending' | 'ready' | 'executed' | 'expired' | 'failed';
+
+  @IsString()
+  canExecute: boolean;
+
+  @IsNumber()
+  timeToExpiry: number;
+}
+
+export class RecoveryStatusDto {
+  @IsString()
+  walletId: string;
+
+  @IsEnum(WalletStatus)
+  status: WalletStatus;
+
+  @IsNumber()
+  recoveryProgress: number;
+
+  @IsNumber()
+  requiredRecoverySignatures: number;
+
+  @IsNumber()
+  collectedRecoverySignatures: number;
+
+  @IsString()
+  recoveryInitiatedBy: string;
+
+  @IsString()
+  recoveryInitiatedAt: Date;
+
+  @IsOptional()
+  @IsString()
+  completedAt?: Date;
+
+  @IsOptional()
+  @IsArray()
+  @ValidateNested({ each: true })
+  @Type(() => SignatureResponseDto)
+  recoverySignatures?: SignatureResponseDto[];
+}
+
+export class MultisigQueryDto {
+  @IsOptional()
+  @IsString()
+  walletId?: string;
+
+  @IsOptional()
+  @IsEnum(WalletStatus)
+  status?: WalletStatus;
+
+  @IsOptional()
+  @IsString()
+  signerId?: string;
+
+  @IsOptional()
+  @IsEnum(TransactionType)
+  transactionType?: TransactionType;
+
+  @IsOptional()
+  @IsEnum(SignatureStatus)
+  signatureStatus?: SignatureStatus;
+
+  @IsOptional()
+  @IsString()
+  fromDate?: string;
+
+  @IsOptional()
+  @IsString()
+  toDate?: string;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(100)
+  limit?: number = 10;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  offset?: number = 0;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/entities/index.html b/coverage/lcov-report/src/multisig/entities/index.html new file mode 100644 index 0000000..4f0ea66 --- /dev/null +++ b/coverage/lcov-report/src/multisig/entities/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/multisig/entities + + + + + + + + + +
+
+

All files src/multisig/entities

+
+ +
+ 0% + Statements + 0/218 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/218 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
multisig-wallet.entity.ts +
+
0%0/940%0/10%0/10%0/94
signature.entity.ts +
+
0%0/1240%0/10%0/10%0/124
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/entities/multisig-wallet.entity.ts.html b/coverage/lcov-report/src/multisig/entities/multisig-wallet.entity.ts.html new file mode 100644 index 0000000..52ef6a9 --- /dev/null +++ b/coverage/lcov-report/src/multisig/entities/multisig-wallet.entity.ts.html @@ -0,0 +1,367 @@ + + + + + + Code coverage report for src/multisig/entities/multisig-wallet.entity.ts + + + + + + + + + +
+
+

All files / src/multisig/entities multisig-wallet.entity.ts

+
+ +
+ 0% + Statements + 0/94 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/94 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  OneToMany,
+  Index,
+} from 'typeorm';
+import { Signature } from './signature.entity';
+
+export enum WalletStatus {
+  ACTIVE = 'active',
+  LOCKED = 'locked',
+  RECOVERY = 'recovery',
+  TERMINATED = 'terminated',
+}
+
+@Entity('multisig_wallets')
+@Index(['address'])
+@Index(['creatorId'])
+export class MultisigWallet {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ unique: true })
+  address: string;
+
+  @Column()
+  name: string;
+
+  @Column()
+  description: string;
+
+  @Column()
+  creatorId: string;
+
+  @Column({ type: 'json' })
+  signers: string[];
+
+  @Column()
+  threshold: number;
+
+  @Column({
+    type: 'enum',
+    enum: WalletStatus,
+    default: WalletStatus.ACTIVE,
+  })
+  status: WalletStatus;
+
+  @Column({ type: 'bigint', default: 0 })
+  nonce: number;
+
+  @Column({ type: 'json', nullable: true })
+  metadata: Record<string, any>;
+
+  @Column({ nullable: true })
+  recoveryThreshold: number;
+
+  @Column({ type: 'timestamp', nullable: true })
+  recoveryInitiatedAt: Date;
+
+  @Column({ nullable: true })
+  recoveryInitiatedBy: string;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @UpdateDateColumn()
+  updatedAt: Date;
+
+  @OneToMany(() => Signature, (signature) => signature.wallet)
+  signatures: Signature[];
+
+  @Column({ type: 'timestamp', nullable: true })
+  lastTransactionAt: Date;
+
+  @Column({ default: 0 })
+  transactionCount: number;
+
+  get isRecoveryMode(): boolean {
+    return this.status === WalletStatus.RECOVERY;
+  }
+
+  get requiredSignatures(): number {
+    return this.isRecoveryMode && this.recoveryThreshold
+      ? this.recoveryThreshold
+      : this.threshold;
+  }
+
+  canExecute(signaturesCollected: number): boolean {
+    return signaturesCollected >= this.requiredSignatures;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/entities/signature.entity.ts.html b/coverage/lcov-report/src/multisig/entities/signature.entity.ts.html new file mode 100644 index 0000000..b7a72c8 --- /dev/null +++ b/coverage/lcov-report/src/multisig/entities/signature.entity.ts.html @@ -0,0 +1,457 @@ + + + + + + Code coverage report for src/multisig/entities/signature.entity.ts + + + + + + + + + +
+
+

All files / src/multisig/entities signature.entity.ts

+
+ +
+ 0% + Statements + 0/124 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/124 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  ManyToOne,
+  JoinColumn,
+  Index,
+} from 'typeorm';
+import { MultisigWallet } from './multisig-wallet.entity';
+
+export enum SignatureStatus {
+  PENDING = 'pending',
+  COLLECTED = 'collected',
+  EXPIRED = 'expired',
+  REVOKED = 'revoked',
+  EXECUTED = 'executed',
+}
+
+export enum TransactionType {
+  TRANSFER = 'transfer',
+  CONTRACT_CALL = 'contract_call',
+  DAO_VOTE = 'dao_vote',
+  ENERGY_TRADE = 'energy_trade',
+  EMERGENCY_RECOVERY = 'emergency_recovery',
+}
+
+@Entity('multisig_signatures')
+@Index(['walletId', 'transactionHash'])
+@Index(['signerId'])
+@Index(['status'])
+@Index(['expiresAt'])
+export class Signature {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column()
+  walletId: string;
+
+  @ManyToOne(() => MultisigWallet, (wallet) => wallet.signatures, {
+    onDelete: 'CASCADE',
+  })
+  @JoinColumn({ name: 'walletId' })
+  wallet: MultisigWallet;
+
+  @Column()
+  transactionHash: string;
+
+  @Column()
+  signerId: string;
+
+  @Column({ type: 'text' })
+  signature: string;
+
+  @Column({
+    type: 'enum',
+    enum: SignatureStatus,
+    default: SignatureStatus.PENDING,
+  })
+  status: SignatureStatus;
+
+  @Column({
+    type: 'enum',
+    enum: TransactionType,
+  })
+  transactionType: TransactionType;
+
+  @Column({ type: 'json' })
+  transactionData: Record<string, any>;
+
+  @Column({ type: 'decimal', precision: 36, scale: 18, nullable: true })
+  amount: string;
+
+  @Column({ nullable: true })
+  recipient: string;
+
+  @Column({ type: 'timestamp' })
+  expiresAt: Date;
+
+  @Column({ type: 'timestamp', nullable: true })
+  signedAt: Date;
+
+  @Column({ type: 'timestamp', nullable: true })
+  revokedAt: Date;
+
+  @Column({ type: 'timestamp', nullable: true })
+  executedAt: Date;
+
+  @Column({ type: 'text', nullable: true })
+  executionTxHash: string;
+
+  @Column({ type: 'json', nullable: true })
+  auditData: {
+    ipAddress?: string;
+    userAgent?: string;
+    deviceId?: string;
+    location?: string;
+  };
+
+  @Column({ type: 'text', nullable: true })
+  revocationReason: string;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @Column({ type: 'timestamp', nullable: true })
+  processedAt: Date;
+
+  get isExpired(): boolean {
+    return new Date() > this.expiresAt;
+  }
+
+  get isValid(): boolean {
+    return this.status === SignatureStatus.PENDING && !this.isExpired;
+  }
+
+  get canRevoke(): boolean {
+    return this.status === SignatureStatus.PENDING && !this.isExpired;
+  }
+
+  get timeToExpiry(): number {
+    return this.expiresAt.getTime() - Date.now();
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/index.html b/coverage/lcov-report/src/multisig/index.html new file mode 100644 index 0000000..b55a8c8 --- /dev/null +++ b/coverage/lcov-report/src/multisig/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/multisig + + + + + + + + + +
+
+

All files src/multisig

+
+ +
+ 0% + Statements + 0/474 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/474 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
multisig.module.ts +
+
0%0/150%0/10%0/10%0/15
multisig.service.ts +
+
0%0/4590%0/10%0/10%0/459
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/multisig.module.ts.html b/coverage/lcov-report/src/multisig/multisig.module.ts.html new file mode 100644 index 0000000..f84c428 --- /dev/null +++ b/coverage/lcov-report/src/multisig/multisig.module.ts.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for src/multisig/multisig.module.ts + + + + + + + + + +
+
+

All files / src/multisig multisig.module.ts

+
+ +
+ 0% + Statements + 0/15 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { MultisigService } from './multisig.service';
+import { MultisigWallet } from './entities/multisig-wallet.entity';
+import { Signature } from './entities/signature.entity';
+import { SignatureCollectionWorkflow } from './workflows/signature-collection.workflow';
+import { RecoveryService } from './recovery/recovery.service';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([MultisigWallet, Signature])],
+  providers: [MultisigService, SignatureCollectionWorkflow, RecoveryService],
+  exports: [MultisigService, SignatureCollectionWorkflow, RecoveryService],
+  controllers: [],
+})
+export class MultisigModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/multisig.service.ts.html b/coverage/lcov-report/src/multisig/multisig.service.ts.html new file mode 100644 index 0000000..3290abe --- /dev/null +++ b/coverage/lcov-report/src/multisig/multisig.service.ts.html @@ -0,0 +1,1462 @@ + + + + + + Code coverage report for src/multisig/multisig.service.ts + + + + + + + + + +
+
+

All files / src/multisig multisig.service.ts

+
+ +
+ 0% + Statements + 0/459 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/459 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Injectable,
+  NotFoundException,
+  BadRequestException,
+  ConflictException,
+  Logger,
+} from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource, LessThan, MoreThanOrEqual } from 'typeorm';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import {
+  MultisigWallet,
+  WalletStatus,
+} from './entities/multisig-wallet.entity';
+import {
+  Signature,
+  SignatureStatus,
+  TransactionType,
+} from './entities/signature.entity';
+import {
+  CreateMultisigWalletDto,
+  SignTransactionDto,
+  RevokeSignatureDto,
+  ExecuteTransactionDto,
+  MultisigQueryDto,
+} from './dto/multisig.dto';
+import { SignatureCollectionWorkflow } from './workflows/signature-collection.workflow';
+import { RecoveryService } from './recovery/recovery.service';
+
+@Injectable()
+export class MultisigService {
+  private readonly logger = new Logger(MultisigService.name);
+  private readonly SIGNATURE_EXPIRY_HOURS = 24;
+
+  constructor(
+    @InjectRepository(MultisigWallet)
+    private readonly walletRepository: Repository<MultisigWallet>,
+    @InjectRepository(Signature)
+    private readonly signatureRepository: Repository<Signature>,
+    private readonly signatureCollectionWorkflow: SignatureCollectionWorkflow,
+    private readonly recoveryService: RecoveryService,
+    private readonly dataSource: DataSource,
+  ) {}
+
+  async createWallet(
+    createWalletDto: CreateMultisigWalletDto,
+    creatorId: string,
+  ): Promise<MultisigWallet> {
+    this.validateWalletCreation(createWalletDto);
+
+    const walletAddress = await this.generateMultisigAddress(
+      createWalletDto.signers,
+      createWalletDto.threshold,
+    );
+
+    const wallet = this.walletRepository.create({
+      ...createWalletDto,
+      address: walletAddress,
+      creatorId,
+      recoveryThreshold:
+        createWalletDto.recoveryThreshold ||
+        Math.ceil(createWalletDto.threshold * 1.5),
+    });
+
+    const savedWallet = await this.walletRepository.save(wallet);
+
+    this.logger.log(
+      `Created multisig wallet ${savedWallet.id} with address ${savedWallet.address}`,
+    );
+    return savedWallet;
+  }
+
+  async getWallet(walletId: string): Promise<MultisigWallet> {
+    const wallet = await this.walletRepository.findOne({
+      where: { id: walletId },
+      relations: ['signatures'],
+    });
+
+    if (!wallet) {
+      throw new NotFoundException('Multisig wallet not found');
+    }
+
+    return wallet;
+  }
+
+  async getWalletByAddress(address: string): Promise<MultisigWallet> {
+    const wallet = await this.walletRepository.findOne({
+      where: { address },
+      relations: ['signatures'],
+    });
+
+    if (!wallet) {
+      throw new NotFoundException('Multisig wallet not found');
+    }
+
+    return wallet;
+  }
+
+  async signTransaction(
+    signTransactionDto: SignTransactionDto,
+    signerId: string,
+  ): Promise<Signature> {
+    const wallet = await this.getWalletByAddress(
+      signTransactionDto.transactionData.walletAddress,
+    );
+
+    if (!wallet.signers.includes(signerId)) {
+      throw new BadRequestException('Signer is not authorized for this wallet');
+    }
+
+    if (
+      wallet.status === WalletStatus.LOCKED ||
+      wallet.status === WalletStatus.TERMINATED
+    ) {
+      throw new BadRequestException('Wallet is not available for transactions');
+    }
+
+    const existingSignature = await this.signatureRepository.findOne({
+      where: {
+        transactionHash: signTransactionDto.transactionHash,
+        signerId,
+        status: SignatureStatus.PENDING,
+      },
+    });
+
+    if (existingSignature) {
+      throw new ConflictException(
+        'Signature already exists for this transaction',
+      );
+    }
+
+    const expiresAt = new Date();
+    expiresAt.setHours(expiresAt.getHours() + this.SIGNATURE_EXPIRY_HOURS);
+
+    const signature = this.signatureRepository.create({
+      ...signTransactionDto,
+      walletId: wallet.id,
+      signerId,
+      expiresAt,
+      signedAt: new Date(),
+    });
+
+    const savedSignature = await this.signatureRepository.save(signature);
+
+    await this.signatureCollectionWorkflow.processSignature(
+      wallet,
+      savedSignature,
+    );
+
+    this.logger.log(
+      `Signature collected for transaction ${signTransactionDto.transactionHash} by signer ${signerId}`,
+    );
+    return savedSignature;
+  }
+
+  async revokeSignature(
+    revokeDto: RevokeSignatureDto,
+    signerId: string,
+  ): Promise<Signature> {
+    const signature = await this.signatureRepository.findOne({
+      where: {
+        transactionHash: revokeDto.transactionHash,
+        signerId,
+        status: SignatureStatus.PENDING,
+      },
+      relations: ['wallet'],
+    });
+
+    if (!signature) {
+      throw new NotFoundException('Pending signature not found');
+    }
+
+    if (!signature.canRevoke) {
+      throw new BadRequestException('Signature cannot be revoked');
+    }
+
+    signature.status = SignatureStatus.REVOKED;
+    signature.revokedAt = new Date();
+    signature.revocationReason = revokeDto.reason;
+
+    const revokedSignature = await this.signatureRepository.save(signature);
+
+    await this.signatureCollectionWorkflow.processRevocation(
+      signature.wallet,
+      revokedSignature,
+    );
+
+    this.logger.log(
+      `Signature revoked for transaction ${revokeDto.transactionHash} by signer ${signerId}`,
+    );
+    return revokedSignature;
+  }
+
+  async executeTransaction(
+    executeDto: ExecuteTransactionDto,
+    executorId: string,
+  ): Promise<Signature> {
+    const signatures = await this.signatureRepository.find({
+      where: {
+        transactionHash: executeDto.transactionHash,
+        status: SignatureStatus.COLLECTED,
+      },
+      relations: ['wallet'],
+    });
+
+    if (signatures.length === 0) {
+      throw new NotFoundException(
+        'No collected signatures found for this transaction',
+      );
+    }
+
+    const wallet = signatures[0].wallet;
+
+    if (!wallet.signers.includes(executorId)) {
+      throw new BadRequestException(
+        'Executor is not authorized for this wallet',
+      );
+    }
+
+    const requiredSignatures = wallet.requiredSignatures;
+    if (signatures.length < requiredSignatures) {
+      throw new BadRequestException(
+        `Insufficient signatures. Required: ${requiredSignatures}, Collected: ${signatures.length}`,
+      );
+    }
+
+    try {
+      const executionResult = await this.executeMultisigTransaction(
+        wallet.address,
+        executeDto.transactionHash,
+        signatures.map((s) => s.signature),
+        executeDto.executionData,
+      );
+
+      const updatedSignatures = await Promise.all(
+        signatures.map(async (signature) => {
+          signature.status = SignatureStatus.EXECUTED;
+          signature.executedAt = new Date();
+          signature.executionTxHash = executionResult.transactionHash;
+          return this.signatureRepository.save(signature);
+        }),
+      );
+
+      wallet.lastTransactionAt = new Date();
+      wallet.transactionCount += 1;
+      wallet.nonce += 1;
+      await this.walletRepository.save(wallet);
+
+      this.logger.log(
+        `Transaction ${executeDto.transactionHash} executed successfully`,
+      );
+      return updatedSignatures[0];
+    } catch (error) {
+      this.logger.error(
+        `Failed to execute transaction ${executeDto.transactionHash}:`,
+        error,
+      );
+      throw new BadRequestException('Transaction execution failed');
+    }
+  }
+
+  async getTransactionStatus(transactionHash: string): Promise<any> {
+    const signatures = await this.signatureRepository.find({
+      where: { transactionHash },
+      relations: ['wallet'],
+    });
+
+    if (signatures.length === 0) {
+      throw new NotFoundException('Transaction not found');
+    }
+
+    const wallet = signatures[0].wallet;
+    const validSignatures = signatures.filter((s) => s.isValid);
+    const collectedSignatures = signatures.filter(
+      (s) => s.status === SignatureStatus.COLLECTED,
+    );
+    const executedSignatures = signatures.filter(
+      (s) => s.status === SignatureStatus.EXECUTED,
+    );
+
+    let status: 'pending' | 'ready' | 'executed' | 'expired' | 'failed' =
+      'pending';
+
+    if (executedSignatures.length > 0) {
+      status = 'executed';
+    } else if (
+      validSignatures.length === 0 &&
+      signatures.some((s) => s.isExpired)
+    ) {
+      status = 'expired';
+    } else if (wallet.canExecute(collectedSignatures.length)) {
+      status = 'ready';
+    }
+
+    return {
+      transactionHash,
+      walletId: wallet.id,
+      totalSigners: wallet.signers.length,
+      requiredSignatures: wallet.requiredSignatures,
+      collectedSignatures: collectedSignatures.length,
+      signatures: signatures,
+      status,
+      canExecute: wallet.canExecute(collectedSignatures.length),
+      timeToExpiry: Math.max(...signatures.map((s) => s.timeToExpiry)),
+    };
+  }
+
+  async queryMultisigData(
+    queryDto: MultisigQueryDto,
+  ): Promise<{ wallets: MultisigWallet[]; signatures: Signature[] }> {
+    const walletQuery = this.walletRepository
+      .createQueryBuilder('wallet')
+      .leftJoinAndSelect('wallet.signatures', 'signature');
+
+    if (queryDto.walletId) {
+      walletQuery.andWhere('wallet.id = :walletId', {
+        walletId: queryDto.walletId,
+      });
+    }
+
+    if (queryDto.status) {
+      walletQuery.andWhere('wallet.status = :status', {
+        status: queryDto.status,
+      });
+    }
+
+    if (queryDto.signerId) {
+      walletQuery.andWhere('JSON_CONTAINS(wallet.signers, :signerId)', {
+        signerId: `"${queryDto.signerId}"`,
+      });
+    }
+
+    const wallets = await walletQuery
+      .limit(queryDto.limit)
+      .offset(queryDto.offset)
+      .getMany();
+
+    const signatureQuery = this.signatureRepository
+      .createQueryBuilder('signature')
+      .leftJoinAndSelect('signature.wallet', 'wallet');
+
+    if (queryDto.walletId) {
+      signatureQuery.andWhere('signature.walletId = :walletId', {
+        walletId: queryDto.walletId,
+      });
+    }
+
+    if (queryDto.transactionType) {
+      signatureQuery.andWhere('signature.transactionType = :transactionType', {
+        transactionType: queryDto.transactionType,
+      });
+    }
+
+    if (queryDto.signatureStatus) {
+      signatureQuery.andWhere('signature.status = :signatureStatus', {
+        signatureStatus: queryDto.signatureStatus,
+      });
+    }
+
+    if (queryDto.fromDate) {
+      signatureQuery.andWhere('signature.createdAt >= :fromDate', {
+        fromDate: new Date(queryDto.fromDate),
+      });
+    }
+
+    if (queryDto.toDate) {
+      signatureQuery.andWhere('signature.createdAt <= :toDate', {
+        toDate: new Date(queryDto.toDate),
+      });
+    }
+
+    const signatures = await signatureQuery
+      .limit(queryDto.limit)
+      .offset(queryDto.offset)
+      .getMany();
+
+    return { wallets, signatures };
+  }
+
+  @Cron(CronExpression.EVERY_HOUR)
+  async cleanupExpiredSignatures(): Promise<void> {
+    const expiredSignatures = await this.signatureRepository.find({
+      where: {
+        status: SignatureStatus.PENDING,
+        expiresAt: LessThan(new Date()),
+      },
+      relations: ['wallet'],
+    });
+
+    for (const signature of expiredSignatures) {
+      signature.status = SignatureStatus.EXPIRED;
+      await this.signatureRepository.save(signature);
+      await this.signatureCollectionWorkflow.processExpiry(
+        signature.wallet,
+        signature,
+      );
+    }
+
+    if (expiredSignatures.length > 0) {
+      this.logger.log(
+        `Cleaned up ${expiredSignatures.length} expired signatures`,
+      );
+    }
+  }
+
+  private validateWalletCreation(
+    createWalletDto: CreateMultisigWalletDto,
+  ): void {
+    if (
+      createWalletDto.signers.length < 2 ||
+      createWalletDto.signers.length > 15
+    ) {
+      throw new BadRequestException(
+        'Number of signers must be between 2 and 15',
+      );
+    }
+
+    if (
+      createWalletDto.threshold < 2 ||
+      createWalletDto.threshold > createWalletDto.signers.length
+    ) {
+      throw new BadRequestException(
+        'Threshold must be between 2 and the number of signers',
+      );
+    }
+
+    if (createWalletDto.recoveryThreshold) {
+      if (
+        createWalletDto.recoveryThreshold < createWalletDto.threshold ||
+        createWalletDto.recoveryThreshold > createWalletDto.signers.length
+      ) {
+        throw new BadRequestException(
+          'Recovery threshold must be between normal threshold and number of signers',
+        );
+      }
+    }
+
+    const uniqueSigners = new Set(createWalletDto.signers);
+    if (uniqueSigners.size !== createWalletDto.signers.length) {
+      throw new BadRequestException('Signers must be unique');
+    }
+  }
+
+  private async generateMultisigAddress(
+    signers: string[],
+    threshold: number,
+  ): Promise<string> {
+    return `multisig_${signers.join('_')}_${threshold}_${Date.now()}`;
+  }
+
+  private async executeMultisigTransaction(
+    walletAddress: string,
+    transactionHash: string,
+    signatures: string[],
+    executionData?: Record<string, any>,
+  ): Promise<{ transactionHash: string }> {
+    return { transactionHash: `exec_${transactionHash}_${Date.now()}` };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/recovery/index.html b/coverage/lcov-report/src/multisig/recovery/index.html new file mode 100644 index 0000000..2420880 --- /dev/null +++ b/coverage/lcov-report/src/multisig/recovery/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/multisig/recovery + + + + + + + + + +
+
+

All files src/multisig/recovery

+
+ +
+ 0% + Statements + 0/615 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/615 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
recovery.service.ts +
+
0%0/6150%0/10%0/10%0/615
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/recovery/recovery.service.ts.html b/coverage/lcov-report/src/multisig/recovery/recovery.service.ts.html new file mode 100644 index 0000000..d1a00d0 --- /dev/null +++ b/coverage/lcov-report/src/multisig/recovery/recovery.service.ts.html @@ -0,0 +1,1930 @@ + + + + + + Code coverage report for src/multisig/recovery/recovery.service.ts + + + + + + + + + +
+
+

All files / src/multisig/recovery recovery.service.ts

+
+ +
+ 0% + Statements + 0/615 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/615 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Injectable,
+  NotFoundException,
+  BadRequestException,
+  Logger,
+  ConflictException,
+} from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource } from 'typeorm';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import {
+  MultisigWallet,
+  WalletStatus,
+} from '../entities/multisig-wallet.entity';
+import {
+  Signature,
+  SignatureStatus,
+  TransactionType,
+} from '../entities/signature.entity';
+import { InitiateRecoveryDto } from '../dto/multisig.dto';
+
+export interface RecoveryRequest {
+  walletId: string;
+  initiatedBy: string;
+  reason: string;
+  newThreshold?: number;
+  newSigners?: string[];
+  recoverySignatures: Signature[];
+  initiatedAt: Date;
+  expiresAt: Date;
+  status: 'pending' | 'approved' | 'rejected' | 'expired' | 'completed';
+}
+
+@Injectable()
+export class RecoveryService {
+  private readonly logger = new Logger(RecoveryService.name);
+  private readonly RECOVERY_EXPIRY_HOURS = 72;
+  private readonly SUPER_MAJORITY_THRESHOLD = 0.67;
+
+  constructor(
+    @InjectRepository(MultisigWallet)
+    private readonly walletRepository: Repository<MultisigWallet>,
+    @InjectRepository(Signature)
+    private readonly signatureRepository: Repository<Signature>,
+    private readonly dataSource: DataSource,
+  ) {}
+
+  async initiateRecovery(
+    initiateRecoveryDto: InitiateRecoveryDto,
+    initiatorId: string,
+  ): Promise<RecoveryRequest> {
+    const wallet = await this.walletRepository.findOne({
+      where: { id: initiateRecoveryDto.walletId },
+      relations: ['signatures'],
+    });
+
+    if (!wallet) {
+      throw new NotFoundException('Multisig wallet not found');
+    }
+
+    if (!wallet.signers.includes(initiatorId)) {
+      throw new BadRequestException('Initiator is not a signer of this wallet');
+    }
+
+    if (wallet.status === WalletStatus.RECOVERY) {
+      throw new ConflictException(
+        'Recovery is already in progress for this wallet',
+      );
+    }
+
+    if (wallet.status === WalletStatus.TERMINATED) {
+      throw new BadRequestException(
+        'Cannot initiate recovery for terminated wallet',
+      );
+    }
+
+    this.validateRecoveryRequest(wallet, initiateRecoveryDto);
+
+    const recoveryTransactionHash = await this.generateRecoveryTransactionHash(
+      wallet.id,
+    );
+    const expiresAt = new Date();
+    expiresAt.setHours(expiresAt.getHours() + this.RECOVERY_EXPIRY_HOURS);
+
+    await this.dataSource.transaction(async (manager) => {
+      wallet.status = WalletStatus.RECOVERY;
+      wallet.recoveryInitiatedAt = new Date();
+      wallet.recoveryInitiatedBy = initiatorId;
+
+      if (initiateRecoveryDto.newThreshold) {
+        wallet.recoveryThreshold = initiateRecoveryDto.newThreshold;
+      }
+
+      await manager.save(wallet);
+
+      const recoverySignature = manager.create(Signature, {
+        walletId: wallet.id,
+        transactionHash: recoveryTransactionHash,
+        signerId: initiatorId,
+        signature: await this.generateRecoverySignature(
+          initiatorId,
+          recoveryTransactionHash,
+        ),
+        status: SignatureStatus.COLLECTED,
+        transactionType: TransactionType.EMERGENCY_RECOVERY,
+        transactionData: {
+          recoveryType: 'initiation',
+          reason: initiateRecoveryDto.reason,
+          newSigners: initiateRecoveryDto.newSigners,
+          newThreshold: initiateRecoveryDto.newThreshold,
+        },
+        expiresAt,
+        signedAt: new Date(),
+        auditData: {
+          ipAddress: '127.0.0.1',
+          userAgent: 'recovery-service',
+          deviceId: 'system',
+          location: 'system',
+        },
+      });
+
+      await manager.save(recoverySignature);
+    });
+
+    const recoveryRequest = await this.buildRecoveryRequest(
+      wallet,
+      recoveryTransactionHash,
+    );
+
+    await this.notifySignersOfRecoveryInitiation(wallet, recoveryRequest);
+    await this.auditRecoveryInitiation(wallet, recoveryRequest, initiatorId);
+
+    this.logger.log(
+      `Recovery initiated for wallet ${wallet.id} by ${initiatorId}`,
+    );
+    return recoveryRequest;
+  }
+
+  async signRecovery(
+    walletId: string,
+    transactionHash: string,
+    signerId: string,
+  ): Promise<Signature> {
+    const wallet = await this.walletRepository.findOne({
+      where: { id: walletId },
+    });
+
+    if (!wallet || wallet.status !== WalletStatus.RECOVERY) {
+      throw new BadRequestException('Wallet is not in recovery mode');
+    }
+
+    if (!wallet.signers.includes(signerId)) {
+      throw new BadRequestException('Signer is not authorized for this wallet');
+    }
+
+    const existingSignature = await this.signatureRepository.findOne({
+      where: {
+        transactionHash,
+        signerId,
+        status: SignatureStatus.COLLECTED,
+      },
+    });
+
+    if (existingSignature) {
+      throw new ConflictException('Recovery signature already exists');
+    }
+
+    const recoverySignatures = await this.signatureRepository.find({
+      where: {
+        walletId,
+        transactionHash,
+        transactionType: TransactionType.EMERGENCY_RECOVERY,
+        status: SignatureStatus.COLLECTED,
+      },
+    });
+
+    const requiredSignatures = Math.ceil(
+      wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD,
+    );
+
+    if (recoverySignatures.length >= requiredSignatures) {
+      throw new BadRequestException(
+        'Sufficient recovery signatures already collected',
+      );
+    }
+
+    const signature = this.signatureRepository.create({
+      walletId,
+      transactionHash,
+      signerId,
+      signature: await this.generateRecoverySignature(
+        signerId,
+        transactionHash,
+      ),
+      status: SignatureStatus.COLLECTED,
+      transactionType: TransactionType.EMERGENCY_RECOVERY,
+      transactionData: {
+        recoveryType: 'approval',
+        walletId,
+      },
+      expiresAt: new Date(
+        wallet.recoveryInitiatedAt.getTime() +
+          this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000,
+      ),
+      signedAt: new Date(),
+    });
+
+    const savedSignature = await this.signatureRepository.save(signature);
+
+    if (recoverySignatures.length + 1 >= requiredSignatures) {
+      await this.executeRecovery(wallet, transactionHash);
+    } else {
+      await this.notifyRecoveryProgress(
+        wallet,
+        transactionHash,
+        recoverySignatures.length + 1,
+        requiredSignatures,
+      );
+    }
+
+    await this.auditRecoverySignature(wallet, savedSignature);
+
+    this.logger.log(
+      `Recovery signature added for wallet ${walletId} by ${signerId}`,
+    );
+    return savedSignature;
+  }
+
+  async getRecoveryStatus(walletId: string): Promise<RecoveryRequest> {
+    const wallet = await this.walletRepository.findOne({
+      where: { id: walletId },
+    });
+
+    if (!wallet) {
+      throw new NotFoundException('Multisig wallet not found');
+    }
+
+    if (wallet.status !== WalletStatus.RECOVERY) {
+      throw new BadRequestException('Wallet is not in recovery mode');
+    }
+
+    const recoverySignatures = await this.signatureRepository.find({
+      where: {
+        walletId,
+        transactionType: TransactionType.EMERGENCY_RECOVERY,
+        status: SignatureStatus.COLLECTED,
+      },
+      order: { signedAt: 'ASC' },
+    });
+
+    return await this.buildRecoveryRequest(
+      wallet,
+      recoverySignatures[0]?.transactionHash,
+    );
+  }
+
+  async cancelRecovery(
+    walletId: string,
+    cancellerId: string,
+    reason: string,
+  ): Promise<void> {
+    const wallet = await this.walletRepository.findOne({
+      where: { id: walletId },
+    });
+
+    if (!wallet) {
+      throw new NotFoundException('Multisig wallet not found');
+    }
+
+    if (wallet.status !== WalletStatus.RECOVERY) {
+      throw new BadRequestException('Wallet is not in recovery mode');
+    }
+
+    if (!wallet.signers.includes(cancellerId)) {
+      throw new BadRequestException(
+        'Canceller is not authorized for this wallet',
+      );
+    }
+
+    await this.dataSource.transaction(async (manager) => {
+      wallet.status = WalletStatus.ACTIVE;
+      wallet.recoveryInitiatedAt = null;
+      wallet.recoveryInitiatedBy = null;
+
+      await manager.save(wallet);
+
+      await manager.update(
+        Signature,
+        {
+          walletId,
+          transactionType: TransactionType.EMERGENCY_RECOVERY,
+          status: SignatureStatus.PENDING,
+        },
+        {
+          status: SignatureStatus.REVOKED,
+          revokedAt: new Date(),
+          revocationReason: `Recovery cancelled: ${reason}`,
+        },
+      );
+    });
+
+    await this.notifyRecoveryCancellation(wallet, reason);
+    await this.auditRecoveryCancellation(wallet, cancellerId, reason);
+
+    this.logger.log(
+      `Recovery cancelled for wallet ${walletId} by ${cancellerId}`,
+    );
+  }
+
+  @Cron(CronExpression.EVERY_HOUR)
+  async cleanupExpiredRecoveries(): Promise<void> {
+    const expiredRecoveryWallets = await this.walletRepository.find({
+      where: {
+        status: WalletStatus.RECOVERY,
+        recoveryInitiatedAt: new Date(
+          Date.now() - this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000,
+        ),
+      },
+    });
+
+    for (const wallet of expiredRecoveryWallets) {
+      await this.expireRecovery(wallet);
+    }
+
+    if (expiredRecoveryWallets.length > 0) {
+      this.logger.log(
+        `Cleaned up ${expiredRecoveryWallets.length} expired recovery processes`,
+      );
+    }
+  }
+
+  private async executeRecovery(
+    wallet: MultisigWallet,
+    transactionHash: string,
+  ): Promise<void> {
+    try {
+      const recoverySignatures = await this.signatureRepository.find({
+        where: {
+          walletId: wallet.id,
+          transactionHash,
+          transactionType: TransactionType.EMERGENCY_RECOVERY,
+          status: SignatureStatus.COLLECTED,
+        },
+      });
+
+      const initiationSignature = recoverySignatures.find(
+        (s) => s.transactionData?.recoveryType === 'initiation',
+      );
+
+      const newSigners =
+        initiationSignature?.transactionData?.newSigners || wallet.signers;
+      const newThreshold =
+        initiationSignature?.transactionData?.newThreshold || wallet.threshold;
+
+      await this.updateMultisigAccount(
+        wallet.address,
+        newSigners,
+        newThreshold,
+        recoverySignatures.map((s) => s.signature),
+      );
+
+      await this.dataSource.transaction(async (manager) => {
+        wallet.signers = newSigners;
+        wallet.threshold = newThreshold;
+        wallet.status = WalletStatus.ACTIVE;
+        wallet.recoveryInitiatedAt = null;
+        wallet.recoveryInitiatedBy = null;
+
+        await manager.save(wallet);
+
+        await manager.update(
+          Signature,
+          {
+            walletId: wallet.id,
+            transactionHash,
+          },
+          {
+            status: SignatureStatus.EXECUTED,
+            executedAt: new Date(),
+          },
+        );
+      });
+
+      await this.notifyRecoveryCompletion(wallet, newSigners, newThreshold);
+      await this.auditRecoveryCompletion(wallet, recoverySignatures);
+
+      this.logger.log(`Recovery completed for wallet ${wallet.id}`);
+    } catch (error) {
+      this.logger.error(
+        `Failed to execute recovery for wallet ${wallet.id}:`,
+        error,
+      );
+      throw new BadRequestException('Recovery execution failed');
+    }
+  }
+
+  private async expireRecovery(wallet: MultisigWallet): Promise<void> {
+    await this.dataSource.transaction(async (manager) => {
+      wallet.status = WalletStatus.ACTIVE;
+      wallet.recoveryInitiatedAt = null;
+      wallet.recoveryInitiatedBy = null;
+
+      await manager.save(wallet);
+
+      await manager.update(
+        Signature,
+        {
+          walletId: wallet.id,
+          transactionType: TransactionType.EMERGENCY_RECOVERY,
+          status: SignatureStatus.PENDING,
+        },
+        {
+          status: SignatureStatus.EXPIRED,
+        },
+      );
+    });
+
+    await this.notifyRecoveryExpiry(wallet);
+    await this.auditRecoveryExpiry(wallet);
+
+    this.logger.log(`Recovery expired for wallet ${wallet.id}`);
+  }
+
+  private async buildRecoveryRequest(
+    wallet: MultisigWallet,
+    transactionHash?: string,
+  ): Promise<RecoveryRequest> {
+    const recoverySignatures = await this.signatureRepository.find({
+      where: {
+        walletId: wallet.id,
+        transactionType: TransactionType.EMERGENCY_RECOVERY,
+        ...(transactionHash && { transactionHash }),
+      },
+      order: { signedAt: 'ASC' },
+    });
+
+    const initiationSignature = recoverySignatures.find(
+      (s) => s.transactionData?.recoveryType === 'initiation',
+    );
+
+    const requiredSignatures = Math.ceil(
+      wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD,
+    );
+    const isApproved = recoverySignatures.length >= requiredSignatures;
+
+    let status: RecoveryRequest['status'] = 'pending';
+    if (
+      wallet.status === WalletStatus.ACTIVE &&
+      recoverySignatures.length > 0
+    ) {
+      status = 'completed';
+    } else if (isApproved) {
+      status = 'approved';
+    } else if (initiationSignature?.isExpired) {
+      status = 'expired';
+    }
+
+    return {
+      walletId: wallet.id,
+      initiatedBy: wallet.recoveryInitiatedBy || '',
+      reason: initiationSignature?.transactionData?.reason || '',
+      newThreshold: initiationSignature?.transactionData?.newThreshold,
+      newSigners: initiationSignature?.transactionData?.newSigners,
+      recoverySignatures,
+      initiatedAt: wallet.recoveryInitiatedAt || new Date(),
+      expiresAt: wallet.recoveryInitiatedAt
+        ? new Date(
+            wallet.recoveryInitiatedAt.getTime() +
+              this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000,
+          )
+        : new Date(),
+      status,
+    };
+  }
+
+  private validateRecoveryRequest(
+    wallet: MultisigWallet,
+    dto: InitiateRecoveryDto,
+  ): void {
+    if (
+      dto.newSigners &&
+      (dto.newSigners.length < 2 || dto.newSigners.length > 15)
+    ) {
+      throw new BadRequestException(
+        'New signers count must be between 2 and 15',
+      );
+    }
+
+    if (dto.newThreshold && dto.newSigners) {
+      if (dto.newThreshold < 2 || dto.newThreshold > dto.newSigners.length) {
+        throw new BadRequestException(
+          'New threshold must be between 2 and new signers count',
+        );
+      }
+    }
+
+    if (dto.newSigners) {
+      const uniqueSigners = new Set(dto.newSigners);
+      if (uniqueSigners.size !== dto.newSigners.length) {
+        throw new BadRequestException('New signers must be unique');
+      }
+    }
+
+    const superMajorityRequired = Math.ceil(
+      wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD,
+    );
+    if (wallet.signers.length < superMajorityRequired) {
+      throw new BadRequestException(
+        'Insufficient signers for super-majority recovery',
+      );
+    }
+  }
+
+  private async generateRecoveryTransactionHash(
+    walletId: string,
+  ): Promise<string> {
+    return `recovery_${walletId}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+  }
+
+  private async generateRecoverySignature(
+    signerId: string,
+    transactionHash: string,
+  ): Promise<string> {
+    return `recovery_sig_${signerId}_${transactionHash}_${Date.now()}`;
+  }
+
+  private async auditRecoveryExpiry(wallet: MultisigWallet): Promise<void> {
+    console.log(`Recovery expired for wallet ${wallet.id}`);
+  }
+
+  private async notifySignersOfRecoveryInitiation(
+    wallet: MultisigWallet,
+    recoveryRequest: RecoveryRequest,
+  ): Promise<void> {
+    console.log(
+      `Notifying signers of recovery initiation for wallet ${wallet.id}`,
+    );
+  }
+
+  private async notifyRecoveryProgress(
+    wallet: MultisigWallet,
+    transactionHash: string,
+    collected: number,
+    required: number,
+  ): Promise<void> {
+    console.log(
+      `Notifying recovery progress: ${collected}/${required} for wallet ${wallet.id}`,
+    );
+  }
+
+  private async notifyRecoveryCompletion(
+    wallet: MultisigWallet,
+    newSigners: string[],
+    newThreshold: number,
+  ): Promise<void> {
+    console.log(`Notifying recovery completion for wallet ${wallet.id}`);
+  }
+
+  private async notifyRecoveryCancellation(
+    wallet: MultisigWallet,
+    reason: string,
+  ): Promise<void> {
+    console.log(
+      `Notifying recovery cancellation for wallet ${wallet.id}: ${reason}`,
+    );
+  }
+
+  private async updateMultisigAccount(
+    walletAddress: string,
+    newSigners: string[],
+    newThreshold: number,
+    signatures: string[],
+  ): Promise<void> {
+    // Placeholder for Stellar account update
+    console.log(
+      `Updating multisig account ${walletAddress} with ${newSigners.length} signers and threshold ${newThreshold}`,
+    );
+  }
+
+  private async auditRecoveryInitiation(
+    wallet: MultisigWallet,
+    recoveryRequest: RecoveryRequest,
+    initiatorId: string,
+  ): Promise<void> {
+    console.log(`Recovery initiated for wallet ${wallet.id} by ${initiatorId}`);
+  }
+
+  private async auditRecoverySignature(
+    wallet: MultisigWallet,
+    signature: Signature,
+  ): Promise<void> {
+    console.log(
+      `Recovery signature added for wallet ${wallet.id} by ${signature.signerId}`,
+    );
+  }
+
+  private async auditRecoveryCompletion(
+    wallet: MultisigWallet,
+    signatures: Signature[],
+  ): Promise<void> {
+    console.log(
+      `Recovery completed for wallet ${wallet.id} with ${signatures.length} signatures`,
+    );
+  }
+
+  private async auditRecoveryCancellation(
+    wallet: MultisigWallet,
+    cancellerId: string,
+    reason: string,
+  ): Promise<void> {
+    console.log(
+      `Recovery cancelled for wallet ${wallet.id} by ${cancellerId}: ${reason}`,
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/workflows/index.html b/coverage/lcov-report/src/multisig/workflows/index.html new file mode 100644 index 0000000..c335b84 --- /dev/null +++ b/coverage/lcov-report/src/multisig/workflows/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/multisig/workflows + + + + + + + + + +
+
+

All files src/multisig/workflows

+
+ +
+ 0% + Statements + 0/362 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/362 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
signature-collection.workflow.ts +
+
0%0/3620%0/10%0/10%0/362
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/multisig/workflows/signature-collection.workflow.ts.html b/coverage/lcov-report/src/multisig/workflows/signature-collection.workflow.ts.html new file mode 100644 index 0000000..dd16b7e --- /dev/null +++ b/coverage/lcov-report/src/multisig/workflows/signature-collection.workflow.ts.html @@ -0,0 +1,1171 @@ + + + + + + Code coverage report for src/multisig/workflows/signature-collection.workflow.ts + + + + + + + + + +
+
+

All files / src/multisig/workflows signature-collection.workflow.ts

+
+ +
+ 0% + Statements + 0/362 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/362 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import {
+  MultisigWallet,
+  WalletStatus,
+} from '../entities/multisig-wallet.entity';
+import { Signature, SignatureStatus } from '../entities/signature.entity';
+
+export interface SignatureWorkflowEvent {
+  type:
+    | 'signature_collected'
+    | 'signature_revoked'
+    | 'signature_expired'
+    | 'threshold_reached';
+  wallet: MultisigWallet;
+  signature?: Signature;
+  signatures?: Signature[];
+  timestamp: Date;
+}
+
+@Injectable()
+export class SignatureCollectionWorkflow {
+  private readonly logger = new Logger(SignatureCollectionWorkflow.name);
+
+  constructor(
+    @InjectRepository(Signature)
+    private readonly signatureRepository: Repository<Signature>,
+  ) {}
+
+  async processSignature(
+    wallet: MultisigWallet,
+    signature: Signature,
+  ): Promise<void> {
+    const startTime = Date.now();
+
+    try {
+      await this.validateSignature(wallet, signature);
+
+      signature.status = SignatureStatus.COLLECTED;
+      await this.signatureRepository.save(signature);
+
+      const allSignatures = await this.getSignaturesForTransaction(
+        signature.transactionHash,
+      );
+      const collectedSignatures = allSignatures.filter(
+        (s) => s.status === SignatureStatus.COLLECTED,
+      );
+
+      await this.auditLog({
+        eventType: 'signature_collected',
+        walletId: wallet.id,
+        transactionHash: signature.transactionHash,
+        signerId: signature.signerId,
+        signatureCount: collectedSignatures.length,
+        requiredSignatures: wallet.requiredSignatures,
+        timestamp: new Date(),
+      });
+
+      await this.notifySigners(wallet, signature, collectedSignatures);
+
+      if (wallet.canExecute(collectedSignatures.length)) {
+        await this.handleThresholdReached(
+          wallet,
+          signature.transactionHash,
+          collectedSignatures,
+        );
+      }
+
+      const processingTime = Date.now() - startTime;
+      this.logger.log(
+        `Signature processed in ${processingTime}ms for transaction ${signature.transactionHash}`,
+      );
+    } catch (error) {
+      this.logger.error(
+        `Failed to process signature for transaction ${signature.transactionHash}:`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  async processRevocation(
+    wallet: MultisigWallet,
+    signature: Signature,
+  ): Promise<void> {
+    try {
+      const allSignatures = await this.getSignaturesForTransaction(
+        signature.transactionHash,
+      );
+      const activeSignatures = allSignatures.filter(
+        (s) => s.status === SignatureStatus.COLLECTED,
+      );
+
+      await this.auditLog({
+        eventType: 'signature_revoked',
+        walletId: wallet.id,
+        transactionHash: signature.transactionHash,
+        signerId: signature.signerId,
+        revocationReason: signature.revocationReason,
+        remainingSignatures: activeSignatures.length,
+        requiredSignatures: wallet.requiredSignatures,
+        timestamp: new Date(),
+      });
+
+      await this.notifySignersOfRevocation(wallet, signature, activeSignatures);
+
+      this.logger.log(
+        `Signature revoked for transaction ${signature.transactionHash} by signer ${signature.signerId}`,
+      );
+    } catch (error) {
+      this.logger.error(
+        `Failed to process signature revocation for transaction ${signature.transactionHash}:`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  async processExpiry(
+    wallet: MultisigWallet,
+    signature: Signature,
+  ): Promise<void> {
+    try {
+      const allSignatures = await this.getSignaturesForTransaction(
+        signature.transactionHash,
+      );
+      const activeSignatures = allSignatures.filter(
+        (s) => s.status === SignatureStatus.COLLECTED,
+      );
+
+      await this.auditLog({
+        eventType: 'signature_expired',
+        walletId: wallet.id,
+        transactionHash: signature.transactionHash,
+        signerId: signature.signerId,
+        expiredAt: signature.expiresAt,
+        remainingSignatures: activeSignatures.length,
+        requiredSignatures: wallet.requiredSignatures,
+        timestamp: new Date(),
+      });
+
+      await this.notifySignersOfExpiry(wallet, signature, activeSignatures);
+
+      this.logger.log(
+        `Signature expired for transaction ${signature.transactionHash} from signer ${signature.signerId}`,
+      );
+    } catch (error) {
+      this.logger.error(
+        `Failed to process signature expiry for transaction ${signature.transactionHash}:`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  async getSignaturesForTransaction(
+    transactionHash: string,
+  ): Promise<Signature[]> {
+    return this.signatureRepository.find({
+      where: { transactionHash },
+      order: { createdAt: 'ASC' },
+    });
+  }
+
+  async getTransactionProgress(transactionHash: string): Promise<{
+    totalSigners: number;
+    requiredSignatures: number;
+    collectedSignatures: number;
+    pendingSignatures: number;
+    expiredSignatures: number;
+    revokedSignatures: number;
+    isReady: boolean;
+    timeToExpiry: number;
+  }> {
+    const signatures = await this.getSignaturesForTransaction(transactionHash);
+
+    if (signatures.length === 0) {
+      throw new Error('No signatures found for transaction');
+    }
+
+    const wallet =
+      signatures[0].wallet ||
+      (
+        await this.signatureRepository.findOne({
+          where: { transactionHash },
+          relations: ['wallet'],
+        })
+      ).wallet;
+
+    const collected = signatures.filter(
+      (s) => s.status === SignatureStatus.COLLECTED,
+    ).length;
+    const pending = signatures.filter(
+      (s) => s.status === SignatureStatus.PENDING && !s.isExpired,
+    ).length;
+    const expired = signatures.filter(
+      (s) => s.status === SignatureStatus.EXPIRED || s.isExpired,
+    ).length;
+    const revoked = signatures.filter(
+      (s) => s.status === SignatureStatus.REVOKED,
+    ).length;
+
+    const timeToExpiry = Math.max(...signatures.map((s) => s.timeToExpiry));
+
+    return {
+      totalSigners: wallet.signers.length,
+      requiredSignatures: wallet.requiredSignatures,
+      collectedSignatures: collected,
+      pendingSignatures: pending,
+      expiredSignatures: expired,
+      revokedSignatures: revoked,
+      isReady: wallet.canExecute(collected),
+      timeToExpiry,
+    };
+  }
+
+  private async validateSignature(
+    wallet: MultisigWallet,
+    signature: Signature,
+  ): Promise<void> {
+    if (
+      wallet.status === WalletStatus.LOCKED ||
+      wallet.status === WalletStatus.TERMINATED
+    ) {
+      throw new Error('Wallet is not available for transactions');
+    }
+
+    if (signature.isExpired) {
+      throw new Error('Signature has expired');
+    }
+
+    const existingSignature = await this.signatureRepository.findOne({
+      where: {
+        transactionHash: signature.transactionHash,
+        signerId: signature.signerId,
+        status: [SignatureStatus.COLLECTED, SignatureStatus.EXECUTED],
+      },
+    });
+
+    if (existingSignature) {
+      throw new Error('Duplicate signature detected');
+    }
+  }
+
+  private async handleThresholdReached(
+    wallet: MultisigWallet,
+    transactionHash: string,
+    signatures: Signature[],
+  ): Promise<void> {
+    try {
+      await this.auditLog({
+        eventType: 'threshold_reached',
+        walletId: wallet.id,
+        transactionHash,
+        signerIds: signatures.map((s) => s.signerId),
+        signatureCount: signatures.length,
+        requiredSignatures: wallet.requiredSignatures,
+        timestamp: new Date(),
+      });
+
+      await this.notifyThresholdReached(wallet, transactionHash, signatures);
+
+      this.logger.log(
+        `Threshold reached for transaction ${transactionHash} with ${signatures.length} signatures`,
+      );
+    } catch (error) {
+      this.logger.error(
+        `Failed to handle threshold reached for transaction ${transactionHash}:`,
+        error,
+      );
+    }
+  }
+
+  private async notifySigners(
+    wallet: MultisigWallet,
+    signature: Signature,
+    collectedSignatures: Signature[],
+  ): Promise<void> {
+    const notificationData = {
+      type: 'signature_collected',
+      walletId: wallet.id,
+      walletName: wallet.name,
+      transactionHash: signature.transactionHash,
+      signerId: signature.signerId,
+      collectedCount: collectedSignatures.length,
+      requiredCount: wallet.requiredSignatures,
+      isReady: wallet.canExecute(collectedSignatures.length),
+      expiresAt: signature.expiresAt,
+    };
+
+    await this.sendNotificationsToSigners(wallet.signers, notificationData);
+  }
+
+  private async notifySignersOfRevocation(
+    wallet: MultisigWallet,
+    signature: Signature,
+    activeSignatures: Signature[],
+  ): Promise<void> {
+    const notificationData = {
+      type: 'signature_revoked',
+      walletId: wallet.id,
+      walletName: wallet.name,
+      transactionHash: signature.transactionHash,
+      signerId: signature.signerId,
+      revocationReason: signature.revocationReason,
+      remainingSignatures: activeSignatures.length,
+      requiredSignatures: wallet.requiredSignatures,
+    };
+
+    await this.sendNotificationsToSigners(wallet.signers, notificationData);
+  }
+
+  private async notifySignersOfExpiry(
+    wallet: MultisigWallet,
+    signature: Signature,
+    activeSignatures: Signature[],
+  ): Promise<void> {
+    const notificationData = {
+      type: 'signature_expired',
+      walletId: wallet.id,
+      walletName: wallet.name,
+      transactionHash: signature.transactionHash,
+      signerId: signature.signerId,
+      expiredAt: signature.expiresAt,
+      remainingSignatures: activeSignatures.length,
+      requiredSignatures: wallet.requiredSignatures,
+    };
+
+    await this.sendNotificationsToSigners(wallet.signers, notificationData);
+  }
+
+  private async notifyThresholdReached(
+    wallet: MultisigWallet,
+    transactionHash: string,
+    signatures: Signature[],
+  ): Promise<void> {
+    const notificationData = {
+      type: 'threshold_reached',
+      walletId: wallet.id,
+      walletName: wallet.name,
+      transactionHash,
+      signerIds: signatures.map((s) => s.signerId),
+      signatureCount: signatures.length,
+      requiredSignatures: wallet.requiredSignatures,
+      canExecute: true,
+    };
+
+    await this.sendNotificationsToSigners(wallet.signers, notificationData);
+  }
+
+  private async sendNotificationsToSigners(
+    signers: string[],
+    data: any,
+  ): Promise<void> {
+    console.log('Sending notifications to signers:', data);
+  }
+
+  private async auditLog(data: any): Promise<void> {
+    console.log('Audit log:', data);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/algorithms/dynamic-pricing.algorithm.ts.html b/coverage/lcov-report/src/pricing/algorithms/dynamic-pricing.algorithm.ts.html new file mode 100644 index 0000000..ba9dade --- /dev/null +++ b/coverage/lcov-report/src/pricing/algorithms/dynamic-pricing.algorithm.ts.html @@ -0,0 +1,424 @@ + + + + + + Code coverage report for src/pricing/algorithms/dynamic-pricing.algorithm.ts + + + + + + + + + +
+
+

All files / src/pricing/algorithms dynamic-pricing.algorithm.ts

+
+ +
+ 0% + Statements + 0/113 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/113 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class DynamicPricingAlgorithm {
+  private readonly logger = new Logger(DynamicPricingAlgorithm.name);
+
+  calculateBasePrice(
+    supply: number,
+    demand: number,
+    basePrice?: number,
+  ): number {
+    if (supply <= 0) {
+      this.logger.warn('Supply is zero or negative, using maximum price');
+      return 1000;
+    }
+
+    if (demand <= 0) {
+      this.logger.warn('Demand is zero or negative, using minimum price');
+      return 0.01;
+    }
+
+    const supplyDemandRatio = supply / demand;
+
+    if (basePrice) {
+      return this.applySupplyDemandAdjustment(basePrice, supplyDemandRatio);
+    }
+
+    return this.calculateMarketBasedPrice(supplyDemandRatio);
+  }
+
+  private applySupplyDemandAdjustment(
+    basePrice: number,
+    ratio: number,
+  ): number {
+    if (ratio >= 1.5) {
+      return basePrice * 0.7;
+    } else if (ratio >= 1.2) {
+      return basePrice * 0.85;
+    } else if (ratio >= 0.8) {
+      return basePrice;
+    } else if (ratio >= 0.5) {
+      return basePrice * 1.3;
+    } else {
+      return basePrice * 1.8;
+    }
+  }
+
+  private calculateMarketBasedPrice(ratio: number): number {
+    const marketBasePrice = 50;
+
+    if (ratio >= 2.0) {
+      return marketBasePrice * 0.5;
+    } else if (ratio >= 1.5) {
+      return marketBasePrice * 0.7;
+    } else if (ratio >= 1.0) {
+      return marketBasePrice;
+    } else if (ratio >= 0.7) {
+      return marketBasePrice * 1.5;
+    } else if (ratio >= 0.4) {
+      return marketBasePrice * 2.5;
+    } else {
+      return marketBasePrice * 4.0;
+    }
+  }
+
+  calculateVolatilityMultiplier(historicalPrices: number[]): number {
+    if (historicalPrices.length < 2) {
+      return 1.0;
+    }
+
+    const returns = historicalPrices
+      .slice(1)
+      .map(
+        (price, index) =>
+          (price - historicalPrices[index]) / historicalPrices[index],
+      );
+
+    const meanReturn =
+      returns.reduce((sum, ret) => sum + ret, 0) / returns.length;
+    const variance =
+      returns.reduce((sum, ret) => sum + Math.pow(ret - meanReturn, 2), 0) /
+      returns.length;
+    const volatility = Math.sqrt(variance);
+
+    return Math.min(Math.max(1.0 + volatility * 10, 0.8), 1.5);
+  }
+
+  applyPriceBounds(
+    price: number,
+    minPrice: number = 0.01,
+    maxPrice: number = 1000,
+  ): number {
+    return Math.max(minPrice, Math.min(maxPrice, price));
+  }
+
+  calculateElasticityAdjustment(supply: number, demand: number): number {
+    const ratio = supply / demand;
+
+    if (ratio < 0.3) {
+      return 1.2;
+    } else if (ratio < 0.6) {
+      return 1.1;
+    } else if (ratio < 0.9) {
+      return 1.05;
+    } else if (ratio > 1.8) {
+      return 0.9;
+    } else if (ratio > 1.5) {
+      return 0.95;
+    } else {
+      return 1.0;
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/algorithms/index.html b/coverage/lcov-report/src/pricing/algorithms/index.html new file mode 100644 index 0000000..e284b77 --- /dev/null +++ b/coverage/lcov-report/src/pricing/algorithms/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/pricing/algorithms + + + + + + + + + +
+
+

All files src/pricing/algorithms

+
+ +
+ 0% + Statements + 0/677 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/677 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
dynamic-pricing.algorithm.ts +
+
0%0/1130%0/10%0/10%0/113
location-adjustment.algorithm.ts +
+
0%0/1820%0/10%0/10%0/182
prediction.algorithm.ts +
+
0%0/2300%0/10%0/10%0/230
time-pricing.algorithm.ts +
+
0%0/1520%0/10%0/10%0/152
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/algorithms/location-adjustment.algorithm.ts.html b/coverage/lcov-report/src/pricing/algorithms/location-adjustment.algorithm.ts.html new file mode 100644 index 0000000..cdc5d1a --- /dev/null +++ b/coverage/lcov-report/src/pricing/algorithms/location-adjustment.algorithm.ts.html @@ -0,0 +1,631 @@ + + + + + + Code coverage report for src/pricing/algorithms/location-adjustment.algorithm.ts + + + + + + + + + +
+
+

All files / src/pricing/algorithms location-adjustment.algorithm.ts

+
+ +
+ 0% + Statements + 0/182 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/182 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+export interface LocationData {
+  latitude: number;
+  longitude: number;
+  gridDistance: number;
+  populationDensity: number;
+  infrastructureQuality: number;
+  localDemand: number;
+}
+
+@Injectable()
+export class LocationAdjustmentAlgorithm {
+  private readonly logger = new Logger(LocationAdjustmentAlgorithm.name);
+
+  private readonly locationDatabase: Map<string, LocationData> = new Map([
+    {
+      key: 'new-york',
+      value: {
+        latitude: 40.7128,
+        longitude: -74.006,
+        gridDistance: 50,
+        populationDensity: 10000,
+        infrastructureQuality: 0.9,
+        localDemand: 1000,
+      },
+    },
+    {
+      key: 'london',
+      value: {
+        latitude: 51.5074,
+        longitude: -0.1278,
+        gridDistance: 30,
+        populationDensity: 5700,
+        infrastructureQuality: 0.85,
+        localDemand: 800,
+      },
+    },
+    {
+      key: 'tokyo',
+      value: {
+        latitude: 35.6762,
+        longitude: 139.6503,
+        gridDistance: 20,
+        populationDensity: 15000,
+        infrastructureQuality: 0.95,
+        localDemand: 1200,
+      },
+    },
+    {
+      key: 'berlin',
+      value: {
+        latitude: 52.52,
+        longitude: 13.405,
+        gridDistance: 40,
+        populationDensity: 4000,
+        infrastructureQuality: 0.8,
+        localDemand: 600,
+      },
+    },
+    {
+      key: 'paris',
+      value: {
+        latitude: 48.8566,
+        longitude: 2.3522,
+        gridDistance: 35,
+        populationDensity: 21000,
+        infrastructureQuality: 0.88,
+        localDemand: 900,
+      },
+    },
+  ]);
+
+  calculateLocationMultiplier(location: string): number {
+    const locationData = this.getLocationData(location);
+
+    if (!locationData) {
+      this.logger.warn(
+        `Location data not found for ${location}, using default multiplier`,
+      );
+      return 1.0;
+    }
+
+    const gridDistanceMultiplier = this.calculateGridDistanceMultiplier(
+      locationData.gridDistance,
+    );
+    const populationDensityMultiplier =
+      this.calculatePopulationDensityMultiplier(locationData.populationDensity);
+    const infrastructureMultiplier = this.calculateInfrastructureMultiplier(
+      locationData.infrastructureQuality,
+    );
+    const demandMultiplier = this.calculateLocalDemandMultiplier(
+      locationData.localDemand,
+    );
+
+    const finalMultiplier =
+      gridDistanceMultiplier *
+      populationDensityMultiplier *
+      infrastructureMultiplier *
+      demandMultiplier;
+
+    return Math.round(finalMultiplier * 100) / 100;
+  }
+
+  private getLocationData(location: string): LocationData | undefined {
+    const normalizedLocation = location.toLowerCase().replace(/[\s_-]/g, '-');
+    return this.locationDatabase.get(normalizedLocation);
+  }
+
+  private calculateGridDistanceMultiplier(distance: number): number {
+    if (distance <= 20) return 0.9;
+    if (distance <= 40) return 1.0;
+    if (distance <= 60) return 1.1;
+    if (distance <= 80) return 1.2;
+    return 1.3;
+  }
+
+  private calculatePopulationDensityMultiplier(density: number): number {
+    if (density >= 15000) return 1.3;
+    if (density >= 10000) return 1.2;
+    if (density >= 5000) return 1.1;
+    if (density >= 2000) return 1.0;
+    return 0.9;
+  }
+
+  private calculateInfrastructureMultiplier(quality: number): number {
+    return 2.0 - quality;
+  }
+
+  private calculateLocalDemandMultiplier(demand: number): number {
+    if (demand >= 1000) return 1.15;
+    if (demand >= 800) return 1.1;
+    if (demand >= 600) return 1.05;
+    if (demand >= 400) return 1.0;
+    return 0.95;
+  }
+
+  calculateDistanceBasedMultiplier(
+    location1: string,
+    location2: string,
+  ): number {
+    const data1 = this.getLocationData(location1);
+    const data2 = this.getLocationData(location2);
+
+    if (!data1 || !data2) {
+      return 1.0;
+    }
+
+    const distance = this.calculateDistance(data1, data2);
+
+    if (distance <= 100) return 1.0;
+    if (distance <= 500) return 1.05;
+    if (distance <= 1000) return 1.1;
+    if (distance <= 2000) return 1.2;
+    return 1.3;
+  }
+
+  private calculateDistance(loc1: LocationData, loc2: LocationData): number {
+    const R = 6371;
+    const dLat = this.toRadians(loc2.latitude - loc1.latitude);
+    const dLon = this.toRadians(loc2.longitude - loc1.longitude);
+
+    const a =
+      Math.sin(dLat / 2) * Math.sin(dLat / 2) +
+      Math.cos(this.toRadians(loc1.latitude)) *
+        Math.cos(this.toRadians(loc2.latitude)) *
+        Math.sin(dLon / 2) *
+        Math.sin(dLon / 2);
+
+    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+    return R * c;
+  }
+
+  private toRadians(degrees: number): number {
+    return degrees * (Math.PI / 180);
+  }
+
+  addLocationData(location: string, data: LocationData): void {
+    const normalizedLocation = location.toLowerCase().replace(/[\s_-]/g, '-');
+    this.locationDatabase.set(normalizedLocation, data);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/algorithms/prediction.algorithm.ts.html b/coverage/lcov-report/src/pricing/algorithms/prediction.algorithm.ts.html new file mode 100644 index 0000000..16f15bf --- /dev/null +++ b/coverage/lcov-report/src/pricing/algorithms/prediction.algorithm.ts.html @@ -0,0 +1,775 @@ + + + + + + Code coverage report for src/pricing/algorithms/prediction.algorithm.ts + + + + + + + + + +
+
+

All files / src/pricing/algorithms prediction.algorithm.ts

+
+ +
+ 0% + Statements + 0/230 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/230 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { PriceHistory } from '../entities/price-history.entity';
+
+@Injectable()
+export class PredictionAlgorithm {
+  private readonly logger = new Logger(PredictionAlgorithm.name);
+
+  predictPrice(
+    historicalData: PriceHistory[],
+    hoursAhead: number,
+    currentSupply?: number,
+    currentDemand?: number,
+  ): { predictedPrice: number; confidence: number; factors: any } {
+    if (historicalData.length < 5) {
+      return {
+        predictedPrice: 50,
+        confidence: 0.3,
+        factors: { method: 'default', reason: 'insufficient_data' },
+      };
+    }
+
+    const trendPrediction = this.calculateTrendPrediction(
+      historicalData,
+      hoursAhead,
+    );
+    const seasonalPrediction = this.calculateSeasonalPrediction(
+      historicalData,
+      hoursAhead,
+    );
+    const volatilityPrediction =
+      this.calculateVolatilityPrediction(historicalData);
+    const supplyDemandPrediction = this.calculateSupplyDemandPrediction(
+      historicalData,
+      currentSupply,
+      currentDemand,
+    );
+
+    const weights = {
+      trend: 0.3,
+      seasonal: 0.25,
+      volatility: 0.2,
+      supplyDemand: 0.25,
+    };
+
+    const predictedPrice =
+      trendPrediction.price * weights.trend +
+      seasonalPrediction.price * weights.seasonal +
+      volatilityPrediction.price * weights.volatility +
+      supplyDemandPrediction.price * weights.supplyDemand;
+
+    const confidence = Math.min(
+      trendPrediction.confidence * weights.trend +
+        seasonalPrediction.confidence * weights.seasonal +
+        volatilityPrediction.confidence * weights.volatility +
+        supplyDemandPrediction.confidence * weights.supplyDemand,
+      0.95,
+    );
+
+    return {
+      predictedPrice: Math.round(predictedPrice * 100) / 100,
+      confidence: Math.round(confidence * 100) / 100,
+      factors: {
+        trend: trendPrediction,
+        seasonal: seasonalPrediction,
+        volatility: volatilityPrediction,
+        supplyDemand: supplyDemandPrediction,
+      },
+    };
+  }
+
+  private calculateTrendPrediction(
+    historicalData: PriceHistory[],
+    hoursAhead: number,
+  ): { price: number; confidence: number } {
+    const prices = historicalData.map((d) => d.finalPrice);
+    const trend = this.calculateLinearTrend(prices);
+
+    const predictedPrice = prices[prices.length - 1] + trend.slope * hoursAhead;
+    const confidence = Math.max(
+      0.3,
+      Math.min(0.9, 1 - Math.abs(trend.correlation) * 0.3),
+    );
+
+    return { price: predictedPrice, confidence };
+  }
+
+  private calculateSeasonalPrediction(
+    historicalData: PriceHistory[],
+    hoursAhead: number,
+  ): { price: number; confidence: number } {
+    const targetHour = new Date(
+      Date.now() + hoursAhead * 60 * 60 * 1000,
+    ).getHours();
+    const targetDayOfWeek = new Date(
+      Date.now() + hoursAhead * 60 * 60 * 1000,
+    ).getDay();
+
+    const similarTimeData = historicalData.filter((d) => {
+      const dataDate = new Date(d.timestamp);
+      return (
+        dataDate.getHours() === targetHour &&
+        dataDate.getDay() === targetDayOfWeek
+      );
+    });
+
+    if (similarTimeData.length === 0) {
+      const hourlyData = historicalData.filter(
+        (d) => new Date(d.timestamp).getHours() === targetHour,
+      );
+      if (hourlyData.length > 0) {
+        const avgPrice =
+          hourlyData.reduce((sum, d) => sum + d.finalPrice, 0) /
+          hourlyData.length;
+        return { price: avgPrice, confidence: 0.5 };
+      }
+
+      return { price: 50, confidence: 0.3 };
+    }
+
+    const avgPrice =
+      similarTimeData.reduce((sum, d) => sum + d.finalPrice, 0) /
+      similarTimeData.length;
+    const confidence = Math.min(0.8, similarTimeData.length / 10);
+
+    return { price: avgPrice, confidence };
+  }
+
+  private calculateVolatilityPrediction(historicalData: PriceHistory[]): {
+    price: number;
+    confidence: number;
+  } {
+    const prices = historicalData.map((d) => d.finalPrice);
+    const recentPrices = prices.slice(-24);
+
+    const avgPrice =
+      recentPrices.reduce((sum, price) => sum + price, 0) / recentPrices.length;
+    const variance =
+      recentPrices.reduce(
+        (sum, price) => sum + Math.pow(price - avgPrice, 2),
+        0,
+      ) / recentPrices.length;
+    const standardDeviation = Math.sqrt(variance);
+
+    const volatilityFactor = standardDeviation / avgPrice;
+    const predictedPrice =
+      avgPrice * (1 + (Math.random() - 0.5) * volatilityFactor * 0.5);
+    const confidence = Math.max(0.4, Math.min(0.8, 1 - volatilityFactor));
+
+    return { price: predictedPrice, confidence };
+  }
+
+  private calculateSupplyDemandPrediction(
+    historicalData: PriceHistory[],
+    currentSupply?: number,
+    currentDemand?: number,
+  ): { price: number; confidence: number } {
+    if (currentSupply === undefined || currentDemand === undefined) {
+      const latestData = historicalData[historicalData.length - 1];
+      return { price: latestData.finalPrice, confidence: 0.6 };
+    }
+
+    const ratio = currentSupply / currentDemand;
+
+    let priceAdjustment = 1;
+    if (ratio < 0.5) priceAdjustment = 1.8;
+    else if (ratio < 0.8) priceAdjustment = 1.3;
+    else if (ratio < 1.2) priceAdjustment = 1.0;
+    else if (ratio < 1.5) priceAdjustment = 0.85;
+    else priceAdjustment = 0.7;
+
+    const basePrice = historicalData[historicalData.length - 1].finalPrice;
+    const predictedPrice = basePrice * priceAdjustment;
+    const confidence = 0.7;
+
+    return { price: predictedPrice, confidence };
+  }
+
+  private calculateLinearTrend(values: number[]): {
+    slope: number;
+    correlation: number;
+  } {
+    const n = values.length;
+    const x = Array.from({ length: n }, (_, i) => i);
+    const sumX = x.reduce((a, b) => a + b, 0);
+    const sumY = values.reduce((a, b) => a + b, 0);
+    const sumXY = x.reduce((sum, xi, i) => sum + xi * values[i], 0);
+    const sumXX = x.reduce((sum, xi) => sum + xi * xi, 0);
+
+    const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
+
+    const meanX = sumX / n;
+    const meanY = sumY / n;
+    const numerator = x.reduce(
+      (sum, xi, i) => sum + (xi - meanX) * (values[i] - meanY),
+      0,
+    );
+    const denominatorX = Math.sqrt(
+      x.reduce((sum, xi) => sum + Math.pow(xi - meanX, 2), 0),
+    );
+    const denominatorY = Math.sqrt(
+      values.reduce((sum, yi) => sum + Math.pow(yi - meanY, 2), 0),
+    );
+
+    const correlation =
+      denominatorX * denominatorY === 0
+        ? 0
+        : numerator / (denominatorX * denominatorY);
+
+    return { slope, correlation };
+  }
+
+  calculatePredictionAccuracy(
+    predictions: Array<{ predicted: number; actual: number }>,
+  ): number {
+    if (predictions.length === 0) return 0;
+
+    const totalAbsoluteError = predictions.reduce(
+      (sum, p) => sum + Math.abs(p.predicted - p.actual),
+      0,
+    );
+    const averageActualPrice =
+      predictions.reduce((sum, p) => sum + p.actual, 0) / predictions.length;
+
+    const meanAbsolutePercentageError =
+      totalAbsoluteError / predictions.length / averageActualPrice;
+    const accuracy = Math.max(0, 1 - meanAbsolutePercentageError);
+
+    return Math.round(accuracy * 100) / 100;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/algorithms/time-pricing.algorithm.ts.html b/coverage/lcov-report/src/pricing/algorithms/time-pricing.algorithm.ts.html new file mode 100644 index 0000000..7e143cc --- /dev/null +++ b/coverage/lcov-report/src/pricing/algorithms/time-pricing.algorithm.ts.html @@ -0,0 +1,541 @@ + + + + + + Code coverage report for src/pricing/algorithms/time-pricing.algorithm.ts + + + + + + + + + +
+
+

All files / src/pricing/algorithms time-pricing.algorithm.ts

+
+ +
+ 0% + Statements + 0/152 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/152 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class TimePricingAlgorithm {
+  private readonly logger = new Logger(TimePricingAlgorithm.name);
+
+  calculateTimeMultiplier(timestamp: number): number {
+    const date = new Date(timestamp);
+    const hour = date.getHours();
+    const dayOfWeek = date.getDay();
+
+    const hourlyMultiplier = this.calculateHourlyMultiplier(hour);
+    const dailyMultiplier = this.calculateDailyMultiplier(dayOfWeek);
+    const seasonalMultiplier = this.calculateSeasonalMultiplier(date);
+
+    const finalMultiplier =
+      hourlyMultiplier * dailyMultiplier * seasonalMultiplier;
+
+    return Math.round(finalMultiplier * 100) / 100;
+  }
+
+  private calculateHourlyMultiplier(hour: number): number {
+    if (hour >= 6 && hour < 9) {
+      return 1.4;
+    } else if (hour >= 9 && hour < 12) {
+      return 1.2;
+    } else if (hour >= 12 && hour < 15) {
+      return 1.3;
+    } else if (hour >= 15 && hour < 18) {
+      return 1.5;
+    } else if (hour >= 18 && hour < 22) {
+      return 1.3;
+    } else if (hour >= 22 || hour < 6) {
+      return 0.7;
+    }
+
+    return 1.0;
+  }
+
+  private calculateDailyMultiplier(dayOfWeek: number): number {
+    if (dayOfWeek === 0 || dayOfWeek === 6) {
+      return 0.9;
+    } else if (dayOfWeek === 1) {
+      return 1.1;
+    } else if (dayOfWeek === 5) {
+      return 1.05;
+    }
+
+    return 1.0;
+  }
+
+  private calculateSeasonalMultiplier(date: Date): number {
+    const month = date.getMonth();
+    const day = date.getDate();
+
+    if (month === 11 && day >= 20) {
+      return 1.2;
+    } else if (month === 0 && day <= 5) {
+      return 1.15;
+    } else if (month === 6 || month === 7) {
+      return 1.1;
+    } else if (month === 0 || month === 1 || month === 2) {
+      return 1.05;
+    } else if (month === 4 || month === 5 || month === 9 || month === 10) {
+      return 0.95;
+    }
+
+    return 1.0;
+  }
+
+  isPeakHour(timestamp: number): boolean {
+    const date = new Date(timestamp);
+    const hour = date.getHours();
+    const dayOfWeek = date.getDay();
+
+    if (dayOfWeek === 0 || dayOfWeek === 6) {
+      return false;
+    }
+
+    return (hour >= 7 && hour < 10) || (hour >= 17 && hour < 20);
+  }
+
+  isOffPeakHour(timestamp: number): boolean {
+    const date = new Date(timestamp);
+    const hour = date.getHours();
+
+    return hour >= 22 || hour < 6;
+  }
+
+  calculateTimeBasedDemandForecast(
+    timestamp: number,
+    baseDemand: number,
+  ): number {
+    const timeMultiplier = this.calculateTimeMultiplier(timestamp);
+    const seasonalAdjustment = this.getSeasonalDemandAdjustment(timestamp);
+
+    return baseDemand * timeMultiplier * seasonalAdjustment;
+  }
+
+  private getSeasonalDemandAdjustment(timestamp: number): number {
+    const date = new Date(timestamp);
+    const month = date.getMonth();
+
+    const seasonalFactors = {
+      0: 1.1,
+      1: 1.05,
+      2: 0.95,
+      3: 0.9,
+      4: 0.85,
+      5: 0.9,
+      6: 1.15,
+      7: 1.2,
+      8: 1.1,
+      9: 0.95,
+      10: 0.9,
+      11: 1.05,
+    };
+
+    return seasonalFactors[month] || 1.0;
+  }
+
+  getPeakHoursForDay(timestamp: number): { start: number; end: number }[] {
+    const date = new Date(timestamp);
+    const dayOfWeek = date.getDay();
+
+    if (dayOfWeek === 0 || dayOfWeek === 6) {
+      return [
+        { start: 8, end: 11 },
+        { start: 17, end: 20 },
+      ];
+    }
+
+    return [
+      { start: 6, end: 9 },
+      { start: 17, end: 20 },
+    ];
+  }
+
+  calculateDurationBasedMultiplier(
+    startTimestamp: number,
+    endTimestamp: number,
+  ): number {
+    const duration = endTimestamp - startTimestamp;
+    const hours = duration / (1000 * 60 * 60);
+
+    if (hours <= 1) return 1.2;
+    if (hours <= 4) return 1.1;
+    if (hours <= 8) return 1.0;
+    if (hours <= 24) return 0.95;
+    return 0.9;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/dto/calculate-price.dto.ts.html b/coverage/lcov-report/src/pricing/dto/calculate-price.dto.ts.html new file mode 100644 index 0000000..a618104 --- /dev/null +++ b/coverage/lcov-report/src/pricing/dto/calculate-price.dto.ts.html @@ -0,0 +1,412 @@ + + + + + + Code coverage report for src/pricing/dto/calculate-price.dto.ts + + + + + + + + + +
+
+

All files / src/pricing/dto calculate-price.dto.ts

+
+ +
+ 0% + Statements + 0/109 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/109 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsNumber,
+  IsOptional,
+  IsBoolean,
+  Min,
+  Max,
+  IsEnum,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+
+export enum EnergyType {
+  SOLAR = 'solar',
+  WIND = 'wind',
+  HYDRO = 'hydro',
+  NUCLEAR = 'nuclear',
+  FOSSIL = 'fossil',
+  GEOTHERMAL = 'geothermal',
+}
+
+export class CalculatePriceDto {
+  @IsNumber()
+  @Min(0)
+  supply: number;
+
+  @IsNumber()
+  @Min(0)
+  demand: number;
+
+  @IsString()
+  location: string;
+
+  @IsEnum(EnergyType)
+  energyType: EnergyType;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  timestamp?: number = Date.now();
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  basePrice?: number;
+
+  @IsOptional()
+  @IsBoolean()
+  @Type(() => Boolean)
+  includePrediction?: boolean = false;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(100)
+  predictionHorizonHours?: number = 1;
+}
+
+export class PriceHistoryQueryDto {
+  @IsOptional()
+  @IsString()
+  location?: string;
+
+  @IsOptional()
+  @IsEnum(EnergyType)
+  energyType?: EnergyType;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  startDate?: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  endDate?: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  page?: number = 1;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  limit?: number = 10;
+}
+
+export class PricePredictionDto {
+  @IsString()
+  location: string;
+
+  @IsEnum(EnergyType)
+  energyType: EnergyType;
+
+  @IsNumber()
+  @Min(1)
+  @Max(24)
+  hoursAhead: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  expectedSupply?: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  expectedDemand?: number;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/dto/index.html b/coverage/lcov-report/src/pricing/dto/index.html new file mode 100644 index 0000000..4358e18 --- /dev/null +++ b/coverage/lcov-report/src/pricing/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pricing/dto + + + + + + + + + +
+
+

All files src/pricing/dto

+
+ +
+ 0% + Statements + 0/109 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/109 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
calculate-price.dto.ts +
+
0%0/1090%0/10%0/10%0/109
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/entities/index.html b/coverage/lcov-report/src/pricing/entities/index.html new file mode 100644 index 0000000..5af8b67 --- /dev/null +++ b/coverage/lcov-report/src/pricing/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pricing/entities + + + + + + + + + +
+
+

All files src/pricing/entities

+
+ +
+ 0% + Statements + 0/63 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/63 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
price-history.entity.ts +
+
0%0/630%0/10%0/10%0/63
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/entities/price-history.entity.ts.html b/coverage/lcov-report/src/pricing/entities/price-history.entity.ts.html new file mode 100644 index 0000000..52ff40b --- /dev/null +++ b/coverage/lcov-report/src/pricing/entities/price-history.entity.ts.html @@ -0,0 +1,274 @@ + + + + + + Code coverage report for src/pricing/entities/price-history.entity.ts + + + + + + + + + +
+
+

All files / src/pricing/entities price-history.entity.ts

+
+ +
+ 0% + Statements + 0/63 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/63 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  Index,
+} from 'typeorm';
+
+@Entity('price_history')
+@Index(['timestamp', 'location'])
+export class PriceHistory {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column()
+  basePrice: number;
+
+  @Column()
+  finalPrice: number;
+
+  @Column()
+  location: string;
+
+  @Column()
+  energyType: string;
+
+  @Column()
+  supply: number;
+
+  @Column()
+  demand: number;
+
+  @Column()
+  supplyDemandRatio: number;
+
+  @Column({ nullable: true })
+  locationMultiplier: number;
+
+  @Column({ nullable: true })
+  timeMultiplier: number;
+
+  @Column({ nullable: true })
+  renewablePremium: number;
+
+  @Column({ nullable: true })
+  predictedPrice: number;
+
+  @Column({ default: false })
+  isPeakHour: boolean;
+
+  @Column({ default: false })
+  isRenewable: boolean;
+
+  @Column({ type: 'decimal', precision: 5, scale: 2, nullable: true })
+  predictionAccuracy: number;
+
+  @Column()
+  @Index()
+  timestamp: Date;
+
+  @CreateDateColumn()
+  createdAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/index.html b/coverage/lcov-report/src/pricing/index.html new file mode 100644 index 0000000..19ca101 --- /dev/null +++ b/coverage/lcov-report/src/pricing/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/pricing + + + + + + + + + +
+
+

All files src/pricing

+
+ +
+ 0% + Statements + 0/476 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/476 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
pricing.controller.ts +
+
0%0/830%0/10%0/10%0/83
pricing.module.ts +
+
0%0/290%0/10%0/10%0/29
pricing.service.ts +
+
0%0/3640%0/10%0/10%0/364
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/pricing.controller.ts.html b/coverage/lcov-report/src/pricing/pricing.controller.ts.html new file mode 100644 index 0000000..984f8f2 --- /dev/null +++ b/coverage/lcov-report/src/pricing/pricing.controller.ts.html @@ -0,0 +1,334 @@ + + + + + + Code coverage report for src/pricing/pricing.controller.ts + + + + + + + + + +
+
+

All files / src/pricing pricing.controller.ts

+
+ +
+ 0% + Statements + 0/83 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/83 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, Post, Body, Query } from '@nestjs/common';
+import { ApiTags, ApiOperation, ApiResponse, ApiQuery } from '@nestjs/swagger';
+import { PricingService } from './pricing.service';
+import {
+  CalculatePriceDto,
+  PriceHistoryQueryDto,
+  PricePredictionDto,
+} from './dto/calculate-price.dto';
+
+@ApiTags('pricing')
+@Controller('pricing')
+export class PricingController {
+  constructor(private readonly pricingService: PricingService) {}
+
+  @Post('calculate')
+  @ApiOperation({ summary: 'Calculate energy price based on various factors' })
+  @ApiResponse({ status: 200, description: 'Price calculated successfully' })
+  async calculatePrice(@Body() calculatePriceDto: CalculatePriceDto) {
+    return this.pricingService.calculatePrice(calculatePriceDto);
+  }
+
+  @Post('predict')
+  @ApiOperation({ summary: 'Predict future energy prices' })
+  @ApiResponse({
+    status: 200,
+    description: 'Price prediction generated successfully',
+  })
+  async predictPrice(@Body() predictionDto: PricePredictionDto) {
+    return this.pricingService.predictPrice(predictionDto);
+  }
+
+  @Get('history')
+  @ApiOperation({ summary: 'Get price history' })
+  @ApiResponse({
+    status: 200,
+    description: 'Price history retrieved successfully',
+  })
+  @ApiQuery({
+    name: 'location',
+    required: false,
+    description: 'Filter by location',
+  })
+  @ApiQuery({
+    name: 'energyType',
+    required: false,
+    description: 'Filter by energy type',
+  })
+  @ApiQuery({
+    name: 'startDate',
+    required: false,
+    description: 'Start date timestamp',
+  })
+  @ApiQuery({
+    name: 'endDate',
+    required: false,
+    description: 'End date timestamp',
+  })
+  @ApiQuery({ name: 'page', required: false, type: Number })
+  @ApiQuery({ name: 'limit', required: false, type: Number })
+  async getPriceHistory(@Query() query: PriceHistoryQueryDto) {
+    return this.pricingService.getPriceHistory(query);
+  }
+
+  @Get('analytics')
+  @ApiOperation({ summary: 'Get pricing analytics and statistics' })
+  @ApiResponse({ status: 200, description: 'Analytics retrieved successfully' })
+  @ApiQuery({
+    name: 'location',
+    required: false,
+    description: 'Filter by location',
+  })
+  @ApiQuery({
+    name: 'energyType',
+    required: false,
+    description: 'Filter by energy type',
+  })
+  async getAnalytics(
+    @Query('location') location?: string,
+    @Query('energyType') energyType?: string,
+  ) {
+    return this.pricingService.getPricingAnalytics(location, energyType);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/pricing.module.ts.html b/coverage/lcov-report/src/pricing/pricing.module.ts.html new file mode 100644 index 0000000..3dd392c --- /dev/null +++ b/coverage/lcov-report/src/pricing/pricing.module.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/pricing/pricing.module.ts + + + + + + + + + +
+
+

All files / src/pricing pricing.module.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { PricingService } from './pricing.service';
+import { PricingController } from './pricing.controller';
+import { PriceHistory } from './entities/price-history.entity';
+import { DynamicPricingAlgorithm } from './algorithms/dynamic-pricing.algorithm';
+import { LocationAdjustmentAlgorithm } from './algorithms/location-adjustment.algorithm';
+import { TimePricingAlgorithm } from './algorithms/time-pricing.algorithm';
+import { PredictionAlgorithm } from './algorithms/prediction.algorithm';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([PriceHistory])],
+  controllers: [PricingController],
+  providers: [
+    PricingService,
+    DynamicPricingAlgorithm,
+    LocationAdjustmentAlgorithm,
+    TimePricingAlgorithm,
+    PredictionAlgorithm,
+  ],
+  exports: [
+    PricingService,
+    DynamicPricingAlgorithm,
+    LocationAdjustmentAlgorithm,
+    TimePricingAlgorithm,
+    PredictionAlgorithm,
+  ],
+})
+export class PricingModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pricing/pricing.service.ts.html b/coverage/lcov-report/src/pricing/pricing.service.ts.html new file mode 100644 index 0000000..40f2ee1 --- /dev/null +++ b/coverage/lcov-report/src/pricing/pricing.service.ts.html @@ -0,0 +1,1177 @@ + + + + + + Code coverage report for src/pricing/pricing.service.ts + + + + + + + + + +
+
+

All files / src/pricing pricing.service.ts

+
+ +
+ 0% + Statements + 0/364 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/364 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, LessThan } from 'typeorm';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { PriceHistory } from './entities/price-history.entity';
+import {
+  CalculatePriceDto,
+  PriceHistoryQueryDto,
+  PricePredictionDto,
+  EnergyType,
+} from './dto/calculate-price.dto';
+import { DynamicPricingAlgorithm } from './algorithms/dynamic-pricing.algorithm';
+import { LocationAdjustmentAlgorithm } from './algorithms/location-adjustment.algorithm';
+import { TimePricingAlgorithm } from './algorithms/time-pricing.algorithm';
+import { PredictionAlgorithm } from './algorithms/prediction.algorithm';
+
+@Injectable()
+export class PricingService {
+  private readonly logger = new Logger(PricingService.name);
+
+  constructor(
+    @InjectRepository(PriceHistory)
+    private priceHistoryRepository: Repository<PriceHistory>,
+    private dynamicPricingAlgorithm: DynamicPricingAlgorithm,
+    private locationAdjustmentAlgorithm: LocationAdjustmentAlgorithm,
+    private timePricingAlgorithm: TimePricingAlgorithm,
+    private predictionAlgorithm: PredictionAlgorithm,
+  ) {}
+
+  async calculatePrice(calculatePriceDto: CalculatePriceDto): Promise<{
+    basePrice: number;
+    finalPrice: number;
+    locationMultiplier: number;
+    timeMultiplier: number;
+    renewablePremium: number;
+    supplyDemandRatio: number;
+    isPeakHour: boolean;
+    predictedPrice?: number;
+    predictionAccuracy?: number;
+  }> {
+    const {
+      supply,
+      demand,
+      location,
+      energyType,
+      timestamp = Date.now(),
+      basePrice,
+      includePrediction = false,
+      predictionHorizonHours = 1,
+    } = calculatePriceDto;
+
+    const supplyDemandRatio = supply / demand;
+    const calculatedBasePrice = this.dynamicPricingAlgorithm.calculateBasePrice(
+      supply,
+      demand,
+      basePrice,
+    );
+
+    const locationMultiplier =
+      this.locationAdjustmentAlgorithm.calculateLocationMultiplier(location);
+    const timeMultiplier =
+      this.timePricingAlgorithm.calculateTimeMultiplier(timestamp);
+    const renewablePremium = this.calculateRenewablePremium(energyType);
+    const isPeakHour = this.timePricingAlgorithm.isPeakHour(timestamp);
+
+    let finalPrice = calculatedBasePrice * locationMultiplier * timeMultiplier;
+
+    if (this.isRenewableEnergy(energyType)) {
+      finalPrice *= 1 + renewablePremium;
+    }
+
+    finalPrice = this.dynamicPricingAlgorithm.applyPriceBounds(finalPrice);
+
+    const result: any = {
+      basePrice: Math.round(calculatedBasePrice * 100) / 100,
+      finalPrice: Math.round(finalPrice * 100) / 100,
+      locationMultiplier: Math.round(locationMultiplier * 100) / 100,
+      timeMultiplier: Math.round(timeMultiplier * 100) / 100,
+      renewablePremium: Math.round(renewablePremium * 100) / 100,
+      supplyDemandRatio: Math.round(supplyDemandRatio * 100) / 100,
+      isPeakHour,
+    };
+
+    if (includePrediction) {
+      const historicalData = await this.getHistoricalData(
+        location,
+        energyType,
+        168,
+      );
+      const prediction = this.predictionAlgorithm.predictPrice(
+        historicalData,
+        predictionHorizonHours,
+        supply,
+        demand,
+      );
+
+      result.predictedPrice = Math.round(prediction.predictedPrice * 100) / 100;
+      result.predictionAccuracy = Math.round(prediction.confidence * 100);
+    }
+
+    await this.savePriceHistory({
+      basePrice: calculatedBasePrice,
+      finalPrice,
+      location,
+      energyType,
+      supply,
+      demand,
+      supplyDemandRatio,
+      locationMultiplier,
+      timeMultiplier,
+      renewablePremium,
+      predictedPrice: result.predictedPrice,
+      predictionAccuracy: result.predictionAccuracy,
+      isPeakHour,
+      isRenewable: this.isRenewableEnergy(energyType),
+      timestamp: new Date(timestamp),
+    });
+
+    return result;
+  }
+
+  private calculateRenewablePremium(energyType: EnergyType): number {
+    const premiums = {
+      [EnergyType.SOLAR]: 0.05,
+      [EnergyType.WIND]: 0.08,
+      [EnergyType.HYDRO]: 0.03,
+      [EnergyType.NUCLEAR]: -0.02,
+      [EnergyType.FOSSIL]: 0.15,
+      [EnergyType.GEOTHERMAL]: 0.04,
+    };
+
+    return premiums[energyType] || 0;
+  }
+
+  private isRenewableEnergy(energyType: EnergyType): boolean {
+    return [
+      EnergyType.SOLAR,
+      EnergyType.WIND,
+      EnergyType.HYDRO,
+      EnergyType.GEOTHERMAL,
+    ].includes(energyType);
+  }
+
+  async predictPrice(predictionDto: PricePredictionDto): Promise<{
+    predictedPrice: number;
+    confidence: number;
+    factors: any;
+  }> {
+    const { location, energyType, hoursAhead, expectedSupply, expectedDemand } =
+      predictionDto;
+
+    const historicalData = await this.getHistoricalData(
+      location,
+      energyType,
+      168,
+    );
+
+    const prediction = this.predictionAlgorithm.predictPrice(
+      historicalData,
+      hoursAhead,
+      expectedSupply,
+      expectedDemand,
+    );
+
+    return {
+      predictedPrice: Math.round(prediction.predictedPrice * 100) / 100,
+      confidence: Math.round(prediction.confidence * 100) / 100,
+      factors: prediction.factors,
+    };
+  }
+
+  async getPriceHistory(query: PriceHistoryQueryDto): Promise<{
+    history: PriceHistory[];
+    total: number;
+    averagePrice: number;
+    minPrice: number;
+    maxPrice: number;
+  }> {
+    const {
+      location,
+      energyType,
+      startDate,
+      endDate,
+      page = 1,
+      limit = 10,
+    } = query;
+
+    const whereClause: any = {};
+
+    if (location) whereClause.location = location;
+    if (energyType) whereClause.energyType = energyType;
+    if (startDate) whereClause.timestamp = { $gte: new Date(startDate) };
+    if (endDate) whereClause.timestamp = { $lte: new Date(endDate) };
+
+    const [history, total] = await this.priceHistoryRepository.findAndCount({
+      where: whereClause,
+      order: { timestamp: 'DESC' },
+      skip: (page - 1) * limit,
+      take: limit,
+    });
+
+    const prices = history.map((h) => h.finalPrice);
+    const averagePrice =
+      prices.length > 0
+        ? prices.reduce((sum, price) => sum + price, 0) / prices.length
+        : 0;
+    const minPrice = prices.length > 0 ? Math.min(...prices) : 0;
+    const maxPrice = prices.length > 0 ? Math.max(...prices) : 0;
+
+    return {
+      history,
+      total,
+      averagePrice: Math.round(averagePrice * 100) / 100,
+      minPrice: Math.round(minPrice * 100) / 100,
+      maxPrice: Math.round(maxPrice * 100) / 100,
+    };
+  }
+
+  private async getHistoricalData(
+    location: string,
+    energyType: string,
+    hours: number,
+  ): Promise<PriceHistory[]> {
+    const startDate = new Date(Date.now() - hours * 60 * 60 * 1000);
+
+    return this.priceHistoryRepository.find({
+      where: {
+        location,
+        energyType,
+        timestamp: LessThan(new Date()),
+      },
+      order: { timestamp: 'DESC' },
+      take: 100,
+    });
+  }
+
+  private async savePriceHistory(
+    priceData: Partial<PriceHistory>,
+  ): Promise<void> {
+    const priceHistory = this.priceHistoryRepository.create(priceData);
+    await this.priceHistoryRepository.save(priceHistory);
+  }
+
+  async getPricingAnalytics(
+    location?: string,
+    energyType?: string,
+  ): Promise<{
+    totalTransactions: number;
+    averagePrice: number;
+    priceVolatility: number;
+    peakHourAverage: number;
+    offPeakHourAverage: number;
+    renewablePremium: number;
+    predictionAccuracy: number;
+  }> {
+    const whereClause: any = {};
+    if (location) whereClause.location = location;
+    if (energyType) whereClause.energyType = energyType;
+
+    const history = await this.priceHistoryRepository.find({
+      where: whereClause,
+      order: { timestamp: 'DESC' },
+      take: 1000,
+    });
+
+    if (history.length === 0) {
+      return {
+        totalTransactions: 0,
+        averagePrice: 0,
+        priceVolatility: 0,
+        peakHourAverage: 0,
+        offPeakHourAverage: 0,
+        renewablePremium: 0,
+        predictionAccuracy: 0,
+      };
+    }
+
+    const prices = history.map((h) => h.finalPrice);
+    const averagePrice =
+      prices.reduce((sum, price) => sum + price, 0) / prices.length;
+
+    const variance =
+      prices.reduce(
+        (sum, price) => sum + Math.pow(price - averagePrice, 2),
+        0,
+      ) / prices.length;
+    const priceVolatility = Math.sqrt(variance);
+
+    const peakHourPrices = history
+      .filter((h) => h.isPeakHour)
+      .map((h) => h.finalPrice);
+    const offPeakHourPrices = history
+      .filter((h) => !h.isPeakHour)
+      .map((h) => h.finalPrice);
+
+    const peakHourAverage =
+      peakHourPrices.length > 0
+        ? peakHourPrices.reduce((sum, price) => sum + price, 0) /
+          peakHourPrices.length
+        : 0;
+
+    const offPeakHourAverage =
+      offPeakHourPrices.length > 0
+        ? offPeakHourPrices.reduce((sum, price) => sum + price, 0) /
+          offPeakHourPrices.length
+        : 0;
+
+    const renewablePrices = history
+      .filter((h) => h.isRenewable)
+      .map((h) => h.finalPrice);
+    const nonRenewablePrices = history
+      .filter((h) => !h.isRenewable)
+      .map((h) => h.finalPrice);
+
+    const renewableAverage =
+      renewablePrices.length > 0
+        ? renewablePrices.reduce((sum, price) => sum + price, 0) /
+          renewablePrices.length
+        : 0;
+
+    const nonRenewableAverage =
+      nonRenewablePrices.length > 0
+        ? nonRenewablePrices.reduce((sum, price) => sum + price, 0) /
+          nonRenewablePrices.length
+        : 0;
+
+    const renewablePremium =
+      nonRenewableAverage > 0
+        ? (renewableAverage - nonRenewableAverage) / nonRenewableAverage
+        : 0;
+
+    const predictionsWithAccuracy = history.filter(
+      (h) => h.predictionAccuracy !== null,
+    );
+    const predictionAccuracy =
+      predictionsWithAccuracy.length > 0
+        ? predictionsWithAccuracy.reduce(
+            (sum, h) => sum + h.predictionAccuracy,
+            0,
+          ) / predictionsWithAccuracy.length
+        : 0;
+
+    return {
+      totalTransactions: history.length,
+      averagePrice: Math.round(averagePrice * 100) / 100,
+      priceVolatility: Math.round(priceVolatility * 100) / 100,
+      peakHourAverage: Math.round(peakHourAverage * 100) / 100,
+      offPeakHourAverage: Math.round(offPeakHourAverage * 100) / 100,
+      renewablePremium: Math.round(renewablePremium * 100) / 100,
+      predictionAccuracy: Math.round(predictionAccuracy * 100) / 100,
+    };
+  }
+
+  @Cron(CronExpression.EVERY_HOUR)
+  async cleanupOldData(): Promise<void> {
+    const cutoffDate = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000);
+
+    const result = await this.priceHistoryRepository.delete({
+      timestamp: LessThan(cutoffDate),
+    });
+
+    this.logger.log(`Cleaned up ${result.affected} old price records`);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/assessment/index.html b/coverage/lcov-report/src/risk/assessment/index.html new file mode 100644 index 0000000..c82d40e --- /dev/null +++ b/coverage/lcov-report/src/risk/assessment/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk/assessment + + + + + + + + + +
+
+

All files src/risk/assessment

+
+ +
+ 81.2% + Statements + 203/250 +
+ + +
+ 58.33% + Branches + 21/36 +
+ + +
+ 84.61% + Functions + 11/13 +
+ + +
+ 81.2% + Lines + 203/250 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
risk-assessor.service.ts +
+
81.2%203/25058.33%21/3684.61%11/1381.2%203/250
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/assessment/risk-assessor.service.ts.html b/coverage/lcov-report/src/risk/assessment/risk-assessor.service.ts.html new file mode 100644 index 0000000..d1b6f63 --- /dev/null +++ b/coverage/lcov-report/src/risk/assessment/risk-assessor.service.ts.html @@ -0,0 +1,835 @@ + + + + + + Code coverage report for src/risk/assessment/risk-assessor.service.ts + + + + + + + + + +
+
+

All files / src/risk/assessment risk-assessor.service.ts

+
+ +
+ 81.2% + Statements + 203/250 +
+ + +
+ 58.33% + Branches + 21/36 +
+ + +
+ 84.61% + Functions + 11/13 +
+ + +
+ 81.2% + Lines + 203/250 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +2511x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +3x +3x +6x +2x +2x +2x +2x +2x +6x +1x +1x +6x +  +  +6x +  +  +6x +6x +6x +6x +6x +6x +  +  +  +  +1x +1x +4x +4x +4x +4x +4x +4x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +  +  +  +4x +  +  +  +  +  +4x +  +  +  +  +  +  +4x +4x +4x +4x +4x +2x +2x +2x +4x +1x +1x +1x +4x +1x +1x +1x +4x +  +  +  +4x +  +  +  +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +4x +4x +4x +4x +  +4x +  +4x +  +4x +  +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { RiskDataEntity } from '../entities/risk-data.entity';
+import {
+  RiskAssessmentDto,
+  RiskType,
+  RiskLevel,
+} from '../dto/risk-assessment.dto';
+ 
+@Injectable()
+export class RiskAssessorService {
+  private readonly logger = new Logger(RiskAssessorService.name);
+ 
+  constructor(
+    @InjectRepository(RiskDataEntity)
+    private readonly riskDataRepository: Repository<RiskDataEntity>,
+  ) {}
+ 
+  async assessRisk(
+    riskAssessmentDto: RiskAssessmentDto,
+  ): Promise<RiskDataEntity> {
+    this.logger.log(
+      `Starting risk assessment for portfolio: ${riskAssessmentDto.portfolioId}`,
+    );
+ 
+    const riskLevel = await this.calculateRiskLevel(riskAssessmentDto);
+    const riskScore = await this.calculateRiskScore(
+      riskAssessmentDto,
+      riskLevel,
+    );
+ 
+    const riskData = this.riskDataRepository.create({
+      portfolioId: riskAssessmentDto.portfolioId,
+      riskType: riskAssessmentDto.riskType,
+      riskLevel: riskScore,
+      varValue: 0,
+      varConfidence: 0.95,
+      stressTestResult: {},
+      hedgingStrategy: {},
+      mitigationActions: await this.generateMitigationActions(
+        riskLevel,
+        riskAssessmentDto.riskType,
+      ),
+      complianceStatus: 'pending',
+      createdBy: 'risk-assessor',
+    });
+ 
+    const savedRiskData = await this.riskDataRepository.save(riskData);
+ 
+    this.logger.log(
+      `Risk assessment completed for portfolio: ${riskAssessmentDto.portfolioId}, Risk Level: ${riskLevel}`,
+    );
+ 
+    return savedRiskData;
+  }
+ 
+  async calculateRiskLevel(
+    riskAssessmentDto: RiskAssessmentDto,
+  ): Promise<RiskLevel> {
+    const { portfolioValue, riskType, marketData, historicalData } =
+      riskAssessmentDto;
+ 
+    let riskScore = 0;
+ 
+    // Base risk calculation by type
+    switch (riskType) {
+      case RiskType.MARKET:
+        riskScore = await this.calculateMarketRisk(portfolioValue, marketData);
+        break;
+      case RiskType.CREDIT:
+        riskScore = await this.calculateCreditRisk(
+          portfolioValue,
+          historicalData,
+        );
+        break;
+      case RiskType.OPERATIONAL:
+        riskScore = await this.calculateOperationalRisk(portfolioValue);
+        break;
+      case RiskType.LIQUIDITY:
+        riskScore = await this.calculateLiquidityRisk(portfolioValue);
+        break;
+      case RiskType.REGULATORY:
+        riskScore = await this.calculateRegulatoryRisk(portfolioValue);
+        break;
+      default:
+        riskScore = 2; // Medium risk by default
+    }
+ 
+    // Convert score to risk level
+    if (riskScore <= 1.5) return RiskLevel.LOW;
+    if (riskScore <= 2.5) return RiskLevel.MEDIUM;
+    if (riskScore <= 3.5) return RiskLevel.HIGH;
+    return RiskLevel.CRITICAL;
+  }
+ 
+  private async calculateRiskScore(
+    riskAssessmentDto: RiskAssessmentDto,
+    riskLevel: RiskLevel,
+  ): Promise<number> {
+    // Convert risk level to numerical score (1-4)
+    return riskLevel;
+  }
+ 
+  private async calculateMarketRisk(
+    portfolioValue: number,
+    marketData?: object,
+  ): Promise<number> {
+    // Simplified market risk calculation
+    const volatility = marketData?.['volatility'] || 0.2;
+    const beta = marketData?.['beta'] || 1.0;
+ 
+    const riskScore =
+      (volatility * beta * Math.log(portfolioValue / 1000000)) / 2;
+    return Math.max(1, Math.min(4, riskScore));
+  }
+ 
+  private async calculateCreditRisk(
+    portfolioValue: number,
+    historicalData?: object,
+  ): Promise<number> {
+    // Simplified credit risk calculation
+    const defaultRate = historicalData?.['defaultRate'] || 0.02;
+    const recoveryRate = historicalData?.['recoveryRate'] || 0.4;
+ 
+    const riskScore =
+      (defaultRate * (1 - recoveryRate) * Math.log(portfolioValue / 1000000)) /
+      1.5;
+    return Math.max(1, Math.min(4, riskScore));
+  }
+ 
+  private async calculateOperationalRisk(
+    portfolioValue: number,
+  ): Promise<number> {
+    // Simplified operational risk calculation
+    const complexityFactor = Math.log(portfolioValue / 1000000) / 10;
+    const riskScore = 1.5 + complexityFactor;
+    return Math.max(1, Math.min(4, riskScore));
+  }
+ 
+  private async calculateLiquidityRisk(
+    portfolioValue: number,
+  ): Promise<number> {
+    // Simplified liquidity risk calculation
+    const sizeFactor = Math.log(portfolioValue / 1000000) / 8;
+    const riskScore = 1.2 + sizeFactor;
+    return Math.max(1, Math.min(4, riskScore));
+  }
+ 
+  private async calculateRegulatoryRisk(
+    portfolioValue: number,
+  ): Promise<number> {
+    // Simplified regulatory risk calculation
+    const jurisdictionFactor = 1.5; // Based on cross-border complexity
+    const riskScore = jurisdictionFactor;
+    return Math.max(1, Math.min(4, riskScore));
+  }
+ 
+  private async generateMitigationActions(
+    riskLevel: RiskLevel,
+    riskType: RiskType,
+  ): Promise<object> {
+    const actions: string[] = [];
+ 
+    switch (riskLevel) {
+      case RiskLevel.LOW:
+        actions.push('Regular monitoring');
+        actions.push('Quarterly review');
+        break;
+      case RiskLevel.MEDIUM:
+        actions.push('Increased monitoring frequency');
+        actions.push('Implement basic hedging');
+        actions.push('Monthly review');
+        break;
+      case RiskLevel.HIGH:
+        actions.push('Daily monitoring');
+        actions.push('Advanced hedging strategies');
+        actions.push('Risk committee review');
+        actions.push('Contingency planning');
+        break;
+      case RiskLevel.CRITICAL:
+        actions.push('Real-time monitoring');
+        actions.push('Immediate hedging');
+        actions.push('Emergency response team');
+        actions.push('Position reduction');
+        actions.push('Senior management notification');
+        break;
+    }
+ 
+    // Add risk-type specific actions
+    switch (riskType) {
+      case RiskType.MARKET:
+        actions.push('Diversification review');
+        actions.push('Derivatives hedging');
+        break;
+      case RiskType.CREDIT:
+        actions.push('Credit enhancement');
+        actions.push('Collateral management');
+        break;
+      case RiskType.OPERATIONAL:
+        actions.push('Process review');
+        actions.push('System redundancy');
+        break;
+      case RiskType.LIQUIDITY:
+        actions.push('Cash reserve optimization');
+        actions.push('Credit line management');
+        break;
+      case RiskType.REGULATORY:
+        actions.push('Compliance review');
+        actions.push('Documentation update');
+        break;
+    }
+ 
+    return {
+      actions,
+      priority: riskLevel,
+      implementation: this.getImplementationTimeline(riskLevel),
+    };
+  }
+ 
+  private getImplementationTimeline(riskLevel: RiskLevel): string {
+    switch (riskLevel) {
+      case RiskLevel.LOW:
+        return '30 days';
+      case RiskLevel.MEDIUM:
+        return '14 days';
+      case RiskLevel.HIGH:
+        return '7 days';
+      case RiskLevel.CRITICAL:
+        return '24 hours';
+      default:
+        return '30 days';
+    }
+  }
+ 
+  async getRiskAssessment(portfolioId: string): Promise<RiskDataEntity[]> {
+    return this.riskDataRepository.find({
+      where: { portfolioId },
+      order: { createdAt: 'DESC' },
+    });
+  }
+ 
+  async updateRiskAssessment(
+    id: string,
+    updates: Partial<RiskDataEntity>,
+  ): Promise<RiskDataEntity | null> {
+    await this.riskDataRepository.update(id, updates);
+    return this.riskDataRepository.findOne({ where: { id } });
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/calculations/index.html b/coverage/lcov-report/src/risk/calculations/index.html new file mode 100644 index 0000000..5ad57bf --- /dev/null +++ b/coverage/lcov-report/src/risk/calculations/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk/calculations + + + + + + + + + +
+
+

All files src/risk/calculations

+
+ +
+ 0% + Statements + 0/527 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/527 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
var-calculator.service.ts +
+
0%0/5270%0/10%0/10%0/527
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/calculations/var-calculator.service.ts.html b/coverage/lcov-report/src/risk/calculations/var-calculator.service.ts.html new file mode 100644 index 0000000..7718fd9 --- /dev/null +++ b/coverage/lcov-report/src/risk/calculations/var-calculator.service.ts.html @@ -0,0 +1,1666 @@ + + + + + + Code coverage report for src/risk/calculations/var-calculator.service.ts + + + + + + + + + +
+
+

All files / src/risk/calculations var-calculator.service.ts

+
+ +
+ 0% + Statements + 0/527 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/527 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { RiskDataEntity } from '../entities/risk-data.entity';
+import { VarCalculationDto } from '../dto/risk-assessment.dto';
+
+@Injectable()
+export class VarCalculatorService {
+  private readonly logger = new Logger(VarCalculatorService.name);
+
+  constructor(
+    @InjectRepository(RiskDataEntity)
+    private readonly riskDataRepository: Repository<RiskDataEntity>,
+  ) {}
+
+  async calculateVar(varDto: VarCalculationDto): Promise<object> {
+    this.logger.log(
+      `Calculating VaR for portfolio: ${varDto.portfolioId}, Method: ${varDto.method}`,
+    );
+
+    const startTime = Date.now();
+
+    let varResult;
+    switch (varDto.method) {
+      case 'historical':
+        varResult = await this.calculateHistoricalVaR(varDto);
+        break;
+      case 'parametric':
+        varResult = await this.calculateParametricVaR(varDto);
+        break;
+      case 'monte_carlo':
+        varResult = await this.calculateMonteCarloVaR(varDto);
+        break;
+      default:
+        throw new Error(`Unsupported VaR method: ${varDto.method}`);
+    }
+
+    const processingTime = Date.now() - startTime;
+
+    // Ensure calculation is under 200ms as per requirements
+    if (processingTime > 200) {
+      this.logger.warn(
+        `VaR calculation exceeded 200ms threshold: ${processingTime}ms`,
+      );
+    }
+
+    // Update risk data with VaR results
+    await this.updateRiskDataWithVar(varDto.portfolioId, varResult);
+
+    this.logger.log(
+      `VaR calculation completed for ${varDto.portfolioId}: ${varResult.varValue} (${varDto.confidence * 100}% confidence)`,
+    );
+
+    return {
+      ...varResult,
+      processingTime,
+      accuracy: await this.calculateVarAccuracy(varDto.portfolioId, varResult),
+    };
+  }
+
+  private async calculateHistoricalVaR(
+    varDto: VarCalculationDto,
+  ): Promise<object> {
+    const { portfolioId, confidence, timeHorizon } = varDto;
+
+    // Get historical returns for the portfolio
+    const historicalReturns = await this.getHistoricalReturns(portfolioId);
+
+    // Calculate returns for the time horizon
+    const horizonReturns = this.calculateHorizonReturns(
+      historicalReturns,
+      timeHorizon,
+    );
+
+    // Sort returns to find percentile
+    horizonReturns.sort((a, b) => a - b);
+
+    // Calculate VaR at the specified confidence level
+    const percentileIndex = Math.floor(
+      (1 - confidence) * horizonReturns.length,
+    );
+    const varReturn = horizonReturns[percentileIndex];
+
+    // Get current portfolio value
+    const portfolioValue = await this.getPortfolioValue(portfolioId);
+    const varValue = Math.abs(varReturn * portfolioValue);
+
+    return {
+      method: 'historical',
+      varValue,
+      varReturn,
+      confidence,
+      timeHorizon,
+      dataPoints: historicalReturns.length,
+      assumptions: {
+        distribution: 'empirical',
+        stationarity: true,
+        sufficientHistory: historicalReturns.length >= 252, // 1 year of trading days
+      },
+      metrics: {
+        mean: this.calculateMean(historicalReturns),
+        volatility: this.calculateVolatility(historicalReturns),
+        skewness: this.calculateSkewness(historicalReturns),
+        kurtosis: this.calculateKurtosis(historicalReturns),
+      },
+    };
+  }
+
+  private async calculateParametricVaR(
+    varDto: VarCalculationDto,
+  ): Promise<object> {
+    const { portfolioId, confidence, timeHorizon } = varDto;
+
+    // Get portfolio statistics
+    const returns = await this.getHistoricalReturns(portfolioId);
+    const mean = this.calculateMean(returns);
+    const volatility = this.calculateVolatility(returns);
+
+    // Calculate z-score for the confidence level
+    const zScore = this.getZScore(confidence);
+
+    // Calculate parametric VaR
+    const timeAdjustedVolatility = volatility * Math.sqrt(timeHorizon);
+    const timeAdjustedMean = mean * timeHorizon;
+    const varReturn = timeAdjustedMean - zScore * timeAdjustedVolatility;
+
+    const portfolioValue = await this.getPortfolioValue(portfolioId);
+    const varValue = Math.abs(varReturn * portfolioValue);
+
+    return {
+      method: 'parametric',
+      varValue,
+      varReturn,
+      confidence,
+      timeHorizon,
+      parameters: {
+        mean,
+        volatility,
+        zScore,
+        timeAdjustedVolatility,
+        timeAdjustedMean,
+      },
+      assumptions: {
+        distribution: 'normal',
+        iidReturns: true,
+        constantParameters: true,
+      },
+      metrics: {
+        mean,
+        volatility,
+        sharpeRatio: mean / volatility,
+        maxDrawdown: this.calculateMaxDrawdown(returns),
+      },
+    };
+  }
+
+  private async calculateMonteCarloVaR(
+    varDto: VarCalculationDto,
+  ): Promise<object> {
+    const {
+      portfolioId,
+      confidence,
+      timeHorizon,
+      simulations = 10000,
+    } = varDto;
+
+    // Get portfolio parameters
+    const returns = await this.getHistoricalReturns(portfolioId);
+    const mean = this.calculateMean(returns);
+    const volatility = this.calculateVolatility(returns);
+
+    // Generate Monte Carlo simulations
+    const simulatedReturns = this.runMonteCarloSimulation(
+      mean,
+      volatility,
+      timeHorizon,
+      simulations,
+    );
+
+    // Sort simulated returns
+    simulatedReturns.sort((a, b) => a - b);
+
+    // Calculate VaR at the specified confidence level
+    const percentileIndex = Math.floor(
+      (1 - confidence) * simulatedReturns.length,
+    );
+    const varReturn = simulatedReturns[percentileIndex];
+
+    const portfolioValue = await this.getPortfolioValue(portfolioId);
+    const varValue = Math.abs(varReturn * portfolioValue);
+
+    return {
+      method: 'monte_carlo',
+      varValue,
+      varReturn,
+      confidence,
+      timeHorizon,
+      simulations,
+      parameters: {
+        mean,
+        volatility,
+        simulationCount: simulations,
+        randomSeed: Date.now(),
+      },
+      assumptions: {
+        distribution: 'normal',
+        geometricBrownianMotion: true,
+        riskNeutral: false,
+      },
+      metrics: {
+        mean: this.calculateMean(simulatedReturns),
+        volatility: this.calculateVolatility(simulatedReturns),
+        percentiles: this.calculatePercentiles(simulatedReturns),
+        convergence: this.checkConvergence(simulatedReturns),
+      },
+    };
+  }
+
+  private async getHistoricalReturns(portfolioId: string): Promise<number[]> {
+    // Get historical returns for the portfolio
+    // In production, this would query actual historical data
+    const returns: number[] = [];
+
+    // Generate sample historical returns (252 trading days = 1 year)
+    for (let i = 0; i < 252; i++) {
+      returns.push(this.generateRandomReturn(0.0005, 0.02)); // 0.05% daily return, 2% daily volatility
+    }
+
+    return returns;
+  }
+
+  private generateRandomReturn(mean: number, volatility: number): number {
+    // Generate random return using normal distribution
+    const u1 = Math.random();
+    const u2 = Math.random();
+    const z = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
+    return mean + volatility * z;
+  }
+
+  private calculateHorizonReturns(
+    returns: number[],
+    timeHorizon: number,
+  ): number[] {
+    // Calculate compounded returns over the time horizon
+    const horizonReturns: number[] = [];
+
+    for (let i = 0; i <= returns.length - timeHorizon; i++) {
+      let horizonReturn = 0;
+      for (let j = 0; j < timeHorizon; j++) {
+        horizonReturn += returns[i + j];
+      }
+      horizonReturns.push(horizonReturn);
+    }
+
+    return horizonReturns;
+  }
+
+  private getZScore(confidence: number): number {
+    // Get z-score for normal distribution
+    const zScores = {
+      0.9: 1.282,
+      0.95: 1.645,
+      0.96: 1.751,
+      0.97: 1.881,
+      0.98: 2.054,
+      0.99: 2.326,
+      0.995: 2.576,
+    };
+    return zScores[confidence] || 1.645;
+  }
+
+  private runMonteCarloSimulation(
+    mean: number,
+    volatility: number,
+    timeHorizon: number,
+    simulations: number,
+  ): number[] {
+    const simulatedReturns: number[] = [];
+
+    for (let i = 0; i < simulations; i++) {
+      let totalReturn = 0;
+
+      for (let j = 0; j < timeHorizon; j++) {
+        totalReturn += this.generateRandomReturn(mean, volatility);
+      }
+
+      simulatedReturns.push(totalReturn);
+    }
+
+    return simulatedReturns;
+  }
+
+  private async getPortfolioValue(portfolioId: string): Promise<number> {
+    // Get current portfolio value
+    // In production, this would query actual portfolio data
+    return 1000000; // $1M default portfolio value
+  }
+
+  private calculateMean(returns: number[]): number {
+    return returns.reduce((sum, ret) => sum + ret, 0) / returns.length;
+  }
+
+  private calculateVolatility(returns: number[]): number {
+    const mean = this.calculateMean(returns);
+    const squaredDiffs = returns.map((ret) => Math.pow(ret - mean, 2));
+    const variance =
+      squaredDiffs.reduce((sum, diff) => sum + diff, 0) / returns.length;
+    return Math.sqrt(variance);
+  }
+
+  private calculateSkewness(returns: number[]): number {
+    const mean = this.calculateMean(returns);
+    const volatility = this.calculateVolatility(returns);
+    const cubedDiffs = returns.map((ret) =>
+      Math.pow((ret - mean) / volatility, 3),
+    );
+    return cubedDiffs.reduce((sum, diff) => sum + diff, 0) / returns.length;
+  }
+
+  private calculateKurtosis(returns: number[]): number {
+    const mean = this.calculateMean(returns);
+    const volatility = this.calculateVolatility(returns);
+    const fourthPowerDiffs = returns.map((ret) =>
+      Math.pow((ret - mean) / volatility, 4),
+    );
+    return (
+      fourthPowerDiffs.reduce((sum, diff) => sum + diff, 0) / returns.length
+    );
+  }
+
+  private calculateMaxDrawdown(returns: number[]): number {
+    let maxDrawdown = 0;
+    let peak = 0;
+    let cumulativeReturn = 0;
+
+    for (const ret of returns) {
+      cumulativeReturn += ret;
+      peak = Math.max(peak, cumulativeReturn);
+      const drawdown = peak - cumulativeReturn;
+      maxDrawdown = Math.max(maxDrawdown, drawdown);
+    }
+
+    return maxDrawdown;
+  }
+
+  private calculatePercentiles(returns: number[]): object {
+    const sortedReturns = [...returns].sort((a, b) => a - b);
+    return {
+      p1: sortedReturns[Math.floor(0.01 * sortedReturns.length)],
+      p5: sortedReturns[Math.floor(0.05 * sortedReturns.length)],
+      p25: sortedReturns[Math.floor(0.25 * sortedReturns.length)],
+      p50: sortedReturns[Math.floor(0.5 * sortedReturns.length)],
+      p75: sortedReturns[Math.floor(0.75 * sortedReturns.length)],
+      p95: sortedReturns[Math.floor(0.95 * sortedReturns.length)],
+      p99: sortedReturns[Math.floor(0.99 * sortedReturns.length)],
+    };
+  }
+
+  private checkConvergence(returns: number[]): boolean {
+    // Check if Monte Carlo simulation has converged
+    const sampleSize = Math.min(1000, returns.length);
+    const firstHalf = returns.slice(0, sampleSize / 2);
+    const secondHalf = returns.slice(sampleSize / 2, sampleSize);
+
+    const firstMean = this.calculateMean(firstHalf);
+    const secondMean = this.calculateMean(secondHalf);
+
+    // Check if means are within 5% of each other
+    const difference = Math.abs(firstMean - secondMean);
+    const average = (firstMean + secondMean) / 2;
+
+    return difference / Math.abs(average) < 0.05;
+  }
+
+  private async calculateVarAccuracy(
+    portfolioId: string,
+    varResult: Record<string, any>,
+  ): Promise<number> {
+    // Calculate VaR accuracy by backtesting
+    const backtestResults = await this.backtestVar(portfolioId, varResult);
+
+    // Accuracy is 1 minus the breach rate difference from expected
+    const expectedBreachRate = 1 - varResult['confidence'];
+    const actualBreachRate = backtestResults.breachRate;
+
+    return Math.max(0, 1 - Math.abs(expectedBreachRate - actualBreachRate));
+  }
+
+  private async backtestVar(
+    portfolioId: string,
+    varResult: Record<string, any>,
+  ): Promise<Record<string, any>> {
+    // Backtest VaR model against historical data
+    const historicalReturns = await this.getHistoricalReturns(portfolioId);
+    const varThreshold = varResult['varReturn'];
+
+    let breaches = 0;
+    for (const ret of historicalReturns) {
+      if (ret < varThreshold) {
+        breaches++;
+      }
+    }
+
+    const breachRate = breaches / historicalReturns.length;
+
+    return {
+      breaches,
+      totalObservations: historicalReturns.length,
+      breachRate,
+      expectedBreachRate: 1 - varResult['confidence'],
+      kupiecPValue: this.calculateKupiecPValue(
+        breaches,
+        historicalReturns.length,
+        1 - varResult['confidence'],
+      ),
+    };
+  }
+
+  private calculateKupiecPValue(
+    breaches: number,
+    observations: number,
+    expectedBreachRate: number,
+  ): number {
+    // Calculate Kupiec test p-value for VaR model validation
+    const actualBreachRate = breaches / observations;
+
+    if (breaches === 0) return 1;
+
+    // Likelihood ratio test statistic
+    const lr =
+      2 *
+      (breaches * Math.log(actualBreachRate / expectedBreachRate) +
+        (observations - breaches) *
+          Math.log((1 - actualBreachRate) / (1 - expectedBreachRate)));
+
+    // Chi-square distribution with 1 degree of freedom
+    return 1 - this.chiSquareCDF(lr, 1);
+  }
+
+  private chiSquareCDF(x: number, df: number): number {
+    // Simplified chi-square CDF calculation
+    // In production, use a proper statistical library
+    return Math.min(1, x / (df + Math.sqrt(2 * df)));
+  }
+
+  private async updateRiskDataWithVar(
+    portfolioId: string,
+    varResult: Record<string, any>,
+  ): Promise<void> {
+    const latestRiskData = await this.riskDataRepository.findOne({
+      where: { portfolioId },
+      order: { createdAt: 'DESC' },
+    });
+
+    if (!latestRiskData) {
+      return;
+    }
+
+    await this.riskDataRepository.update(latestRiskData.id, {
+      varValue: varResult['varValue'],
+      varConfidence: varResult['confidence'],
+    });
+  }
+
+  async compareVarMethods(
+    portfolioId: string,
+    confidence: number,
+    timeHorizon: number,
+  ): Promise<Record<string, any>> {
+    this.logger.log(`Comparing VaR methods for portfolio: ${portfolioId}`);
+
+    const methods = ['historical', 'parametric', 'monte_carlo'] as const;
+    const results: Record<string, any> = {};
+
+    for (const method of methods) {
+      const varDto: VarCalculationDto = {
+        portfolioId,
+        confidence,
+        timeHorizon,
+        method,
+        simulations: method === 'monte_carlo' ? 10000 : undefined,
+      };
+
+      results[method] = await this.calculateVar(varDto);
+    }
+
+    return {
+      portfolioId,
+      confidence,
+      timeHorizon,
+      results,
+      comparison: {
+        lowestVar: Math.min(...Object.values(results).map((r) => r.varValue)),
+        highestVar: Math.max(...Object.values(results).map((r) => r.varValue)),
+        variance: this.calculateVariance(
+          Object.values(results).map((r) => r.varValue),
+        ),
+        recommendation: this.getVarRecommendation(results),
+      },
+    };
+  }
+
+  private calculateVariance(values: number[]): number {
+    const mean = values.reduce((sum, val) => sum + val, 0) / values.length;
+    const squaredDiffs = values.map((val) => Math.pow(val - mean, 2));
+    return squaredDiffs.reduce((sum, diff) => sum + diff, 0) / values.length;
+  }
+
+  private getVarRecommendation(results: Record<string, any>): string {
+    const historical = results['historical'];
+    const parametric = results['parametric'];
+    const monteCarlo = results['monte_carlo'];
+
+    // Recommend method based on accuracy and stability
+    const accuracyScores = {
+      historical: historical.accuracy,
+      parametric: parametric.accuracy,
+      monte_carlo: monteCarlo.accuracy,
+    };
+
+    const bestMethod = Object.entries(accuracyScores).sort(
+      ([, a], [, b]) => b - a,
+    )[0][0];
+
+    return `Use ${bestMethod} method - highest accuracy: ${accuracyScores[bestMethod]}`;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/controller/index.html b/coverage/lcov-report/src/risk/controller/index.html new file mode 100644 index 0000000..e276a0c --- /dev/null +++ b/coverage/lcov-report/src/risk/controller/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk/controller + + + + + + + + + +
+
+

All files src/risk/controller

+
+ +
+ 0% + Statements + 0/411 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/411 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
risk-management.controller.ts +
+
0%0/4110%0/10%0/10%0/411
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/controller/risk-management.controller.ts.html b/coverage/lcov-report/src/risk/controller/risk-management.controller.ts.html new file mode 100644 index 0000000..88eed5b --- /dev/null +++ b/coverage/lcov-report/src/risk/controller/risk-management.controller.ts.html @@ -0,0 +1,1318 @@ + + + + + + Code coverage report for src/risk/controller/risk-management.controller.ts + + + + + + + + + +
+
+

All files / src/risk/controller risk-management.controller.ts

+
+ +
+ 0% + Statements + 0/411 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/411 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Controller,
+  Get,
+  Post,
+  Body,
+  Param,
+  Query,
+  HttpCode,
+  HttpStatus,
+} from '@nestjs/common';
+import {
+  ApiTags,
+  ApiOperation,
+  ApiResponse,
+  ApiParam,
+  ApiQuery,
+} from '@nestjs/swagger';
+import { RiskAssessorService } from '../assessment/risk-assessor.service';
+import { RealTimeMonitorService } from '../monitoring/real-time-monitor.service';
+import { HedgingStrategyService } from '../hedging/hedging-strategy.service';
+import { VarCalculatorService } from '../calculations/var-calculator.service';
+import { StressTestService } from '../testing/stress-test.service';
+import {
+  RiskAssessmentDto,
+  RiskMonitoringDto,
+  HedgingStrategyDto,
+  VarCalculationDto,
+  StressTestDto,
+  RiskReportDto,
+} from '../dto/risk-assessment.dto';
+
+@ApiTags('Risk Management')
+@Controller('risk')
+export class RiskManagementController {
+  constructor(
+    private readonly riskAssessorService: RiskAssessorService,
+    private readonly realTimeMonitorService: RealTimeMonitorService,
+    private readonly hedgingStrategyService: HedgingStrategyService,
+    private readonly varCalculatorService: VarCalculatorService,
+    private readonly stressTestService: StressTestService,
+  ) {}
+
+  @Post('assessment')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Perform risk assessment for a portfolio' })
+  @ApiResponse({
+    status: 200,
+    description: 'Risk assessment completed successfully',
+  })
+  @ApiResponse({ status: 400, description: 'Invalid risk assessment data' })
+  async assessRisk(@Body() riskAssessmentDto: RiskAssessmentDto) {
+    return this.riskAssessorService.assessRisk(riskAssessmentDto);
+  }
+
+  @Get('assessment/:portfolioId')
+  @ApiOperation({ summary: 'Get risk assessment history for a portfolio' })
+  @ApiParam({ name: 'portfolioId', description: 'Portfolio ID' })
+  @ApiResponse({
+    status: 200,
+    description: 'Risk assessment history retrieved successfully',
+  })
+  async getRiskAssessment(@Param('portfolioId') portfolioId: string) {
+    return this.riskAssessorService.getRiskAssessment(portfolioId);
+  }
+
+  @Post('monitoring/start')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Start real-time risk monitoring for a portfolio' })
+  @ApiResponse({
+    status: 200,
+    description: 'Real-time monitoring started successfully',
+  })
+  async startMonitoring(@Body() monitoringDto: RiskMonitoringDto) {
+    await this.realTimeMonitorService.startMonitoring(monitoringDto);
+    return {
+      message: 'Real-time monitoring started',
+      portfolioId: monitoringDto.portfolioId,
+    };
+  }
+
+  @Post('monitoring/stop/:portfolioId')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Stop real-time risk monitoring for a portfolio' })
+  @ApiParam({ name: 'portfolioId', description: 'Portfolio ID' })
+  @ApiResponse({
+    status: 200,
+    description: 'Real-time monitoring stopped successfully',
+  })
+  async stopMonitoring(@Param('portfolioId') portfolioId: string) {
+    await this.realTimeMonitorService.stopMonitoring(portfolioId);
+    return { message: 'Real-time monitoring stopped', portfolioId };
+  }
+
+  @Post('hedging/strategy')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Create hedging strategy for a portfolio' })
+  @ApiResponse({
+    status: 200,
+    description: 'Hedging strategy created successfully',
+  })
+  async createHedgingStrategy(@Body() hedgingDto: HedgingStrategyDto) {
+    return this.hedgingStrategyService.createHedgingStrategy(hedgingDto);
+  }
+
+  @Get('hedging/performance/:portfolioId')
+  @ApiOperation({ summary: 'Evaluate hedging strategy performance' })
+  @ApiParam({ name: 'portfolioId', description: 'Portfolio ID' })
+  @ApiResponse({
+    status: 200,
+    description: 'Hedging performance evaluated successfully',
+  })
+  async evaluateHedgingPerformance(@Param('portfolioId') portfolioId: string) {
+    return this.hedgingStrategyService.evaluateHedgingPerformance(portfolioId);
+  }
+
+  @Post('hedging/adjust/:portfolioId')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Adjust hedging strategy for a portfolio' })
+  @ApiParam({ name: 'portfolioId', description: 'Portfolio ID' })
+  @ApiResponse({
+    status: 200,
+    description: 'Hedging strategy adjusted successfully',
+  })
+  async adjustHedgingStrategy(
+    @Param('portfolioId') portfolioId: string,
+    @Body() adjustments: object,
+  ) {
+    return this.hedgingStrategyService.adjustHedgingStrategy(
+      portfolioId,
+      adjustments,
+    );
+  }
+
+  @Post('var/calculate')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Calculate Value at Risk (VaR) for a portfolio' })
+  @ApiResponse({
+    status: 200,
+    description: 'VaR calculation completed successfully',
+  })
+  async calculateVar(@Body() varDto: VarCalculationDto) {
+    return this.varCalculatorService.calculateVar(varDto);
+  }
+
+  @Get('var/compare/:portfolioId')
+  @ApiOperation({ summary: 'Compare VaR calculation methods for a portfolio' })
+  @ApiParam({ name: 'portfolioId', description: 'Portfolio ID' })
+  @ApiQuery({
+    name: 'confidence',
+    description: 'Confidence level (0.95-0.99)',
+    required: false,
+  })
+  @ApiQuery({
+    name: 'timeHorizon',
+    description: 'Time horizon in days',
+    required: false,
+  })
+  @ApiResponse({
+    status: 200,
+    description: 'VaR methods comparison completed successfully',
+  })
+  async compareVarMethods(
+    @Param('portfolioId') portfolioId: string,
+    @Query('confidence') confidence: number = 0.95,
+    @Query('timeHorizon') timeHorizon: number = 10,
+  ) {
+    return this.varCalculatorService.compareVarMethods(
+      portfolioId,
+      confidence,
+      timeHorizon,
+    );
+  }
+
+  @Post('stress-test')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Run stress test scenarios for a portfolio' })
+  @ApiResponse({
+    status: 200,
+    description: 'Stress test completed successfully',
+  })
+  async runStressTest(@Body() stressTestDto: StressTestDto) {
+    return this.stressTestService.runStressTest(stressTestDto);
+  }
+
+  @Get('stress-test/library')
+  @ApiOperation({ summary: 'Get available stress test scenarios library' })
+  @ApiResponse({
+    status: 200,
+    description: 'Stress test library retrieved successfully',
+  })
+  async getStressTestLibrary() {
+    return this.stressTestService.getStressTestLibrary();
+  }
+
+  @Post('reports/generate')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Generate risk report for a portfolio' })
+  @ApiResponse({
+    status: 200,
+    description: 'Risk report generated successfully',
+  })
+  async generateRiskReport(@Body() reportDto: RiskReportDto) {
+    return this.generateReport(reportDto);
+  }
+
+  @Get('dashboard/:portfolioId')
+  @ApiOperation({ summary: 'Get risk dashboard data for a portfolio' })
+  @ApiParam({ name: 'portfolioId', description: 'Portfolio ID' })
+  @ApiResponse({
+    status: 200,
+    description: 'Risk dashboard data retrieved successfully',
+  })
+  async getRiskDashboard(@Param('portfolioId') portfolioId: string) {
+    return this.getDashboardData(portfolioId);
+  }
+
+  @Get('alerts')
+  @ApiOperation({ summary: 'Get active risk alerts' })
+  @ApiQuery({
+    name: 'severity',
+    description: 'Filter by severity level',
+    required: false,
+  })
+  @ApiQuery({
+    name: 'portfolioId',
+    description: 'Filter by portfolio ID',
+    required: false,
+  })
+  @ApiResponse({
+    status: 200,
+    description: 'Risk alerts retrieved successfully',
+  })
+  async getRiskAlerts(
+    @Query('severity') severity?: string,
+    @Query('portfolioId') portfolioId?: string,
+  ) {
+    return this.getAlerts(severity, portfolioId);
+  }
+
+  @Get('metrics/summary')
+  @ApiOperation({ summary: 'Get overall risk metrics summary' })
+  @ApiResponse({
+    status: 200,
+    description: 'Risk metrics summary retrieved successfully',
+  })
+  async getRiskMetricsSummary() {
+    return this.getMetricsSummary();
+  }
+
+  // Private helper methods for report generation and dashboard data
+  private async generateReport(reportDto: RiskReportDto): Promise<object> {
+    const { portfolioId, reportType, includeMetrics, format } = reportDto;
+
+    const reportData = {
+      portfolioId,
+      reportType,
+      generatedAt: new Date(),
+      format: format || 'json',
+      metrics: {
+        riskAssessment:
+          await this.riskAssessorService.getRiskAssessment(portfolioId),
+        varMetrics: await this.varCalculatorService.compareVarMethods(
+          portfolioId,
+          0.95,
+          10,
+        ),
+        stressTestResults: await this.stressTestService.runStressTest({
+          portfolioId,
+          scenarios: ['market_crash', 'interest_rate_shock', 'currency_crisis'],
+        }),
+        hedgingPerformance:
+          await this.hedgingStrategyService.evaluateHedgingPerformance(
+            portfolioId,
+          ),
+      },
+      summary: await this.generateReportSummary(portfolioId),
+    };
+
+    return reportData;
+  }
+
+  private async getDashboardData(portfolioId: string): Promise<object> {
+    const [
+      riskAssessment,
+      varComparison,
+      hedgingPerformance,
+      stressTestResults,
+    ] = await Promise.all([
+      this.riskAssessorService.getRiskAssessment(portfolioId),
+      this.varCalculatorService.compareVarMethods(portfolioId, 0.95, 10),
+      this.hedgingStrategyService.evaluateHedgingPerformance(portfolioId),
+      this.stressTestService.runStressTest({
+        portfolioId,
+        scenarios: ['market_crash', 'interest_rate_shock'],
+      }),
+    ]);
+
+    const varComparisonData = varComparison;
+    const hedgingPerformanceData = hedgingPerformance as Record<string, any>;
+    const stressTestData = stressTestResults as Record<string, any>;
+
+    return {
+      portfolioId,
+      lastUpdated: new Date(),
+      overview: {
+        currentRiskLevel: riskAssessment[0]?.riskLevel || 2,
+        varValue: varComparisonData.comparison?.lowestVar,
+        hedgingEffectiveness: hedgingPerformanceData.actualEffectiveness,
+        stressTestResilience: stressTestData.summary?.overallResilience,
+      },
+      charts: {
+        riskTrend: await this.getRiskTrendData(portfolioId),
+        varComparison,
+        stressTestResults: stressTestData.scenarios,
+      },
+      alerts: await this.getAlerts(undefined, portfolioId),
+      recommendations: stressTestData.recommendations,
+    };
+  }
+
+  private async getAlerts(
+    severity?: string,
+    portfolioId?: string,
+  ): Promise<object[]> {
+    // Mock alerts data - in production, this would query actual alerts
+    const alerts = [
+      {
+        id: '1',
+        portfolioId: 'portfolio-1',
+        severity: 'HIGH',
+        type: 'RISK_THRESHOLD',
+        message: 'Risk level exceeded threshold',
+        timestamp: new Date(),
+        acknowledged: false,
+      },
+      {
+        id: '2',
+        portfolioId: 'portfolio-2',
+        severity: 'MEDIUM',
+        type: 'VAR_BREACH',
+        message: 'VaR breach detected',
+        timestamp: new Date(),
+        acknowledged: true,
+      },
+    ];
+
+    let filteredAlerts = alerts;
+
+    if (severity) {
+      filteredAlerts = filteredAlerts.filter(
+        (alert) => alert.severity === severity,
+      );
+    }
+
+    if (portfolioId) {
+      filteredAlerts = filteredAlerts.filter(
+        (alert) => alert.portfolioId === portfolioId,
+      );
+    }
+
+    return filteredAlerts;
+  }
+
+  private async getMetricsSummary(): Promise<object> {
+    return {
+      totalPortfolios: 150,
+      activeMonitoring: 45,
+      highRiskPortfolios: 12,
+      criticalAlerts: 3,
+      averageVar: 75000,
+      totalHedgedValue: 50000000,
+      stressTestCoverage: 0.95,
+      lastUpdated: new Date(),
+    };
+  }
+
+  private async generateReportSummary(portfolioId: string): Promise<object> {
+    return {
+      riskLevel: 'MEDIUM',
+      riskTrend: 'STABLE',
+      keyRisks: ['Market risk', 'Liquidity risk'],
+      mitigations: ['Hedging program active', 'Liquidity buffer maintained'],
+      recommendations: [
+        'Consider increasing hedge ratio',
+        'Monitor market volatility closely',
+      ],
+      compliance: 'COMPLIANT',
+    };
+  }
+
+  private async getRiskTrendData(portfolioId: string): Promise<object> {
+    // Mock trend data - in production, this would query historical data
+    return {
+      labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
+      datasets: [
+        {
+          label: 'Risk Level',
+          data: [2.1, 2.3, 2.0, 2.5, 2.4, 2.2],
+          borderColor: 'rgb(255, 99, 132)',
+          backgroundColor: 'rgba(255, 99, 132, 0.2)',
+        },
+        {
+          label: 'VaR ($)',
+          data: [45000, 52000, 48000, 58000, 55000, 50000],
+          borderColor: 'rgb(54, 162, 235)',
+          backgroundColor: 'rgba(54, 162, 235, 0.2)',
+        },
+      ],
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/dto/index.html b/coverage/lcov-report/src/risk/dto/index.html new file mode 100644 index 0000000..d532b5d --- /dev/null +++ b/coverage/lcov-report/src/risk/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk/dto + + + + + + + + + +
+
+

All files src/risk/dto

+
+ +
+ 100% + Statements + 151/151 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 151/151 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
risk-assessment.dto.ts +
+
100%151/151100%2/2100%0/0100%151/151
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/dto/risk-assessment.dto.ts.html b/coverage/lcov-report/src/risk/dto/risk-assessment.dto.ts.html new file mode 100644 index 0000000..018417d --- /dev/null +++ b/coverage/lcov-report/src/risk/dto/risk-assessment.dto.ts.html @@ -0,0 +1,538 @@ + + + + + + Code coverage report for src/risk/dto/risk-assessment.dto.ts + + + + + + + + + +
+
+

All files / src/risk/dto risk-assessment.dto.ts

+
+ +
+ 100% + Statements + 151/151 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 151/151 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +1521x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import {
+  IsString,
+  IsNumber,
+  IsOptional,
+  IsObject,
+  IsEnum,
+  Min,
+  Max,
+  IsBoolean,
+  IsArray,
+} from 'class-validator';
+ 
+export enum RiskType {
+  MARKET = 'market',
+  CREDIT = 'credit',
+  OPERATIONAL = 'operational',
+  LIQUIDITY = 'liquidity',
+  REGULATORY = 'regulatory',
+}
+ 
+export enum RiskLevel {
+  LOW = 1,
+  MEDIUM = 2,
+  HIGH = 3,
+  CRITICAL = 4,
+}
+ 
+export class RiskAssessmentDto {
+  @IsString()
+  portfolioId: string;
+ 
+  @IsEnum(RiskType)
+  riskType: RiskType;
+ 
+  @IsNumber()
+  @Min(0)
+  @Max(100000000)
+  portfolioValue: number;
+ 
+  @IsOptional()
+  @IsObject()
+  marketData?: object;
+ 
+  @IsOptional()
+  @IsObject()
+  historicalData?: object;
+ 
+  @IsOptional()
+  @IsString()
+  assessmentNotes?: string;
+}
+ 
+export class RiskMonitoringDto {
+  @IsString()
+  portfolioId: string;
+ 
+  @IsOptional()
+  @IsNumber()
+  @Min(0.95)
+  @Max(0.99)
+  varConfidence?: number;
+ 
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(30)
+  timeHorizon?: number;
+ 
+  @IsOptional()
+  @IsBoolean()
+  enableRealTimeAlerts?: boolean;
+}
+ 
+export class HedgingStrategyDto {
+  @IsString()
+  portfolioId: string;
+ 
+  @IsNumber()
+  @Min(0)
+  @Max(1)
+  hedgeRatio: number;
+ 
+  @IsString()
+  instrument: string;
+ 
+  @IsNumber()
+  @Min(1)
+  @Max(365)
+  maturity: number;
+ 
+  @IsOptional()
+  @IsObject()
+  customParameters?: object;
+}
+ 
+export class StressTestDto {
+  @IsString()
+  portfolioId: string;
+ 
+  @IsArray()
+  scenarios: string[];
+ 
+  @IsOptional()
+  @IsNumber()
+  @Min(-100)
+  @Max(100)
+  shockMagnitude?: number;
+ 
+  @IsOptional()
+  @IsObject()
+  customScenario?: object;
+}
+ 
+export class VarCalculationDto {
+  @IsString()
+  portfolioId: string;
+ 
+  @IsNumber()
+  @Min(0.95)
+  @Max(0.99)
+  confidence: number;
+ 
+  @IsNumber()
+  @Min(1)
+  @Max(30)
+  timeHorizon: number;
+ 
+  @IsEnum(['historical', 'parametric', 'monte_carlo'])
+  method: 'historical' | 'parametric' | 'monte_carlo';
+ 
+  @IsOptional()
+  @IsNumber()
+  @Min(100)
+  simulations?: number;
+}
+ 
+export class RiskReportDto {
+  @IsString()
+  portfolioId: string;
+ 
+  @IsEnum(['daily', 'weekly', 'monthly', 'on_demand'])
+  reportType: 'daily' | 'weekly' | 'monthly' | 'on_demand';
+ 
+  @IsOptional()
+  @IsArray()
+  includeMetrics?: string[];
+ 
+  @IsOptional()
+  @IsString()
+  format?: 'json' | 'pdf' | 'csv';
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/entities/index.html b/coverage/lcov-report/src/risk/entities/index.html new file mode 100644 index 0000000..50f4c2c --- /dev/null +++ b/coverage/lcov-report/src/risk/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk/entities + + + + + + + + + +
+
+

All files src/risk/entities

+
+ +
+ 100% + Statements + 49/49 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 49/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
risk-data.entity.ts +
+
100%49/49100%0/0100%0/0100%49/49
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/entities/risk-data.entity.ts.html b/coverage/lcov-report/src/risk/entities/risk-data.entity.ts.html new file mode 100644 index 0000000..230775a --- /dev/null +++ b/coverage/lcov-report/src/risk/entities/risk-data.entity.ts.html @@ -0,0 +1,232 @@ + + + + + + Code coverage report for src/risk/entities/risk-data.entity.ts + + + + + + + + + +
+
+

All files / src/risk/entities risk-data.entity.ts

+
+ +
+ 100% + Statements + 49/49 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 49/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +501x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+} from 'typeorm';
+ 
+@Entity('risk_data')
+export class RiskDataEntity {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+ 
+  @Column({ name: 'portfolio_id' })
+  portfolioId: string;
+ 
+  @Column({ name: 'risk_type' })
+  riskType: string;
+ 
+  @Column({ name: 'risk_level', type: 'decimal', precision: 10, scale: 2 })
+  riskLevel: number;
+ 
+  @Column({ name: 'var_value', type: 'decimal', precision: 15, scale: 2 })
+  varValue: number;
+ 
+  @Column({ name: 'var_confidence', type: 'decimal', precision: 5, scale: 2 })
+  varConfidence: number;
+ 
+  @Column({ name: 'stress_test_result', type: 'json' })
+  stressTestResult: object;
+ 
+  @Column({ name: 'hedging_strategy', type: 'json' })
+  hedgingStrategy: object;
+ 
+  @Column({ name: 'mitigation_actions', type: 'json' })
+  mitigationActions: object;
+ 
+  @Column({ name: 'compliance_status', default: 'pending' })
+  complianceStatus: string;
+ 
+  @Column({ name: 'created_by' })
+  createdBy: string;
+ 
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+ 
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/hedging/hedging-strategy.service.ts.html b/coverage/lcov-report/src/risk/hedging/hedging-strategy.service.ts.html new file mode 100644 index 0000000..7fa8c03 --- /dev/null +++ b/coverage/lcov-report/src/risk/hedging/hedging-strategy.service.ts.html @@ -0,0 +1,1414 @@ + + + + + + Code coverage report for src/risk/hedging/hedging-strategy.service.ts + + + + + + + + + +
+
+

All files / src/risk/hedging hedging-strategy.service.ts

+
+ +
+ 0% + Statements + 0/443 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/443 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { RiskDataEntity } from '../entities/risk-data.entity';
+import { HedgingStrategyDto } from '../dto/risk-assessment.dto';
+
+@Injectable()
+export class HedgingStrategyService {
+  private readonly logger = new Logger(HedgingStrategyService.name);
+
+  constructor(
+    @InjectRepository(RiskDataEntity)
+    private readonly riskDataRepository: Repository<RiskDataEntity>,
+  ) {}
+
+  async createHedgingStrategy(hedgingDto: HedgingStrategyDto): Promise<object> {
+    this.logger.log(
+      `Creating hedging strategy for portfolio: ${hedgingDto.portfolioId}`,
+    );
+
+    const strategy = await this.generateOptimalHedgingStrategy(hedgingDto);
+    const effectiveness = await this.calculateHedgingEffectiveness(
+      hedgingDto,
+      strategy,
+    );
+    const cost = await this.calculateHedgingCost(strategy);
+
+    const hedgingStrategy = {
+      portfolioId: hedgingDto.portfolioId,
+      strategy,
+      effectiveness,
+      cost,
+      riskReduction: effectiveness * 0.3, // Target 30% risk reduction as per requirements
+      implementation: await this.generateImplementationPlan(strategy),
+      monitoring: await this.generateMonitoringPlan(strategy),
+    };
+
+    // Update risk data with hedging strategy
+    await this.updateRiskDataWithHedgingStrategy(
+      hedgingDto.portfolioId,
+      hedgingStrategy,
+    );
+
+    this.logger.log(
+      `Hedging strategy created for portfolio: ${hedgingDto.portfolioId}, Expected risk reduction: ${hedgingStrategy.riskReduction * 100}%`,
+    );
+
+    return hedgingStrategy;
+  }
+
+  private async generateOptimalHedgingStrategy(
+    hedgingDto: HedgingStrategyDto,
+  ): Promise<object> {
+    const { portfolioId, hedgeRatio, instrument, maturity, customParameters } =
+      hedgingDto;
+
+    // Determine optimal hedging instruments based on portfolio characteristics
+    const portfolioProfile = await this.getPortfolioProfile(portfolioId);
+
+    const strategy = {
+      primaryInstrument:
+        instrument || this.selectOptimalInstrument(portfolioProfile),
+      hedgeRatio:
+        hedgeRatio || this.calculateOptimalHedgeRatio(portfolioProfile),
+      maturity: maturity || this.selectOptimalMaturity(portfolioProfile),
+      secondaryInstruments:
+        await this.selectSecondaryInstruments(portfolioProfile),
+      dynamicAdjustment: true,
+      rebalancingFrequency:
+        this.calculateRebalancingFrequency(portfolioProfile),
+      customParameters: customParameters || {},
+    };
+
+    return strategy;
+  }
+
+  private async getPortfolioProfile(portfolioId: string): Promise<object> {
+    // Get portfolio characteristics for optimal hedging
+    return {
+      size: 1000000, // $1M default
+      duration: 5, // years
+      convexity: 0.1,
+      volatility: 0.2,
+      liquidity: 'high',
+      currencyExposure: ['USD', 'EUR'],
+      commodityExposure: ['oil', 'gas'],
+    };
+  }
+
+  private selectOptimalInstrument(portfolioProfile: object): string {
+    // Select optimal hedging instrument based on portfolio profile
+    const volatility = portfolioProfile['volatility'];
+    const liquidity = portfolioProfile['liquidity'];
+
+    if (volatility > 0.25) {
+      return 'options'; // High volatility - use options for downside protection
+    } else if (liquidity === 'high') {
+      return 'futures'; // High liquidity - use futures for cost efficiency
+    } else {
+      return 'forwards'; // Lower liquidity - use forwards for customization
+    }
+  }
+
+  private calculateOptimalHedgeRatio(portfolioProfile: object): number {
+    // Calculate optimal hedge ratio (0-1)
+    const volatility = portfolioProfile['volatility'];
+    const size = portfolioProfile['size'];
+
+    // Higher volatility and larger size warrant higher hedge ratios
+    const baseRatio = 0.5;
+    const volatilityAdjustment = Math.min(volatility * 2, 0.3);
+    const sizeAdjustment = Math.min(Math.log(size / 1000000) / 10, 0.2);
+
+    return Math.min(0.95, baseRatio + volatilityAdjustment + sizeAdjustment);
+  }
+
+  private selectOptimalMaturity(portfolioProfile: object): number {
+    // Select optimal maturity in days
+    const duration = portfolioProfile['duration'];
+
+    // Match hedge maturity to portfolio duration
+    return Math.max(30, Math.min(365, duration * 30));
+  }
+
+  private async selectSecondaryInstruments(
+    portfolioProfile: object,
+  ): Promise<string[]> {
+    // Select additional hedging instruments for diversification
+    const instruments: string[] = [];
+
+    if (portfolioProfile['currencyExposure'].length > 1) {
+      instruments.push('currency forwards');
+    }
+
+    if (portfolioProfile['commodityExposure'].includes('oil')) {
+      instruments.push('commodity swaps');
+    }
+
+    if (portfolioProfile['volatility'] > 0.3) {
+      instruments.push('volatility swaps');
+    }
+
+    return instruments;
+  }
+
+  private calculateRebalancingFrequency(portfolioProfile: object): string {
+    // Calculate how often to rebalance the hedge
+    const volatility = portfolioProfile['volatility'];
+
+    if (volatility > 0.3) return 'daily';
+    if (volatility > 0.2) return 'weekly';
+    return 'monthly';
+  }
+
+  private async calculateHedgingEffectiveness(
+    hedgingDto: HedgingStrategyDto,
+    strategy: object,
+  ): Promise<number> {
+    // Calculate expected hedging effectiveness (0-1)
+    const baseEffectiveness = 0.7; // 70% base effectiveness
+    const instrumentBonus = this.getInstrumentEffectivenessBonus(
+      strategy['primaryInstrument'],
+    );
+    const maturityBonus = this.getMaturityEffectivenessBonus(
+      strategy['maturity'],
+    );
+    const diversificationBonus = Math.min(
+      strategy['secondaryInstruments'].length * 0.05,
+      0.15,
+    );
+
+    const totalEffectiveness =
+      baseEffectiveness +
+      instrumentBonus +
+      maturityBonus +
+      diversificationBonus;
+
+    return Math.min(0.95, totalEffectiveness); // Cap at 95%
+  }
+
+  private getInstrumentEffectivenessBonus(instrument: string): number {
+    const bonuses = {
+      futures: 0.1,
+      options: 0.15,
+      forwards: 0.12,
+      swaps: 0.08,
+    };
+    return bonuses[instrument] || 0.05;
+  }
+
+  private getMaturityEffectivenessBonus(maturity: number): number {
+    // Optimal maturity around 90-180 days gets bonus
+    if (maturity >= 90 && maturity <= 180) return 0.05;
+    if (maturity >= 30 && maturity <= 365) return 0.02;
+    return 0;
+  }
+
+  private async calculateHedgingCost(strategy: object): Promise<object> {
+    // Calculate hedging costs
+    const transactionCosts = this.calculateTransactionCosts(strategy);
+    const ongoingCosts = this.calculateOngoingCosts(strategy);
+    const opportunityCost = this.calculateOpportunityCost(strategy);
+
+    return {
+      transactionCosts,
+      ongoingCosts,
+      opportunityCost,
+      totalCost: transactionCosts + ongoingCosts + opportunityCost,
+      costAsPercentage:
+        ((transactionCosts + ongoingCosts + opportunityCost) / 1000000) * 100, // Assuming $1M portfolio
+    };
+  }
+
+  private calculateTransactionCosts(strategy: object): number {
+    const instrument = strategy['primaryInstrument'];
+    const hedgeRatio = strategy['hedgeRatio'];
+
+    const baseCosts = {
+      futures: 0.001, // 0.1%
+      options: 0.02, // 2%
+      forwards: 0.002, // 0.2%
+      swaps: 0.005, // 0.5%
+    };
+
+    return (baseCosts[instrument] || 0.005) * hedgeRatio * 1000000; // Assuming $1M portfolio
+  }
+
+  private calculateOngoingCosts(strategy: object): number {
+    const rebalancingFrequency = strategy['rebalancingFrequency'];
+    const instrument = strategy['primaryInstrument'];
+
+    const frequencyMultiplier = {
+      daily: 252,
+      weekly: 52,
+      monthly: 12,
+    };
+
+    const perRebalancingCost = {
+      futures: 10,
+      options: 50,
+      forwards: 25,
+      swaps: 100,
+    };
+
+    return (
+      frequencyMultiplier[rebalancingFrequency] *
+      (perRebalancingCost[instrument] || 25)
+    );
+  }
+
+  private calculateOpportunityCost(strategy: object): number {
+    // Opportunity cost of capital tied up in hedging
+    const hedgeRatio = strategy['hedgeRatio'];
+    const portfolioValue = 1000000; // Assuming $1M portfolio
+    const riskFreeRate = 0.03; // 3% risk-free rate
+
+    return portfolioValue * hedgeRatio * riskFreeRate;
+  }
+
+  private async generateImplementationPlan(strategy: object): Promise<object> {
+    return {
+      phases: [
+        {
+          phase: 'Setup',
+          duration: '1-2 days',
+          tasks: [
+            'Open trading accounts',
+            'Set up risk management systems',
+            'Configure monitoring alerts',
+          ],
+        },
+        {
+          phase: 'Initial Hedge',
+          duration: '1 day',
+          tasks: [
+            'Execute primary hedge transactions',
+            'Set up secondary hedges',
+            'Confirm hedge ratios',
+          ],
+        },
+        {
+          phase: 'Monitoring',
+          duration: 'Ongoing',
+          tasks: [
+            'Daily hedge effectiveness monitoring',
+            'Weekly performance review',
+            'Monthly strategy adjustment',
+          ],
+        },
+      ],
+      resources: [
+        'Risk management team',
+        'Trading desk',
+        'Compliance officer',
+        'Technology support',
+      ],
+      risks: [
+        'Counterparty risk',
+        'Liquidity risk',
+        'Model risk',
+        'Operational risk',
+      ],
+    };
+  }
+
+  private async generateMonitoringPlan(strategy: object): Promise<object> {
+    return {
+      frequency: strategy['rebalancingFrequency'],
+      metrics: [
+        'Hedge effectiveness',
+        'Cost tracking',
+        'Risk reduction',
+        'Counterparty exposure',
+        'Liquidity metrics',
+      ],
+      alerts: [
+        'Hedge effectiveness below 60%',
+        'Cost increase over 20%',
+        'Counterparty rating downgrade',
+        'Liquidity deterioration',
+      ],
+      reporting: {
+        daily: ['Hedge effectiveness', 'P&L impact'],
+        weekly: ['Cost analysis', 'Risk metrics'],
+        monthly: ['Strategy review', 'Performance attribution'],
+      },
+    };
+  }
+
+  private async updateRiskDataWithHedgingStrategy(
+    portfolioId: string,
+    hedgingStrategy: object,
+  ): Promise<void> {
+    const latestRiskData = await this.riskDataRepository.findOne({
+      where: { portfolioId },
+      order: { createdAt: 'DESC' },
+    });
+
+    if (!latestRiskData) {
+      return;
+    }
+
+    await this.riskDataRepository.update(latestRiskData.id, {
+      hedgingStrategy,
+    });
+  }
+
+  async evaluateHedgingPerformance(portfolioId: string): Promise<object> {
+    this.logger.log(
+      `Evaluating hedging performance for portfolio: ${portfolioId}`,
+    );
+
+    const riskData = await this.riskDataRepository.findOne({
+      where: { portfolioId },
+      order: { createdAt: 'DESC' },
+    });
+
+    if (!riskData || !riskData.hedgingStrategy) {
+      throw new Error('No hedging strategy found for portfolio');
+    }
+
+    const actualEffectiveness =
+      await this.calculateActualEffectiveness(portfolioId);
+    const expectedEffectiveness = riskData.hedgingStrategy['effectiveness'];
+    const performanceRatio = actualEffectiveness / expectedEffectiveness;
+
+    return {
+      portfolioId,
+      actualEffectiveness,
+      expectedEffectiveness,
+      performanceRatio,
+      recommendation: this.getPerformanceRecommendation(performanceRatio),
+      lastUpdated: new Date(),
+    };
+  }
+
+  private async calculateActualEffectiveness(
+    portfolioId: string,
+  ): Promise<number> {
+    // Calculate actual hedging effectiveness based on historical performance
+    // In production, this would analyze actual P&L data
+    return 0.75; // Placeholder: 75% actual effectiveness
+  }
+
+  private getPerformanceRecommendation(performanceRatio: number): string {
+    if (performanceRatio >= 0.9) return 'Continue current strategy';
+    if (performanceRatio >= 0.7) return 'Minor adjustments recommended';
+    if (performanceRatio >= 0.5) return 'Strategy revision required';
+    return 'Immediate strategy change needed';
+  }
+
+  async adjustHedgingStrategy(
+    portfolioId: string,
+    adjustments: object,
+  ): Promise<object> {
+    this.logger.log(`Adjusting hedging strategy for portfolio: ${portfolioId}`);
+
+    const currentStrategy = await this.getCurrentHedgingStrategy(portfolioId);
+    const adjustedStrategy = await this.applyAdjustments(
+      currentStrategy,
+      adjustments,
+    );
+
+    await this.updateRiskDataWithHedgingStrategy(portfolioId, adjustedStrategy);
+
+    return {
+      portfolioId,
+      previousStrategy: currentStrategy,
+      adjustedStrategy,
+      adjustments,
+      timestamp: new Date(),
+    };
+  }
+
+  private async getCurrentHedgingStrategy(
+    portfolioId: string,
+  ): Promise<object> {
+    const riskData = await this.riskDataRepository.findOne({
+      where: { portfolioId },
+      order: { createdAt: 'DESC' },
+    });
+
+    return riskData?.hedgingStrategy || {};
+  }
+
+  private async applyAdjustments(
+    currentStrategy: object,
+    adjustments: object,
+  ): Promise<object> {
+    return {
+      ...currentStrategy,
+      ...adjustments,
+      lastAdjusted: new Date(),
+      adjustmentHistory: [
+        ...(currentStrategy['adjustmentHistory'] || []),
+        {
+          timestamp: new Date(),
+          adjustments,
+        },
+      ],
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/hedging/index.html b/coverage/lcov-report/src/risk/hedging/index.html new file mode 100644 index 0000000..633b7fc --- /dev/null +++ b/coverage/lcov-report/src/risk/hedging/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk/hedging + + + + + + + + + +
+
+

All files src/risk/hedging

+
+ +
+ 0% + Statements + 0/443 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/443 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
hedging-strategy.service.ts +
+
0%0/4430%0/10%0/10%0/443
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/index.html b/coverage/lcov-report/src/risk/index.html new file mode 100644 index 0000000..2353c70 --- /dev/null +++ b/coverage/lcov-report/src/risk/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk + + + + + + + + + +
+
+

All files src/risk

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
risk-management.module.ts +
+
0%0/290%0/10%0/10%0/29
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/monitoring/index.html b/coverage/lcov-report/src/risk/monitoring/index.html new file mode 100644 index 0000000..362a538 --- /dev/null +++ b/coverage/lcov-report/src/risk/monitoring/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk/monitoring + + + + + + + + + +
+
+

All files src/risk/monitoring

+
+ +
+ 0% + Statements + 0/341 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/341 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
real-time-monitor.service.ts +
+
0%0/3410%0/10%0/10%0/341
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/monitoring/real-time-monitor.service.ts.html b/coverage/lcov-report/src/risk/monitoring/real-time-monitor.service.ts.html new file mode 100644 index 0000000..fff50fe --- /dev/null +++ b/coverage/lcov-report/src/risk/monitoring/real-time-monitor.service.ts.html @@ -0,0 +1,1108 @@ + + + + + + Code coverage report for src/risk/monitoring/real-time-monitor.service.ts + + + + + + + + + +
+
+

All files / src/risk/monitoring real-time-monitor.service.ts

+
+ +
+ 0% + Statements + 0/341 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/341 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { RiskDataEntity } from '../entities/risk-data.entity';
+import { RiskMonitoringDto } from '../dto/risk-assessment.dto';
+import { Cron, Interval } from '@nestjs/schedule';
+
+@Injectable()
+export class RealTimeMonitorService {
+  private readonly logger = new Logger(RealTimeMonitorService.name);
+  private readonly monitoringIntervals = new Map<string, NodeJS.Timeout>();
+  private readonly riskThresholds = {
+    low: 1.5,
+    medium: 2.5,
+    high: 3.5,
+    critical: 4.0,
+  };
+
+  constructor(
+    @InjectRepository(RiskDataEntity)
+    private readonly riskDataRepository: Repository<RiskDataEntity>,
+  ) {}
+
+  async startMonitoring(monitoringDto: RiskMonitoringDto): Promise<void> {
+    const {
+      portfolioId,
+      varConfidence = 0.95,
+      timeHorizon = 10,
+      enableRealTimeAlerts = true,
+    } = monitoringDto;
+
+    this.logger.log(
+      `Starting real-time monitoring for portfolio: ${portfolioId}`,
+    );
+
+    // Clear existing monitoring for this portfolio
+    this.stopMonitoring(portfolioId);
+
+    // Set up monitoring interval (every 10 seconds as per requirements)
+    const interval = setInterval(async () => {
+      await this.performRiskCheck(
+        portfolioId,
+        varConfidence,
+        timeHorizon,
+        enableRealTimeAlerts,
+      );
+    }, 10000);
+
+    this.monitoringIntervals.set(portfolioId, interval);
+
+    // Perform initial check
+    await this.performRiskCheck(
+      portfolioId,
+      varConfidence,
+      timeHorizon,
+      enableRealTimeAlerts,
+    );
+  }
+
+  async stopMonitoring(portfolioId: string): Promise<void> {
+    const interval = this.monitoringIntervals.get(portfolioId);
+    if (interval) {
+      clearInterval(interval);
+      this.monitoringIntervals.delete(portfolioId);
+      this.logger.log(`Stopped monitoring for portfolio: ${portfolioId}`);
+    }
+  }
+
+  private async performRiskCheck(
+    portfolioId: string,
+    varConfidence: number,
+    timeHorizon: number,
+    enableRealTimeAlerts: boolean,
+  ): Promise<void> {
+    try {
+      const startTime = Date.now();
+
+      // Get latest risk data
+      const latestRiskData = await this.getLatestRiskData(portfolioId);
+
+      if (!latestRiskData) {
+        this.logger.warn(`No risk data found for portfolio: ${portfolioId}`);
+        return;
+      }
+
+      // Calculate current risk metrics
+      const currentRiskLevel =
+        await this.calculateCurrentRiskLevel(portfolioId);
+      const varValue = await this.calculateRealTimeVaR(
+        portfolioId,
+        varConfidence,
+        timeHorizon,
+      );
+
+      // Check for risk breaches
+      const riskBreach = await this.checkRiskThresholds(
+        currentRiskLevel,
+        latestRiskData.riskLevel,
+      );
+
+      if (riskBreach.hasBreach && enableRealTimeAlerts) {
+        await this.triggerRiskAlert(portfolioId, riskBreach);
+      }
+
+      // Update risk data with latest metrics
+      await this.updateRiskMetrics(portfolioId, {
+        riskLevel: currentRiskLevel,
+        varValue,
+        varConfidence,
+        lastChecked: new Date(),
+      });
+
+      const processingTime = Date.now() - startTime;
+      this.logger.debug(
+        `Risk check completed for ${portfolioId} in ${processingTime}ms`,
+      );
+
+      // Ensure processing time is under 200ms as per requirements
+      if (processingTime > 200) {
+        this.logger.warn(
+          `Risk check exceeded 200ms threshold: ${processingTime}ms`,
+        );
+      }
+    } catch (error) {
+      this.logger.error(
+        `Error during risk check for portfolio ${portfolioId}:`,
+        error,
+      );
+    }
+  }
+
+  private async getLatestRiskData(
+    portfolioId: string,
+  ): Promise<RiskDataEntity | null> {
+    return this.riskDataRepository.findOne({
+      where: { portfolioId },
+      order: { createdAt: 'DESC' },
+    });
+  }
+
+  private async calculateCurrentRiskLevel(
+    portfolioId: string,
+  ): Promise<number> {
+    // Simulate real-time risk calculation
+    // In production, this would pull live market data and calculate actual risk
+    const baseRisk = 2.0; // Medium risk baseline
+    const volatility = Math.random() * 0.5 - 0.25; // Random volatility ±25%
+    const marketStress = this.getMarketStressFactor();
+
+    return Math.max(1, Math.min(4, baseRisk + volatility + marketStress));
+  }
+
+  private async calculateRealTimeVaR(
+    portfolioId: string,
+    confidence: number,
+    timeHorizon: number,
+  ): Promise<number> {
+    // Simplified real-time VaR calculation
+    // In production, this would use actual portfolio positions and market data
+    const portfolioValue = await this.getPortfolioValue(portfolioId);
+    const volatility = 0.2; // 20% annual volatility
+    const timeAdjustment = Math.sqrt(timeHorizon / 252); // Trading days adjustment
+    const confidenceFactor = this.getConfidenceFactor(confidence);
+
+    return portfolioValue * volatility * timeAdjustment * confidenceFactor;
+  }
+
+  private async getPortfolioValue(portfolioId: string): Promise<number> {
+    // Simulate portfolio value retrieval
+    // In production, this would query actual portfolio data
+    return 1000000; // $1M default portfolio value
+  }
+
+  private getConfidenceFactor(confidence: number): number {
+    // Simplified confidence factor calculation
+    const factors: { [key: number]: number } = {
+      0.95: 1.645,
+      0.96: 1.751,
+      0.97: 1.881,
+      0.98: 2.054,
+      0.99: 2.326,
+    };
+    return factors[confidence] || 1.645;
+  }
+
+  private getMarketStressFactor(): number {
+    // Simulate market stress factor
+    // In production, this would use actual market volatility indices
+    const vix = Math.random() * 50 + 10; // Simulated VIX between 10-60
+    return Math.max(-0.5, (vix - 20) / 40); // Normalize to -0.5 to 0.5
+  }
+
+  private async checkRiskThresholds(
+    currentRisk: number,
+    previousRisk: number,
+  ): Promise<{
+    hasBreach: boolean;
+    breachType: string;
+    severity: string;
+  }> {
+    const riskIncrease = currentRisk - previousRisk;
+    const thresholdIncrease = 0.5; // Alert on 0.5 point increase
+
+    if (currentRisk >= this.riskThresholds.critical) {
+      return {
+        hasBreach: true,
+        breachType: 'CRITICAL_THRESHOLD',
+        severity: 'CRITICAL',
+      };
+    }
+
+    if (currentRisk >= this.riskThresholds.high) {
+      return {
+        hasBreach: true,
+        breachType: 'HIGH_THRESHOLD',
+        severity: 'HIGH',
+      };
+    }
+
+    if (riskIncrease >= thresholdIncrease) {
+      return {
+        hasBreach: true,
+        breachType: 'RAPID_INCREASE',
+        severity: currentRisk >= 3 ? 'HIGH' : 'MEDIUM',
+      };
+    }
+
+    return {
+      hasBreach: false,
+      breachType: 'NONE',
+      severity: 'LOW',
+    };
+  }
+
+  private async triggerRiskAlert(
+    portfolioId: string,
+    riskBreach: any,
+  ): Promise<void> {
+    this.logger.warn(
+      `RISK ALERT - Portfolio: ${portfolioId}, Type: ${riskBreach.breachType}, Severity: ${riskBreach.severity}`,
+    );
+
+    // In production, this would send notifications via various channels
+    // Email, SMS, Slack, dashboard alerts, etc.
+
+    const alertData = {
+      portfolioId,
+      alertType: riskBreach.breachType,
+      severity: riskBreach.severity,
+      timestamp: new Date(),
+      requiresImmediateAction: riskBreach.severity === 'CRITICAL',
+    };
+
+    // Store alert for audit trail
+    await this.storeRiskAlert(alertData);
+  }
+
+  private async storeRiskAlert(alertData: object): Promise<void> {
+    // In production, this would store alerts in a dedicated alerts table
+    this.logger.log(`Risk alert stored: ${JSON.stringify(alertData)}`);
+  }
+
+  private async updateRiskMetrics(
+    portfolioId: string,
+    metrics: object,
+  ): Promise<void> {
+    const latestRiskData = await this.riskDataRepository.findOne({
+      where: { portfolioId },
+      order: { createdAt: 'DESC' },
+    });
+
+    if (!latestRiskData) {
+      return;
+    }
+
+    await this.riskDataRepository.update(latestRiskData.id, metrics);
+  }
+
+  // Cron job for daily risk summaries
+  @Cron('0 0 * * *') // At midnight every day
+  async generateDailyRiskSummary(): Promise<void> {
+    this.logger.log('Generating daily risk summary');
+
+    const activePortfolios = await this.getActivePortfolios();
+
+    for (const portfolioId of activePortfolios) {
+      await this.generatePortfolioRiskSummary(portfolioId);
+    }
+  }
+
+  private async getActivePortfolios(): Promise<string[]> {
+    // Get all portfolios being monitored
+    return Array.from(this.monitoringIntervals.keys());
+  }
+
+  private async generatePortfolioRiskSummary(
+    portfolioId: string,
+  ): Promise<void> {
+    // Generate daily risk summary for each portfolio
+    const summary = {
+      portfolioId,
+      date: new Date().toISOString().split('T')[0],
+      maxRiskLevel: await this.getMaxRiskLevel(portfolioId),
+      averageRiskLevel: await this.getAverageRiskLevel(portfolioId),
+      varBreachCount: await this.getVarBreachCount(portfolioId),
+      alertsTriggered: await this.getAlertCount(portfolioId),
+    };
+
+    this.logger.log(
+      `Daily risk summary for ${portfolioId}: ${JSON.stringify(summary)}`,
+    );
+  }
+
+  private async getMaxRiskLevel(portfolioId: string): Promise<number> {
+    // Calculate max risk level for the day
+    return 2.5; // Placeholder
+  }
+
+  private async getAverageRiskLevel(portfolioId: string): Promise<number> {
+    // Calculate average risk level for the day
+    return 2.0; // Placeholder
+  }
+
+  private async getVarBreachCount(portfolioId: string): Promise<number> {
+    // Count VaR breaches for the day
+    return 0; // Placeholder
+  }
+
+  private async getAlertCount(portfolioId: string): Promise<number> {
+    // Count alerts triggered for the day
+    return 1; // Placeholder
+  }
+
+  // Cleanup on service destruction
+  onModuleDestroy() {
+    for (const [portfolioId, interval] of this.monitoringIntervals) {
+      clearInterval(interval);
+    }
+    this.monitoringIntervals.clear();
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/risk-management.module.ts.html b/coverage/lcov-report/src/risk/risk-management.module.ts.html new file mode 100644 index 0000000..b479e02 --- /dev/null +++ b/coverage/lcov-report/src/risk/risk-management.module.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/risk/risk-management.module.ts + + + + + + + + + +
+
+

All files / src/risk risk-management.module.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { RiskDataEntity } from './entities/risk-data.entity';
+import { RiskAssessorService } from './assessment/risk-assessor.service';
+import { RealTimeMonitorService } from './monitoring/real-time-monitor.service';
+import { HedgingStrategyService } from './hedging/hedging-strategy.service';
+import { VarCalculatorService } from './calculations/var-calculator.service';
+import { StressTestService } from './testing/stress-test.service';
+import { RiskManagementController } from './controller/risk-management.controller';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([RiskDataEntity])],
+  controllers: [RiskManagementController],
+  providers: [
+    RiskAssessorService,
+    RealTimeMonitorService,
+    HedgingStrategyService,
+    VarCalculatorService,
+    StressTestService,
+  ],
+  exports: [
+    RiskAssessorService,
+    RealTimeMonitorService,
+    HedgingStrategyService,
+    VarCalculatorService,
+    StressTestService,
+  ],
+})
+export class RiskManagementModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/testing/index.html b/coverage/lcov-report/src/risk/testing/index.html new file mode 100644 index 0000000..d5d0458 --- /dev/null +++ b/coverage/lcov-report/src/risk/testing/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/risk/testing + + + + + + + + + +
+
+

All files src/risk/testing

+
+ +
+ 0% + Statements + 0/695 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/695 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
stress-test.service.ts +
+
0%0/6950%0/10%0/10%0/695
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/risk/testing/stress-test.service.ts.html b/coverage/lcov-report/src/risk/testing/stress-test.service.ts.html new file mode 100644 index 0000000..d3c87aa --- /dev/null +++ b/coverage/lcov-report/src/risk/testing/stress-test.service.ts.html @@ -0,0 +1,2170 @@ + + + + + + Code coverage report for src/risk/testing/stress-test.service.ts + + + + + + + + + +
+
+

All files / src/risk/testing stress-test.service.ts

+
+ +
+ 0% + Statements + 0/695 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/695 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { RiskDataEntity } from '../entities/risk-data.entity';
+import { StressTestDto } from '../dto/risk-assessment.dto';
+
+@Injectable()
+export class StressTestService {
+  private readonly logger = new Logger(StressTestService.name);
+
+  constructor(
+    @InjectRepository(RiskDataEntity)
+    private readonly riskDataRepository: Repository<RiskDataEntity>,
+  ) {}
+
+  async runStressTest(stressTestDto: StressTestDto): Promise<object> {
+    this.logger.log(
+      `Running stress test for portfolio: ${stressTestDto.portfolioId}`,
+    );
+
+    const results: {
+      portfolioId: string;
+      scenarios: Record<string, any>;
+      summary: Record<string, any>;
+      recommendations: string[];
+      timestamp: Date;
+    } = {
+      portfolioId: stressTestDto.portfolioId,
+      scenarios: {},
+      summary: {},
+      recommendations: [],
+      timestamp: new Date(),
+    };
+
+    // Run predefined scenarios
+    for (const scenario of stressTestDto.scenarios) {
+      results.scenarios[scenario] = await this.runScenario(
+        stressTestDto.portfolioId,
+        scenario,
+        stressTestDto.shockMagnitude,
+      );
+    }
+
+    // Run custom scenario if provided
+    if (stressTestDto.customScenario) {
+      results.scenarios['custom'] = await this.runCustomScenario(
+        stressTestDto.portfolioId,
+        stressTestDto.customScenario,
+      );
+    }
+
+    // Generate summary and recommendations
+    results.summary = await this.generateStressTestSummary(results.scenarios);
+    results.recommendations = await this.generateStressTestRecommendations(
+      results.scenarios,
+    );
+
+    // Update risk data with stress test results
+    await this.updateRiskDataWithStressTest(stressTestDto.portfolioId, results);
+
+    this.logger.log(
+      `Stress test completed for portfolio: ${stressTestDto.portfolioId}, Scenarios: ${stressTestDto.scenarios.length}`,
+    );
+
+    return results;
+  }
+
+  private async runScenario(
+    portfolioId: string,
+    scenario: string,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const portfolioValue = await this.getPortfolioValue(portfolioId);
+    const baseRisk = await this.getBaseRiskMetrics(portfolioId);
+
+    let scenarioResult;
+
+    switch (scenario) {
+      case 'market_crash':
+        scenarioResult = await this.simulateMarketCrash(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'interest_rate_shock':
+        scenarioResult = await this.simulateInterestRateShock(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'currency_crisis':
+        scenarioResult = await this.simulateCurrencyCrisis(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'commodity_price_shock':
+        scenarioResult = await this.simulateCommodityPriceShock(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'credit_crisis':
+        scenarioResult = await this.simulateCreditCrisis(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'liquidity_crisis':
+        scenarioResult = await this.simulateLiquidityCrisis(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'operational_failure':
+        scenarioResult = await this.simulateOperationalFailure(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'regulatory_change':
+        scenarioResult = await this.simulateRegulatoryChange(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'geopolitical_crisis':
+        scenarioResult = await this.simulateGeopoliticalCrisis(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      case 'pandemic':
+        scenarioResult = await this.simulatePandemic(
+          portfolioValue,
+          baseRisk,
+          shockMagnitude,
+        );
+        break;
+      default:
+        scenarioResult = await this.simulateGenericShock(
+          portfolioValue,
+          baseRisk,
+          scenario,
+          shockMagnitude,
+        );
+    }
+
+    return {
+      scenario,
+      ...scenarioResult,
+      severity: this.calculateScenarioSeverity(scenarioResult),
+      recoveryTime: this.estimateRecoveryTime(scenarioResult),
+    };
+  }
+
+  private async runCustomScenario(
+    portfolioId: string,
+    customScenario: object,
+  ): Promise<object> {
+    const portfolioValue = await this.getPortfolioValue(portfolioId);
+    const baseRisk = await this.getBaseRiskMetrics(portfolioId);
+
+    // Apply custom shocks
+    const marketShock = customScenario['marketShock'] || 0;
+    const interestRateShock = customScenario['interestRateShock'] || 0;
+    const currencyShock = customScenario['currencyShock'] || 0;
+    const commodityShock = customScenario['commodityShock'] || 0;
+    const creditShock = customScenario['creditShock'] || 0;
+
+    const totalImpact = this.calculateTotalImpact(portfolioValue, {
+      marketShock,
+      interestRateShock,
+      currencyShock,
+      commodityShock,
+      creditShock,
+    });
+
+    return {
+      scenario: 'custom',
+      portfolioImpact: totalImpact,
+      riskIncrease: this.calculateRiskIncrease(baseRisk, totalImpact),
+      customParameters: customScenario,
+      severity: this.calculateScenarioSeverity({
+        portfolioImpact: totalImpact,
+      }),
+      recoveryTime: this.estimateRecoveryTime({ portfolioImpact: totalImpact }),
+    };
+  }
+
+  private async simulateMarketCrash(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || -30; // Default 30% market drop
+    const portfolioImpact = portfolioValue * (magnitude / 100);
+
+    // Calculate sector-specific impacts
+    const sectorImpacts = {
+      energy: portfolioValue * 0.4 * (magnitude / 100) * 1.2, // Energy more volatile
+      technology: portfolioValue * 0.3 * (magnitude / 100) * 1.5, // Tech more volatile
+      utilities: portfolioValue * 0.2 * (magnitude / 100) * 0.8, // Utilities less volatile
+      other: portfolioValue * 0.1 * (magnitude / 100),
+    };
+
+    return {
+      portfolioImpact,
+      sectorImpacts,
+      riskIncrease: Math.abs(magnitude) / 10, // Risk increases with crash severity
+      correlationIncrease: 0.3, // Correlations increase during crashes
+      liquidityDecrease: Math.abs(magnitude) / 20, // Liquidity decreases
+    };
+  }
+
+  private async simulateInterestRateShock(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || 200; // Default 200 bps increase
+    const duration = 5; // Portfolio duration in years
+
+    // Calculate bond price impact
+    const bondImpact = -duration * (magnitude / 10000) * portfolioValue * 0.6;
+
+    // Calculate equity impact
+    const equityImpact = portfolioValue * 0.4 * (magnitude / 10000) * -2; // Equities negatively impacted
+
+    const portfolioImpact = bondImpact + equityImpact;
+
+    return {
+      portfolioImpact,
+      bondImpact,
+      equityImpact,
+      riskIncrease: Math.abs(magnitude) / 100,
+      yieldCurveShift: magnitude,
+      durationImpact: bondImpact,
+    };
+  }
+
+  private async simulateCurrencyCrisis(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || -20; // Default 20% currency devaluation
+    const currencyExposure = portfolioValue * 0.3; // 30% currency exposure
+
+    const portfolioImpact = currencyExposure * (magnitude / 100);
+
+    // Calculate impact by currency
+    const currencyImpacts = {
+      EUR: currencyExposure * 0.4 * (magnitude / 100),
+      GBP: currencyExposure * 0.3 * (magnitude / 100) * 1.1,
+      JPY: currencyExposure * 0.2 * (magnitude / 100) * 0.9,
+      other: currencyExposure * 0.1 * (magnitude / 100),
+    };
+
+    return {
+      portfolioImpact,
+      currencyImpacts,
+      riskIncrease: Math.abs(magnitude) / 15,
+      hedgeEffectiveness: 0.7, // Hedges are 70% effective during crisis
+    };
+  }
+
+  private async simulateCommodityPriceShock(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || -40; // Default 40% commodity price drop
+    const commodityExposure = portfolioValue * 0.25; // 25% commodity exposure
+
+    const portfolioImpact = commodityExposure * (magnitude / 100);
+
+    // Calculate impact by commodity
+    const commodityImpacts = {
+      oil: commodityExposure * 0.5 * (magnitude / 100),
+      gas: commodityExposure * 0.3 * (magnitude / 100) * 1.2,
+      renewables: commodityExposure * 0.2 * (magnitude / 100) * -0.5, // Renewables benefit
+    };
+
+    return {
+      portfolioImpact,
+      commodityImpacts,
+      riskIncrease: Math.abs(magnitude) / 12,
+      correlationWithEnergy: 0.8,
+    };
+  }
+
+  private async simulateCreditCrisis(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || 300; // Default 300 bps credit spread widening
+    const creditExposure = portfolioValue * 0.35; // 35% credit exposure
+
+    const portfolioImpact = creditExposure * (magnitude / 10000);
+
+    // Calculate impact by credit quality
+    const creditImpacts = {
+      aaa: creditExposure * 0.2 * (magnitude / 10000) * 0.5,
+      aa: creditExposure * 0.3 * (magnitude / 10000) * 0.7,
+      a: creditExposure * 0.3 * (magnitude / 10000) * 1.0,
+      bbb: creditExposure * 0.2 * (magnitude / 10000) * 1.5,
+    };
+
+    return {
+      portfolioImpact,
+      creditImpacts,
+      riskIncrease: Math.abs(magnitude) / 150,
+      defaultRateIncrease: magnitude / 500,
+      liquidityImpact: magnitude / 200,
+    };
+  }
+
+  private async simulateLiquidityCrisis(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || 50; // Default 50% liquidity reduction
+    const illiquidAssets = portfolioValue * 0.4; // 40% illiquid assets
+
+    const portfolioImpact = illiquidAssets * (magnitude / 100) * 0.3; // 30% price impact
+
+    return {
+      portfolioImpact,
+      liquidityReduction: magnitude,
+      fireSaleDiscount: magnitude / 2,
+      fundingCostIncrease: magnitude / 10,
+      riskIncrease: magnitude / 25,
+    };
+  }
+
+  private async simulateOperationalFailure(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || 10; // Default 10% operational impact
+    const operationalRisk = portfolioValue * 0.05; // 5% operational risk capital
+
+    const portfolioImpact = operationalRisk * (magnitude / 100);
+
+    return {
+      portfolioImpact,
+      systemDowntime: magnitude * 24, // hours
+      remediationCost: portfolioImpact * 0.5,
+      regulatoryFines: portfolioImpact * 0.2,
+      reputationalImpact: portfolioImpact * 0.3,
+      riskIncrease: magnitude / 20,
+    };
+  }
+
+  private async simulateRegulatoryChange(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || 15; // Default 15% regulatory impact
+    const regulatoryCapital = portfolioValue * 0.08; // 8% regulatory capital
+
+    const portfolioImpact = regulatoryCapital * (magnitude / 100);
+
+    return {
+      portfolioImpact,
+      capitalRequirementIncrease: magnitude,
+      complianceCost: portfolioImpact * 0.6,
+      businessRestriction: portfolioImpact * 0.4,
+      riskIncrease: magnitude / 30,
+    };
+  }
+
+  private async simulateGeopoliticalCrisis(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || -25; // Default 25% market impact
+    const portfolioImpact = portfolioValue * (magnitude / 100);
+
+    return {
+      portfolioImpact,
+      regionalImpacts: {
+        europe: portfolioValue * 0.3 * (magnitude / 100) * 1.2,
+        asia: portfolioValue * 0.4 * (magnitude / 100) * 0.8,
+        americas: portfolioValue * 0.3 * (magnitude / 100) * 1.0,
+      },
+      riskIncrease: Math.abs(magnitude) / 10,
+      volatilityIncrease: Math.abs(magnitude) / 5,
+    };
+  }
+
+  private async simulatePandemic(
+    portfolioValue: number,
+    baseRisk: object,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || -35; // Default 35% economic impact
+    const portfolioImpact = portfolioValue * (magnitude / 100);
+
+    return {
+      portfolioImpact,
+      sectorImpacts: {
+        energy: portfolioValue * 0.2 * (magnitude / 100) * 1.5,
+        travel: portfolioValue * 0.1 * (magnitude / 100) * 2.0,
+        technology: portfolioValue * 0.3 * (magnitude / 100) * -0.5,
+        healthcare: portfolioValue * 0.2 * (magnitude / 100) * -0.8,
+        utilities: portfolioValue * 0.2 * (magnitude / 100) * 0.3,
+      },
+      riskIncrease: Math.abs(magnitude) / 8,
+      supplyChainDisruption: magnitude / 2,
+    };
+  }
+
+  private async simulateGenericShock(
+    portfolioValue: number,
+    baseRisk: object,
+    scenario: string,
+    shockMagnitude?: number,
+  ): Promise<object> {
+    const magnitude = shockMagnitude || -20;
+    const portfolioImpact = portfolioValue * (magnitude / 100);
+
+    return {
+      portfolioImpact,
+      scenario,
+      riskIncrease: Math.abs(magnitude) / 10,
+      customScenario: true,
+    };
+  }
+
+  private calculateTotalImpact(portfolioValue: number, shocks: object): number {
+    let totalImpact = 0;
+
+    for (const [key, value] of Object.entries(shocks)) {
+      if (typeof value === 'number') {
+        totalImpact += Math.abs(portfolioValue * (value / 100));
+      }
+    }
+
+    return totalImpact;
+  }
+
+  private calculateRiskIncrease(
+    baseRisk: object,
+    portfolioImpact: number,
+  ): number {
+    const baseRiskLevel = baseRisk['riskLevel'] || 2;
+    const riskIncrease = Math.abs(portfolioImpact) / 100000; // Scale by $100k
+    return Math.min(4, baseRiskLevel + riskIncrease);
+  }
+
+  private calculateScenarioSeverity(scenarioResult: object): string {
+    const impact = Math.abs(scenarioResult['portfolioImpact'] || 0);
+
+    if (impact > 500000) return 'critical';
+    if (impact > 200000) return 'high';
+    if (impact > 100000) return 'medium';
+    return 'low';
+  }
+
+  private estimateRecoveryTime(scenarioResult: object): string {
+    const severity = this.calculateScenarioSeverity(scenarioResult);
+
+    const recoveryTimes = {
+      critical: '12-24 months',
+      high: '6-12 months',
+      medium: '3-6 months',
+      low: '1-3 months',
+    };
+
+    return recoveryTimes[severity] || '3-6 months';
+  }
+
+  private async generateStressTestSummary(scenarios: object): Promise<object> {
+    const scenarioResults = Object.values(scenarios);
+    const impacts = scenarioResults.map((s) =>
+      Math.abs(s['portfolioImpact'] || 0),
+    );
+    const riskIncreases = scenarioResults.map((s) => s['riskIncrease'] || 0);
+
+    return {
+      worstCaseScenario: Math.max(...impacts),
+      averageImpact:
+        impacts.reduce((sum, impact) => sum + impact, 0) / impacts.length,
+      maxRiskIncrease: Math.max(...riskIncreases),
+      scenariosTested: scenarioResults.length,
+      criticalScenarios: scenarioResults.filter(
+        (s) => this.calculateScenarioSeverity(s) === 'critical',
+      ).length,
+      highScenarios: scenarioResults.filter(
+        (s) => this.calculateScenarioSeverity(s) === 'high',
+      ).length,
+      overallResilience: this.calculateOverallResilience(impacts),
+    };
+  }
+
+  private calculateOverallResilience(impacts: number[]): number {
+    const maxImpact = Math.max(...impacts);
+    const avgImpact =
+      impacts.reduce((sum, impact) => sum + impact, 0) / impacts.length;
+
+    // Resilience score (0-100, higher is better)
+    const resilienceScore = Math.max(
+      0,
+      100 - maxImpact / 10000 - avgImpact / 20000,
+    );
+    return Math.round(resilienceScore);
+  }
+
+  private async generateStressTestRecommendations(
+    scenarios: object,
+  ): Promise<string[]> {
+    const recommendations: string[] = [];
+    const scenarioResults = Object.entries(scenarios);
+
+    // Analyze scenarios and generate recommendations
+    const criticalScenarios = scenarioResults.filter(
+      ([, result]) => this.calculateScenarioSeverity(result) === 'critical',
+    );
+
+    if (criticalScenarios.length > 0) {
+      recommendations.push(
+        'Implement immediate risk mitigation for critical scenarios',
+      );
+      recommendations.push(
+        'Increase capital reserves to cover worst-case losses',
+      );
+    }
+
+    const highScenarios = scenarioResults.filter(
+      ([, result]) => this.calculateScenarioSeverity(result) === 'high',
+    );
+
+    if (highScenarios.length > 2) {
+      recommendations.push('Diversify portfolio to reduce concentration risk');
+      recommendations.push(
+        'Enhance hedging strategies for high-impact scenarios',
+      );
+    }
+
+    // Check for specific risk types
+    const hasMarketRisk = scenarioResults.some(
+      ([name]) => name.includes('market') || name.includes('crash'),
+    );
+    const hasCreditRisk = scenarioResults.some(([name]) =>
+      name.includes('credit'),
+    );
+    const hasLiquidityRisk = scenarioResults.some(([name]) =>
+      name.includes('liquidity'),
+    );
+
+    if (hasMarketRisk) {
+      recommendations.push('Consider market-neutral strategies');
+      recommendations.push('Implement dynamic asset allocation');
+    }
+
+    if (hasCreditRisk) {
+      recommendations.push('Enhance credit quality monitoring');
+      recommendations.push('Increase credit diversification');
+    }
+
+    if (hasLiquidityRisk) {
+      recommendations.push('Maintain higher liquidity buffers');
+      recommendations.push('Establish contingency funding lines');
+    }
+
+    return recommendations;
+  }
+
+  private async getPortfolioValue(portfolioId: string): Promise<number> {
+    // Get current portfolio value
+    // In production, this would query actual portfolio data
+    return 1000000; // $1M default portfolio value
+  }
+
+  private async getBaseRiskMetrics(portfolioId: string): Promise<object> {
+    // Get base risk metrics for the portfolio
+    return {
+      riskLevel: 2,
+      volatility: 0.2,
+      var: 50000,
+      beta: 1.0,
+    };
+  }
+
+  private async updateRiskDataWithStressTest(
+    portfolioId: string,
+    stressTestResults: object,
+  ): Promise<void> {
+    const latestRiskData = await this.riskDataRepository.findOne({
+      where: { portfolioId },
+      order: { createdAt: 'DESC' },
+    });
+
+    if (!latestRiskData) {
+      return;
+    }
+
+    await this.riskDataRepository.update(latestRiskData.id, {
+      stressTestResult: stressTestResults,
+    });
+  }
+
+  async getStressTestLibrary(): Promise<object> {
+    return {
+      predefinedScenarios: [
+        {
+          name: 'market_crash',
+          description: 'Sudden market decline of 30% or more',
+          parameters: { magnitude: -30 },
+          frequency: 'rare',
+        },
+        {
+          name: 'interest_rate_shock',
+          description: 'Rapid interest rate changes of 200+ bps',
+          parameters: { magnitude: 200 },
+          frequency: 'occasional',
+        },
+        {
+          name: 'currency_crisis',
+          description: 'Major currency devaluation of 20%+',
+          parameters: { magnitude: -20 },
+          frequency: 'rare',
+        },
+        {
+          name: 'commodity_price_shock',
+          description: 'Commodity price volatility of 40%+',
+          parameters: { magnitude: -40 },
+          frequency: 'occasional',
+        },
+        {
+          name: 'credit_crisis',
+          description: 'Credit spread widening of 300+ bps',
+          parameters: { magnitude: 300 },
+          frequency: 'rare',
+        },
+        {
+          name: 'liquidity_crisis',
+          description: 'Market liquidity reduction of 50%+',
+          parameters: { magnitude: 50 },
+          frequency: 'occasional',
+        },
+        {
+          name: 'operational_failure',
+          description: 'System or operational breakdown',
+          parameters: { magnitude: 10 },
+          frequency: 'possible',
+        },
+        {
+          name: 'regulatory_change',
+          description: 'Significant regulatory changes',
+          parameters: { magnitude: 15 },
+          frequency: 'occasional',
+        },
+        {
+          name: 'geopolitical_crisis',
+          description: 'Geopolitical events affecting markets',
+          parameters: { magnitude: -25 },
+          frequency: 'rare',
+        },
+        {
+          name: 'pandemic',
+          description: 'Global health crisis',
+          parameters: { magnitude: -35 },
+          frequency: 'very rare',
+        },
+      ],
+      customScenarios: {
+        description: 'Create custom stress scenarios with specific parameters',
+        parameters: [
+          'marketShock',
+          'interestRateShock',
+          'currencyShock',
+          'commodityShock',
+          'creditShock',
+        ],
+      },
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/controllers/index.html b/coverage/lcov-report/src/scheduler/controllers/index.html new file mode 100644 index 0000000..908bba9 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/controllers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/scheduler/controllers + + + + + + + + + +
+
+

All files src/scheduler/controllers

+
+ +
+ 0% + Statements + 0/477 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/477 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
scheduler.controller.ts +
+
0%0/4770%0/10%0/10%0/477
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/controllers/scheduler.controller.ts.html b/coverage/lcov-report/src/scheduler/controllers/scheduler.controller.ts.html new file mode 100644 index 0000000..caa8a1e --- /dev/null +++ b/coverage/lcov-report/src/scheduler/controllers/scheduler.controller.ts.html @@ -0,0 +1,1516 @@ + + + + + + Code coverage report for src/scheduler/controllers/scheduler.controller.ts + + + + + + + + + +
+
+

All files / src/scheduler/controllers scheduler.controller.ts

+
+ +
+ 0% + Statements + 0/477 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/477 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Controller,
+  Get,
+  Post,
+  Put,
+  Delete,
+  Body,
+  Param,
+  Query,
+  UseGuards,
+  Request,
+  HttpStatus,
+  HttpCode,
+} from '@nestjs/common';
+import {
+  ApiTags,
+  ApiOperation,
+  ApiResponse,
+  ApiParam,
+  ApiQuery,
+} from '@nestjs/swagger';
+import { SchedulerService } from '../scheduler.service';
+import { MarketHoursService } from '../services/market-hours.service';
+import {
+  ScheduleTradeDto,
+  UpdateScheduleDto,
+  BulkScheduleDto,
+  EmergencyStopDto,
+  JobQueryDto,
+} from '../dto/schedule-trade.dto';
+import { ScheduledJob } from '../entities/scheduled-job.entity';
+
+@ApiTags('scheduler')
+@Controller('api/scheduler')
+export class SchedulerController {
+  constructor(
+    private readonly schedulerService: SchedulerService,
+    private readonly marketHoursService: MarketHoursService,
+  ) {}
+
+  @Post('jobs/schedule')
+  @ApiOperation({ summary: 'Schedule a new job' })
+  @ApiResponse({
+    status: HttpStatus.CREATED,
+    description: 'Job scheduled successfully',
+    type: ScheduledJob,
+  })
+  @ApiResponse({
+    status: HttpStatus.BAD_REQUEST,
+    description: 'Invalid job data',
+  })
+  async scheduleJob(
+    @Body() scheduleTradeDto: ScheduleTradeDto,
+    @Request() req,
+  ): Promise<ScheduledJob> {
+    return this.schedulerService.scheduleTrade(scheduleTradeDto, req.user?.id);
+  }
+
+  @Post('jobs/bulk-schedule')
+  @ApiOperation({ summary: 'Schedule multiple jobs' })
+  @ApiResponse({
+    status: HttpStatus.CREATED,
+    description: 'Jobs scheduled successfully',
+  })
+  async bulkScheduleJobs(
+    @Body() bulkScheduleDto: BulkScheduleDto,
+    @Request() req,
+  ): Promise<ScheduledJob[]> {
+    return this.schedulerService.bulkSchedule(bulkScheduleDto, req.user?.id);
+  }
+
+  @Get('jobs')
+  @ApiOperation({ summary: 'Get scheduled jobs with filtering' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Jobs retrieved successfully',
+  })
+  @ApiQuery({ name: 'type', required: false })
+  @ApiQuery({ name: 'status', required: false })
+  @ApiQuery({ name: 'priority', required: false })
+  @ApiQuery({ name: 'page', required: false, type: Number })
+  @ApiQuery({ name: 'limit', required: false, type: Number })
+  async getJobs(@Query() query: JobQueryDto) {
+    return this.schedulerService.getJobs(query);
+  }
+
+  @Get('jobs/:id')
+  @ApiOperation({ summary: 'Get job by ID' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Job retrieved successfully',
+    type: ScheduledJob,
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' })
+  @ApiParam({ name: 'id', description: 'Job ID' })
+  async getJob(@Param('id') id: string): Promise<ScheduledJob> {
+    return this.schedulerService.getJobById(id);
+  }
+
+  @Put('jobs/:id')
+  @ApiOperation({ summary: 'Update scheduled job' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Job updated successfully',
+    type: ScheduledJob,
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' })
+  @ApiParam({ name: 'id', description: 'Job ID' })
+  async updateJob(
+    @Param('id') id: string,
+    @Body() updateScheduleDto: UpdateScheduleDto,
+    @Request() req,
+  ): Promise<ScheduledJob> {
+    return this.schedulerService.updateSchedule(
+      id,
+      updateScheduleDto,
+      req.user?.id,
+    );
+  }
+
+  @Post('jobs/:id/execute')
+  @ApiOperation({ summary: 'Execute a job immediately' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Job executed successfully',
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' })
+  @ApiParam({ name: 'id', description: 'Job ID' })
+  async executeJob(@Param('id') id: string): Promise<any> {
+    return this.schedulerService.executeJob(id);
+  }
+
+  @Delete('jobs/:id')
+  @HttpCode(HttpStatus.OK)
+  @ApiOperation({ summary: 'Cancel a scheduled job' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Job cancelled successfully',
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' })
+  @ApiParam({ name: 'id', description: 'Job ID' })
+  async cancelJob(
+    @Param('id') id: string,
+    @Body() body: { reason?: string },
+    @Request() req,
+  ): Promise<ScheduledJob> {
+    return this.schedulerService.cancelJob(id, req.user?.id, body.reason);
+  }
+
+  @Get('jobs/:id/metrics')
+  @ApiOperation({ summary: 'Get job execution metrics' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Metrics retrieved successfully',
+  })
+  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' })
+  @ApiParam({ name: 'id', description: 'Job ID' })
+  async getJobMetrics(@Param('id') id: string): Promise<any> {
+    return this.schedulerService.getJobMetrics(id);
+  }
+
+  @Post('emergency-stop')
+  @ApiOperation({ summary: 'Emergency stop all or specific jobs' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Emergency stop executed successfully',
+  })
+  async emergencyStop(
+    @Body() emergencyStopDto: EmergencyStopDto,
+    @Request() req,
+  ): Promise<any> {
+    return this.schedulerService.emergencyStop(emergencyStopDto, req.user?.id);
+  }
+
+  @Post('emergency-resume')
+  @ApiOperation({ summary: 'Resume emergency stopped jobs' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Jobs resumed successfully',
+  })
+  async resumeEmergencyStops(@Request() req): Promise<any> {
+    return this.schedulerService.resumeEmergencyStops(req.user?.id);
+  }
+
+  @Get('metrics')
+  @ApiOperation({ summary: 'Get scheduler metrics' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Metrics retrieved successfully',
+  })
+  async getMetrics(): Promise<any> {
+    return this.schedulerService.getSchedulerMetrics();
+  }
+
+  @Get('market-hours/:market')
+  @ApiOperation({ summary: 'Get market hours for a specific market' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Market hours retrieved successfully',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  async getMarketHours(@Param('market') market: string): Promise<any> {
+    return this.marketHoursService.getMarketHours(market);
+  }
+
+  @Get('market-hours/:market/status')
+  @ApiOperation({ summary: 'Get current market status' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Market status retrieved successfully',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  async getMarketStatus(@Param('market') market: string): Promise<any> {
+    return this.marketHoursService.getMarketStatus(market);
+  }
+
+  @Get('market-hours/:market/is-open')
+  @ApiOperation({ summary: 'Check if market is open' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Market status retrieved successfully',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  async isMarketOpen(
+    @Param('market') market: string,
+  ): Promise<{ isOpen: boolean }> {
+    const isOpen = await this.marketHoursService.isMarketOpen(market);
+    return { isOpen };
+  }
+
+  @Get('market-hours/:market/next-open')
+  @ApiOperation({ summary: 'Get next market opening time' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Next opening time retrieved successfully',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  async getNextMarketOpen(
+    @Param('market') market: string,
+  ): Promise<{ nextOpen: Date }> {
+    const nextOpen = await this.marketHoursService.getNextMarketOpen(market);
+    return { nextOpen };
+  }
+
+  @Get('market-hours/:market/next-close')
+  @ApiOperation({ summary: 'Get next market closing time' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Next closing time retrieved successfully',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  async getNextMarketClose(
+    @Param('market') market: string,
+  ): Promise<{ nextClose: Date }> {
+    const nextClose = await this.marketHoursService.getNextMarketClose(market);
+    return { nextClose };
+  }
+
+  @Get('market-hours/all')
+  @ApiOperation({ summary: 'Get all market statuses' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'All market statuses retrieved successfully',
+  })
+  async getAllMarketStatuses(): Promise<Record<string, any>> {
+    return this.marketHoursService.getAllMarketStatuses();
+  }
+
+  @Get('market-hours/active')
+  @ApiOperation({ summary: 'Get currently active markets' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Active markets retrieved successfully',
+  })
+  async getActiveMarkets(): Promise<string[]> {
+    return this.marketHoursService.getActiveMarkets();
+  }
+
+  @Get('market-hours/is-globally-open')
+  @ApiOperation({ summary: 'Check if any market is globally open' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Global market status retrieved successfully',
+  })
+  async isGloballyOpen(): Promise<{ isOpen: boolean }> {
+    const isOpen = await this.marketHoursService.isGloballyOpen();
+    return { isOpen };
+  }
+
+  @Post('market-hours/:market/validate-time')
+  @ApiOperation({ summary: 'Validate execution time for market hours' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Time validation completed',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  async validateExecutionTime(
+    @Param('market') market: string,
+    @Body() body: { executionTime: string },
+  ): Promise<any> {
+    const executionTime = new Date(body.executionTime);
+    return this.marketHoursService.validateExecutionTime(market, executionTime);
+  }
+
+  @Post('market-hours/:market/adjust-time')
+  @ApiOperation({ summary: 'Adjust execution time to market hours' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Time adjustment completed',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  async adjustForMarketHours(
+    @Param('market') market: string,
+    @Body() body: { executionTime: string },
+  ): Promise<{ adjustedTime: Date }> {
+    const executionTime = new Date(body.executionTime);
+    const adjustedTime = await this.marketHoursService.adjustForMarketHours(
+      market,
+      executionTime,
+    );
+    return { adjustedTime };
+  }
+
+  @Get('market-hours/:market/holidays/:year?')
+  @ApiOperation({ summary: 'Get market holidays for a specific year' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Holidays retrieved successfully',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  @ApiParam({ name: 'year', description: 'Year (optional)', required: false })
+  async getHolidays(
+    @Param('market') market: string,
+    @Param('year') year?: string,
+  ): Promise<string[]> {
+    const yearNum = year ? parseInt(year) : undefined;
+    return this.marketHoursService.getHolidays(market, yearNum);
+  }
+
+  @Get('market-hours/:market/calendar/:year')
+  @ApiOperation({ summary: 'Get complete trading calendar for a year' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Trading calendar retrieved successfully',
+  })
+  @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' })
+  @ApiParam({ name: 'year', description: 'Year' })
+  async getTradingCalendar(
+    @Param('market') market: string,
+    @Param('year') year: string,
+  ): Promise<any> {
+    const yearNum = parseInt(year);
+    return this.marketHoursService.getTradingCalendar(market, yearNum);
+  }
+
+  @Get('health')
+  @ApiOperation({ summary: 'Get scheduler health status' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Health status retrieved successfully',
+  })
+  async getHealth(): Promise<{
+    status: 'healthy' | 'degraded' | 'unhealthy';
+    timestamp: Date;
+    metrics: any;
+    emergencyMode: boolean;
+    activeJobs: number;
+    lastExecution: Date | null;
+  }> {
+    const metrics = await this.schedulerService.getSchedulerMetrics();
+
+    let status: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';
+
+    if (metrics.failedJobs > metrics.completedJobs * 0.1) {
+      status = 'degraded';
+    }
+
+    if (metrics.failedJobs > metrics.completedJobs * 0.5) {
+      status = 'unhealthy';
+    }
+
+    return {
+      status,
+      timestamp: new Date(),
+      metrics,
+      emergencyMode: false, // This would be set from the scheduler service
+      activeJobs: metrics.runningJobs,
+      lastExecution: null, // This would be set from the scheduler service
+    };
+  }
+
+  @Get('status')
+  @ApiOperation({ summary: 'Get comprehensive scheduler status' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Status retrieved successfully',
+  })
+  async getStatus(): Promise<{
+    scheduler: {
+      isRunning: boolean;
+      uptime: number;
+      metrics: any;
+    };
+    markets: Record<string, any>;
+    jobs: {
+      total: number;
+      pending: number;
+      running: number;
+      completed: number;
+      failed: number;
+    };
+    system: {
+      memoryUsage: number;
+      cpuUsage: number;
+      diskSpace: number;
+    };
+  }> {
+    const metrics = await this.schedulerService.getSchedulerMetrics();
+    const marketStatuses = await this.marketHoursService.getAllMarketStatuses();
+
+    const memUsage = process.memoryUsage();
+    const memoryUsagePercent = (memUsage.heapUsed / memUsage.heapTotal) * 100;
+
+    return {
+      scheduler: {
+        isRunning: true,
+        uptime: process.uptime(),
+        metrics,
+      },
+      markets: marketStatuses,
+      jobs: {
+        total: metrics.totalJobs,
+        pending: metrics.pendingJobs,
+        running: metrics.runningJobs,
+        completed: metrics.completedJobs,
+        failed: metrics.failedJobs,
+      },
+      system: {
+        memoryUsage: memoryUsagePercent,
+        cpuUsage: 0, // This would be calculated from system metrics
+        diskSpace: 0, // This would be calculated from system metrics
+      },
+    };
+  }
+
+  @Post('maintenance/trigger')
+  @ApiOperation({ summary: 'Trigger manual maintenance job' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Maintenance job triggered successfully',
+  })
+  async triggerMaintenance(
+    @Body() body: { type: string; parameters?: any },
+  ): Promise<any> {
+    // This would trigger a maintenance job
+    return {
+      success: true,
+      jobId: 'maintenance-job-id',
+      message: 'Maintenance job triggered successfully',
+    };
+  }
+
+  @Get('maintenance/status')
+  @ApiOperation({ summary: 'Get maintenance status' })
+  @ApiResponse({
+    status: HttpStatus.OK,
+    description: 'Maintenance status retrieved successfully',
+  })
+  async getMaintenanceStatus(): Promise<any> {
+    // This would get maintenance status from the maintenance job
+    return {
+      lastMaintenance: new Date(),
+      nextMaintenance: new Date(),
+      status: 'idle',
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/dto/index.html b/coverage/lcov-report/src/scheduler/dto/index.html new file mode 100644 index 0000000..1af64c8 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/scheduler/dto + + + + + + + + + +
+
+

All files src/scheduler/dto

+
+ +
+ 0% + Statements + 0/492 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/492 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
schedule-trade.dto.ts +
+
0%0/4920%0/10%0/10%0/492
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/dto/schedule-trade.dto.ts.html b/coverage/lcov-report/src/scheduler/dto/schedule-trade.dto.ts.html new file mode 100644 index 0000000..65327be --- /dev/null +++ b/coverage/lcov-report/src/scheduler/dto/schedule-trade.dto.ts.html @@ -0,0 +1,1561 @@ + + + + + + Code coverage report for src/scheduler/dto/schedule-trade.dto.ts + + + + + + + + + +
+
+

All files / src/scheduler/dto schedule-trade.dto.ts

+
+ +
+ 0% + Statements + 0/492 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/492 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsNumber,
+  IsEnum,
+  IsOptional,
+  IsBoolean,
+  IsArray,
+  IsObject,
+  ValidateNested,
+  IsDateString,
+  Min,
+  Max,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
+import {
+  JobType,
+  JobPriority,
+  RetryStrategy,
+} from '../entities/scheduled-job.entity';
+
+export class ExecutionContextDto {
+  @ApiPropertyOptional({ example: 'America/New_York' })
+  @IsOptional()
+  @IsString()
+  timeZone?: string;
+
+  @ApiPropertyOptional({ example: 'en-US' })
+  @IsOptional()
+  @IsString()
+  locale?: string;
+
+  @ApiPropertyOptional({ example: 'production' })
+  @IsOptional()
+  @IsString()
+  environment?: string;
+
+  @ApiPropertyOptional({ example: 'v1.2.3' })
+  @IsOptional()
+  @IsString()
+  version?: string;
+
+  @ApiPropertyOptional({ example: 'node-01' })
+  @IsOptional()
+  @IsString()
+  nodeId?: string;
+}
+
+export class JobNotificationDto {
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsObject()
+  onSuccess?: {
+    enabled: boolean;
+    channels: string[];
+    recipients: string[];
+    template?: string;
+  };
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsObject()
+  onFailure?: {
+    enabled: boolean;
+    channels: string[];
+    recipients: string[];
+    template?: string;
+    includeStackTrace?: boolean;
+  };
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsObject()
+  onRetry?: {
+    enabled: boolean;
+    channels: string[];
+    recipients: string[];
+    template?: string;
+  };
+}
+
+export class JobDependencyDto {
+  @ApiPropertyOptional({ example: ['job-uuid-1', 'job-uuid-2'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  jobIds?: string[];
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsArray()
+  conditions?: Array<{
+    type: 'job_status' | 'time_based' | 'data_based';
+    jobId?: string;
+    status?: string;
+    condition?: string;
+    value?: any;
+  }>;
+}
+
+export class ResourceLimitsDto {
+  @ApiPropertyOptional({ example: 1024 })
+  @IsOptional()
+  @IsNumber()
+  @Min(64)
+  maxMemory?: number;
+
+  @ApiPropertyOptional({ example: 80 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(100)
+  maxCpu?: number;
+
+  @ApiPropertyOptional({ example: 5 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  maxConcurrentJobs?: number;
+}
+
+export class SchedulingDto {
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  isActive?: boolean;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  isRecurring?: boolean;
+
+  @ApiPropertyOptional({ example: '2024-12-31T23:59:59.000Z' })
+  @IsOptional()
+  @IsDateString()
+  endDate?: string;
+
+  @ApiPropertyOptional({ example: 100 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  maxRuns?: number;
+
+  @ApiPropertyOptional({ example: false })
+  @IsOptional()
+  @IsBoolean()
+  skipIfRunning?: boolean;
+
+  @ApiPropertyOptional({
+    enum: ['allow', 'forbid', 'replace'],
+    example: 'forbid',
+  })
+  @IsOptional()
+  @IsEnum(['allow', 'forbid', 'replace'])
+  concurrency?: 'allow' | 'forbid' | 'replace';
+}
+
+export class ScheduleTradeDto {
+  @ApiProperty({ example: 'Execute Trade #12345' })
+  @IsString()
+  name: string;
+
+  @ApiPropertyOptional({ example: 'Scheduled execution for trade settlement' })
+  @IsOptional()
+  @IsString()
+  description?: string;
+
+  @ApiProperty({ enum: JobType, example: JobType.TRADE_EXECUTION })
+  @IsEnum(JobType)
+  type: JobType;
+
+  @ApiPropertyOptional({ enum: JobPriority, example: JobPriority.HIGH })
+  @IsOptional()
+  @IsEnum(JobPriority)
+  priority?: JobPriority;
+
+  @ApiProperty({ example: '0 15 14 * * 1-5' })
+  @IsString()
+  cronExpression: string;
+
+  @ApiProperty({ example: '2024-02-20T14:15:00.000Z' })
+  @IsDateString()
+  scheduledAt: string;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsObject()
+  parameters?: {
+    tradeId?: string;
+    settlementId?: string;
+    batchSize?: number;
+    timeout?: number;
+    retries?: number;
+    customData?: Record<string, any>;
+  };
+
+  @ApiPropertyOptional({
+    enum: RetryStrategy,
+    example: RetryStrategy.EXPONENTIAL_BACKOFF,
+  })
+  @IsOptional()
+  @IsEnum(RetryStrategy)
+  retryStrategy?: RetryStrategy;
+
+  @ApiPropertyOptional({ example: 3 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(10)
+  maxRetries?: number;
+
+  @ApiPropertyOptional({ example: 5.0 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0.1)
+  retryDelay?: number;
+
+  @ApiPropertyOptional({ example: 300 })
+  @IsOptional()
+  @IsNumber()
+  @Min(30)
+  @Max(3600)
+  timeoutSeconds?: number;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => ExecutionContextDto)
+  executionContext?: ExecutionContextDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => JobDependencyDto)
+  dependencies?: JobDependencyDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => JobNotificationDto)
+  notifications?: JobNotificationDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => ResourceLimitsDto)
+  resourceLimits?: ResourceLimitsDto;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @ValidateNested()
+  @Type(() => SchedulingDto)
+  scheduling?: SchedulingDto;
+
+  @ApiPropertyOptional({ example: ['urgent', 'settlement', 'batch-1'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  tags?: string[];
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  marketHoursOnly?: boolean;
+
+  @ApiPropertyOptional({ example: 'America/New_York' })
+  @IsOptional()
+  @IsString()
+  timeZone?: string;
+}
+
+export class UpdateScheduleDto {
+  @ApiPropertyOptional({ example: 'Updated Trade Execution' })
+  @IsOptional()
+  @IsString()
+  name?: string;
+
+  @ApiPropertyOptional({ example: 'Updated description' })
+  @IsOptional()
+  @IsString()
+  description?: string;
+
+  @ApiPropertyOptional({ enum: JobPriority, example: JobPriority.CRITICAL })
+  @IsOptional()
+  @IsEnum(JobPriority)
+  priority?: JobPriority;
+
+  @ApiPropertyOptional({ example: '0 30 15 * * 1-5' })
+  @IsOptional()
+  @IsString()
+  cronExpression?: string;
+
+  @ApiPropertyOptional({ example: '2024-02-20T15:30:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  scheduledAt?: string;
+
+  @ApiPropertyOptional()
+  @IsOptional()
+  @IsObject()
+  parameters?: Record<string, any>;
+
+  @ApiPropertyOptional({ example: false })
+  @IsOptional()
+  @IsBoolean()
+  isActive?: boolean;
+
+  @ApiPropertyOptional({ example: 5 })
+  @IsOptional()
+  @IsNumber()
+  @Min(0)
+  @Max(10)
+  maxRetries?: number;
+
+  @ApiPropertyOptional({ example: 600 })
+  @IsOptional()
+  @IsNumber()
+  @Min(30)
+  @Max(3600)
+  timeoutSeconds?: number;
+}
+
+export class BulkScheduleDto {
+  @ApiProperty({ example: [ScheduleTradeDto] })
+  @IsArray()
+  @ValidateNested({ each: true })
+  @Type(() => ScheduleTradeDto)
+  jobs: ScheduleTradeDto[];
+
+  @ApiPropertyOptional({ example: 'batch-trade-execution' })
+  @IsOptional()
+  @IsString()
+  batchName?: string;
+
+  @ApiPropertyOptional({ example: 'Bulk trade execution for settlement batch' })
+  @IsOptional()
+  @IsString()
+  batchDescription?: string;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  executeSequentially?: boolean;
+
+  @ApiPropertyOptional({ example: 30 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(300)
+  delayBetweenJobs?: number;
+}
+
+export class EmergencyStopDto {
+  @ApiProperty({ example: 'Critical system maintenance' })
+  @IsString()
+  reason: string;
+
+  @ApiPropertyOptional({
+    enum: ['all', 'type', 'priority', 'specific'],
+    example: 'all',
+  })
+  @IsOptional()
+  @IsEnum(['all', 'type', 'priority', 'specific'])
+  scope?: 'all' | 'type' | 'priority' | 'specific';
+
+  @ApiPropertyOptional({
+    example: [JobType.TRADE_EXECUTION, JobType.SETTLEMENT],
+  })
+  @IsOptional()
+  @IsArray()
+  @IsEnum(JobType, { each: true })
+  jobTypes?: JobType[];
+
+  @ApiPropertyOptional({
+    example: [JobPriority.CRITICAL, JobPriority.EMERGENCY],
+  })
+  @IsOptional()
+  @IsArray()
+  @IsEnum(JobPriority, { each: true })
+  priorities?: JobPriority[];
+
+  @ApiPropertyOptional({ example: ['job-uuid-1', 'job-uuid-2'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  jobIds?: string[];
+
+  @ApiPropertyOptional({ example: false })
+  @IsOptional()
+  @IsBoolean()
+  allowRestart?: boolean;
+
+  @ApiPropertyOptional({ example: '2024-02-20T18:00:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  restartAt?: string;
+}
+
+export class JobQueryDto {
+  @ApiPropertyOptional({ enum: JobType })
+  @IsOptional()
+  @IsEnum(JobType)
+  type?: JobType;
+
+  @ApiPropertyOptional({
+    enum: [
+      'pending',
+      'running',
+      'completed',
+      'failed',
+      'cancelled',
+      'retrying',
+    ],
+  })
+  @IsOptional()
+  @IsEnum([
+    'pending',
+    'running',
+    'completed',
+    'failed',
+    'cancelled',
+    'retrying',
+  ])
+  status?: string;
+
+  @ApiPropertyOptional({ enum: JobPriority })
+  @IsOptional()
+  @IsEnum(JobPriority)
+  priority?: JobPriority;
+
+  @ApiPropertyOptional({ example: 'trade-123' })
+  @IsOptional()
+  @IsString()
+  name?: string;
+
+  @ApiPropertyOptional({ example: 'user-uuid' })
+  @IsOptional()
+  @IsString()
+  createdBy?: string;
+
+  @ApiPropertyOptional({ example: ['urgent', 'batch-1'] })
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  tags?: string[];
+
+  @ApiPropertyOptional({ example: '2024-02-20T00:00:00.000Z' })
+  @IsOptional()
+  @IsDateString()
+  scheduledAfter?: string;
+
+  @ApiPropertyOptional({ example: '2024-02-20T23:59:59.000Z' })
+  @IsOptional()
+  @IsDateString()
+  scheduledBefore?: string;
+
+  @ApiPropertyOptional({ example: true })
+  @IsOptional()
+  @IsBoolean()
+  isActive?: boolean;
+
+  @ApiPropertyOptional({ example: false })
+  @IsOptional()
+  @IsBoolean()
+  isEmergencyStop?: boolean;
+
+  @ApiPropertyOptional({ example: 1 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  page?: number;
+
+  @ApiPropertyOptional({ example: 20 })
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(100)
+  limit?: number;
+
+  @ApiPropertyOptional({
+    enum: ['createdAt', 'scheduledAt', 'priority', 'status'],
+    example: 'scheduledAt',
+  })
+  @IsOptional()
+  @IsEnum(['createdAt', 'scheduledAt', 'priority', 'status'])
+  sortBy?: string;
+
+  @ApiPropertyOptional({ enum: ['ASC', 'DESC'], example: 'ASC' })
+  @IsOptional()
+  @IsEnum(['ASC', 'DESC'])
+  sortOrder?: 'ASC' | 'DESC';
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/entities/index.html b/coverage/lcov-report/src/scheduler/entities/index.html new file mode 100644 index 0000000..ad91066 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/scheduler/entities + + + + + + + + + +
+
+

All files src/scheduler/entities

+
+ +
+ 0% + Statements + 0/272 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/272 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
scheduled-job.entity.ts +
+
0%0/2720%0/10%0/10%0/272
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/entities/scheduled-job.entity.ts.html b/coverage/lcov-report/src/scheduler/entities/scheduled-job.entity.ts.html new file mode 100644 index 0000000..d21ba5e --- /dev/null +++ b/coverage/lcov-report/src/scheduler/entities/scheduled-job.entity.ts.html @@ -0,0 +1,901 @@ + + + + + + Code coverage report for src/scheduler/entities/scheduled-job.entity.ts + + + + + + + + + +
+
+

All files / src/scheduler/entities scheduled-job.entity.ts

+
+ +
+ 0% + Statements + 0/272 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/272 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+} from 'typeorm';
+
+export enum JobType {
+  TRADE_EXECUTION = 'trade_execution',
+  SETTLEMENT = 'settlement',
+  MAINTENANCE = 'maintenance',
+  MARKET_OPEN = 'market_open',
+  MARKET_CLOSE = 'market_close',
+  DATA_CLEANUP = 'data_cleanup',
+  REPORT_GENERATION = 'report_generation',
+  NOTIFICATION = 'notification',
+}
+
+export enum JobStatus {
+  PENDING = 'pending',
+  RUNNING = 'running',
+  COMPLETED = 'completed',
+  FAILED = 'failed',
+  CANCELLED = 'cancelled',
+  RETRYING = 'retrying',
+}
+
+export enum JobPriority {
+  LOW = 1,
+  MEDIUM = 2,
+  HIGH = 3,
+  CRITICAL = 4,
+  EMERGENCY = 5,
+}
+
+export enum RetryStrategy {
+  IMMEDIATE = 'immediate',
+  EXPONENTIAL_BACKOFF = 'exponential_backoff',
+  LINEAR_BACKOFF = 'linear_backoff',
+  FIXED_INTERVAL = 'fixed_interval',
+}
+
+@Entity('scheduled_jobs')
+export class ScheduledJob {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ length: 255 })
+  name: string;
+
+  @Column({ type: 'text', nullable: true })
+  description: string;
+
+  @Column({
+    type: 'enum',
+    enum: JobType,
+  })
+  type: JobType;
+
+  @Column({
+    type: 'enum',
+    enum: JobStatus,
+    default: JobStatus.PENDING,
+  })
+  status: JobStatus;
+
+  @Column({
+    type: 'enum',
+    enum: JobPriority,
+    default: JobPriority.MEDIUM,
+  })
+  priority: JobPriority;
+
+  @Column({ type: 'text' })
+  cronExpression: string;
+
+  @Column({ name: 'scheduled_at', type: 'datetime' })
+  scheduledAt: Date;
+
+  @Column({ name: 'started_at', type: 'datetime', nullable: true })
+  startedAt?: Date;
+
+  @Column({ name: 'completed_at', type: 'datetime', nullable: true })
+  completedAt?: Date;
+
+  @Column({ name: 'next_run_at', type: 'datetime', nullable: true })
+  nextRunAt?: Date;
+
+  @Column({ name: 'last_run_at', type: 'datetime', nullable: true })
+  lastRunAt?: Date;
+
+  @Column({ type: 'json', nullable: true })
+  parameters: {
+    tradeId?: string;
+    settlementId?: string;
+    batchSize?: number;
+    timeout?: number;
+    retries?: number;
+    customData?: Record<string, any>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  result: {
+    success: boolean;
+    data?: any;
+    output?: string;
+    processedCount?: number;
+    errorCount?: number;
+    duration?: number;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  error: {
+    message: string;
+    stack?: string;
+    code?: string;
+    timestamp: Date;
+    retryCount: number;
+    maxRetries: number;
+    nextRetryAt?: Date;
+  };
+
+  @Column({
+    type: 'enum',
+    enum: RetryStrategy,
+    default: RetryStrategy.EXPONENTIAL_BACKOFF,
+  })
+  retryStrategy: RetryStrategy;
+
+  @Column({ name: 'max_retries', default: 3 })
+  maxRetries: number;
+
+  @Column({ name: 'retry_count', default: 0 })
+  retryCount: number;
+
+  @Column({
+    name: 'retry_delay',
+    type: 'decimal',
+    precision: 5,
+    scale: 2,
+    nullable: true,
+  })
+  retryDelay?: number;
+
+  @Column({ name: 'timeout_seconds', default: 300 })
+  timeoutSeconds: number;
+
+  @Column({ type: 'json', nullable: true })
+  executionContext: {
+    timeZone?: string;
+    locale?: string;
+    environment?: string;
+    version?: string;
+    nodeId?: string;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  dependencies: {
+    jobIds?: string[];
+    conditions?: Array<{
+      type: 'job_status' | 'time_based' | 'data_based';
+      jobId?: string;
+      status?: JobStatus;
+      condition?: string;
+      value?: any;
+    }>;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  notifications: {
+    onSuccess?: {
+      enabled: boolean;
+      channels: string[];
+      recipients: string[];
+      template?: string;
+    };
+    onFailure?: {
+      enabled: boolean;
+      channels: string[];
+      recipients: string[];
+      template?: string;
+      includeStackTrace?: boolean;
+    };
+    onRetry?: {
+      enabled: boolean;
+      channels: string[];
+      recipients: string[];
+      template?: string;
+    };
+  };
+
+  @Column({ type: 'json', nullable: true })
+  metrics: {
+    executionCount: number;
+    successCount: number;
+    failureCount: number;
+    avgExecutionTime: number;
+    minExecutionTime: number;
+    maxExecutionTime: number;
+    lastExecutionTime?: number;
+    totalExecutionTime: number;
+  };
+
+  @Column({ type: 'json', nullable: true })
+  scheduling: {
+    isActive: boolean;
+    isRecurring: boolean;
+    endDate?: Date;
+    maxRuns?: number;
+    runCount: number;
+    skipIfRunning: boolean;
+    concurrency: 'allow' | 'forbid' | 'replace';
+  };
+
+  @Column({ type: 'json', nullable: true })
+  resourceLimits: {
+    maxMemory?: number;
+    maxCpu?: number;
+    maxConcurrentJobs?: number;
+  };
+
+  @Column({ name: 'created_by', nullable: true })
+  createdBy?: string;
+
+  @Column({ name: 'updated_by', nullable: true })
+  updatedBy?: string;
+
+  @Column({ name: 'executed_by', nullable: true })
+  executedBy?: string;
+
+  @Column({ name: 'is_emergency_stop', default: false })
+  isEmergencyStop: boolean;
+
+  @Column({ name: 'emergency_stop_reason', nullable: true })
+  emergencyStopReason?: string;
+
+  @Column({ name: 'emergency_stopped_at', type: 'datetime', nullable: true })
+  emergencyStoppedAt?: Date;
+
+  @Column({ type: 'json', nullable: true })
+  auditTrail: Array<{
+    timestamp: Date;
+    action: string;
+    userId?: string;
+    reason?: string;
+    previousStatus?: JobStatus;
+    newStatus?: JobStatus;
+    details?: any;
+  }>;
+
+  @Column({ type: 'json', nullable: true })
+  tags: string[];
+
+  @Column({ name: 'is_active', default: true })
+  isActive: boolean;
+
+  @Column({ name: 'is_system_job', default: false })
+  isSystemJob: boolean;
+
+  @Column({ name: 'market_hours_only', default: false })
+  marketHoursOnly: boolean;
+
+  @Column({ name: 'time_zone', default: 'UTC' })
+  timeZone: string;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/index.html b/coverage/lcov-report/src/scheduler/index.html new file mode 100644 index 0000000..b7fdf96 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/scheduler + + + + + + + + + +
+
+

All files src/scheduler

+
+ +
+ 0% + Statements + 0/843 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/843 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
scheduler.module.ts +
+
0%0/270%0/10%0/10%0/27
scheduler.service.ts +
+
0%0/8160%0/10%0/10%0/816
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/jobs/index.html b/coverage/lcov-report/src/scheduler/jobs/index.html new file mode 100644 index 0000000..0c2ca53 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/jobs/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/scheduler/jobs + + + + + + + + + +
+
+

All files src/scheduler/jobs

+
+ +
+ 0% + Statements + 0/2215 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/2215 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
maintenance.job.ts +
+
0%0/8620%0/10%0/10%0/862
settlement.job.ts +
+
0%0/7550%0/10%0/10%0/755
trade-execution.job.ts +
+
0%0/5980%0/10%0/10%0/598
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/jobs/maintenance.job.ts.html b/coverage/lcov-report/src/scheduler/jobs/maintenance.job.ts.html new file mode 100644 index 0000000..2e47c61 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/jobs/maintenance.job.ts.html @@ -0,0 +1,2671 @@ + + + + + + Code coverage report for src/scheduler/jobs/maintenance.job.ts + + + + + + + + + +
+
+

All files / src/scheduler/jobs maintenance.job.ts

+
+ +
+ 0% + Statements + 0/862 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/862 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource, LessThan } from 'typeorm';
+import {
+  ScheduledJob,
+  JobStatus,
+  RetryStrategy,
+} from '../entities/scheduled-job.entity';
+import { Trade, TradeStatus } from '../../energy/entities/trade.entity';
+
+export interface MaintenanceResult {
+  success: boolean;
+  operations: Array<{
+    type: string;
+    success: boolean;
+    processed: number;
+    errors: string[];
+    duration: number;
+  }>;
+  totalProcessed: number;
+  totalErrors: number;
+  executionTime: number;
+  details: {
+    dataCleanup: { recordsDeleted: number; spaceFreed: number };
+    systemOptimization: { indexesOptimized: number; cacheCleared: boolean };
+    healthChecks: { checksPassed: number; checksFailed: number };
+    reportGeneration: { reportsGenerated: number };
+  };
+}
+
+@Injectable()
+export class MaintenanceJob {
+  private readonly logger = new Logger(MaintenanceJob.name);
+
+  constructor(
+    @InjectRepository(ScheduledJob)
+    private readonly scheduledJobRepository: Repository<ScheduledJob>,
+    @InjectRepository(Trade)
+    private readonly tradeRepository: Repository<Trade>,
+    private readonly dataSource: DataSource,
+  ) {}
+
+  @Cron(CronExpression.EVERY_HOUR)
+  async performSystemMaintenance(): Promise<void> {
+    this.logger.log('Performing scheduled system maintenance...');
+
+    try {
+      const pendingJobs = await this.scheduledJobRepository.find({
+        where: {
+          type: 'maintenance' as any,
+          status: JobStatus.PENDING,
+          isActive: true,
+          isEmergencyStop: false,
+          scheduledAt: LessThan(new Date()),
+        },
+        order: { priority: 'DESC', scheduledAt: 'ASC' },
+      });
+
+      if (pendingJobs.length === 0) {
+        this.logger.debug('No pending maintenance jobs found');
+        return;
+      }
+
+      this.logger.log(`Found ${pendingJobs.length} pending maintenance jobs`);
+
+      for (const job of pendingJobs) {
+        await this.executeMaintenanceJob(job);
+      }
+    } catch (error) {
+      this.logger.error('Error in maintenance scheduler', error);
+    }
+  }
+
+  @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
+  async performDailyMaintenance(): Promise<void> {
+    this.logger.log('Performing daily maintenance tasks...');
+
+    try {
+      const dailyJob = await this.createDailyMaintenanceJob();
+      await this.executeMaintenanceJob(dailyJob);
+    } catch (error) {
+      this.logger.error('Error in daily maintenance', error);
+    }
+  }
+
+  @Cron(CronExpression.EVERY_WEEK)
+  async performWeeklyMaintenance(): Promise<void> {
+    this.logger.log('Performing weekly maintenance tasks...');
+
+    try {
+      const weeklyJob = await this.createWeeklyMaintenanceJob();
+      await this.executeMaintenanceJob(weeklyJob);
+    } catch (error) {
+      this.logger.error('Error in weekly maintenance', error);
+    }
+  }
+
+  async executeMaintenanceJob(job: ScheduledJob): Promise<MaintenanceResult> {
+    const startTime = Date.now();
+
+    this.logger.log(`Executing maintenance job: ${job.id} - ${job.name}`);
+
+    try {
+      await this.updateJobStatus(job, JobStatus.RUNNING);
+
+      const operations = [];
+      const details = {
+        dataCleanup: { recordsDeleted: 0, spaceFreed: 0 },
+        systemOptimization: { indexesOptimized: 0, cacheCleared: false },
+        healthChecks: { checksPassed: 0, checksFailed: 0 },
+        reportGeneration: { reportsGenerated: 0 },
+      };
+
+      const parameters = job.parameters || {};
+      const maintenanceType = parameters.maintenanceType || 'routine';
+
+      switch (maintenanceType) {
+        case 'data_cleanup':
+          operations.push(await this.performDataCleanup(details));
+          break;
+        case 'system_optimization':
+          operations.push(await this.performSystemOptimization(details));
+          break;
+        case 'health_checks':
+          operations.push(await this.performHealthChecks(details));
+          break;
+        case 'report_generation':
+          operations.push(await this.generateReports(details));
+          break;
+        case 'comprehensive':
+          operations.push(await this.performDataCleanup(details));
+          operations.push(await this.performSystemOptimization(details));
+          operations.push(await this.performHealthChecks(details));
+          operations.push(await this.generateReports(details));
+          break;
+        default:
+          operations.push(await this.performRoutineMaintenance(details));
+      }
+
+      const totalProcessed = operations.reduce(
+        (sum, op) => sum + op.processed,
+        0,
+      );
+      const totalErrors = operations.reduce(
+        (sum, op) => sum + op.errors.length,
+        0,
+      );
+      const success = totalErrors === 0;
+
+      const result = {
+        success,
+        operations,
+        totalProcessed,
+        totalErrors,
+        executionTime: Date.now() - startTime,
+        details,
+      };
+
+      await this.updateJobCompletion(job, result);
+
+      this.logger.log(
+        `Maintenance job ${job.id} completed in ${result.executionTime}ms. Success: ${result.success}, Operations: ${operations.length}`,
+      );
+
+      return result;
+    } catch (error) {
+      const executionTime = Date.now() - startTime;
+      this.logger.error(`Maintenance job ${job.id} failed`, error);
+
+      await this.handleJobFailure(job, error, executionTime);
+
+      return {
+        success: false,
+        operations: [],
+        totalProcessed: 0,
+        totalErrors: 1,
+        executionTime,
+        details: {
+          dataCleanup: { recordsDeleted: 0, spaceFreed: 0 },
+          systemOptimization: { indexesOptimized: 0, cacheCleared: false },
+          healthChecks: { checksPassed: 0, checksFailed: 0 },
+          reportGeneration: { reportsGenerated: 0 },
+        },
+      };
+    }
+  }
+
+  private async performDataCleanup(details: any): Promise<any> {
+    const startTime = Date.now();
+    const errors: string[] = [];
+    let processed = 0;
+
+    try {
+      this.logger.log('Performing data cleanup...');
+
+      // Clean up old audit trail entries
+      const auditCleanupResult = await this.cleanupOldAuditTrails();
+      processed += auditCleanupResult.deleted;
+      details.dataCleanup.recordsDeleted += auditCleanupResult.deleted;
+      details.dataCleanup.spaceFreed += auditCleanupResult.spaceFreed;
+
+      // Clean up old scheduled jobs
+      const jobCleanupResult = await this.cleanupOldScheduledJobs();
+      processed += jobCleanupResult.deleted;
+      details.dataCleanup.recordsDeleted += jobCleanupResult.deleted;
+      details.dataCleanup.spaceFreed += jobCleanupResult.spaceFreed;
+
+      // Clean up old temporary data
+      const tempCleanupResult = await this.cleanupTemporaryData();
+      processed += tempCleanupResult.deleted;
+      details.dataCleanup.recordsDeleted += tempCleanupResult.deleted;
+      details.dataCleanup.spaceFreed += tempCleanupResult.spaceFreed;
+
+      this.logger.log(`Data cleanup completed. Deleted ${processed} records`);
+    } catch (error) {
+      errors.push(`Data cleanup failed: ${error.message}`);
+      this.logger.error('Data cleanup failed', error);
+    }
+
+    return {
+      type: 'data_cleanup',
+      success: errors.length === 0,
+      processed,
+      errors,
+      duration: Date.now() - startTime,
+    };
+  }
+
+  private async performSystemOptimization(details: any): Promise<any> {
+    const startTime = Date.now();
+    const errors: string[] = [];
+    let processed = 0;
+
+    try {
+      this.logger.log('Performing system optimization...');
+
+      // Optimize database indexes
+      const indexResult = await this.optimizeDatabaseIndexes();
+      processed += indexResult.optimized;
+      details.systemOptimization.indexesOptimized += indexResult.optimized;
+
+      // Clear application cache
+      const cacheResult = await this.clearApplicationCache();
+      processed += cacheResult.cleared;
+      details.systemOptimization.cacheCleared = cacheResult.success;
+
+      // Update statistics
+      const statsResult = await this.updateDatabaseStatistics();
+      processed += statsResult.updated;
+
+      this.logger.log(
+        `System optimization completed. Optimized ${processed} items`,
+      );
+    } catch (error) {
+      errors.push(`System optimization failed: ${error.message}`);
+      this.logger.error('System optimization failed', error);
+    }
+
+    return {
+      type: 'system_optimization',
+      success: errors.length === 0,
+      processed,
+      errors,
+      duration: Date.now() - startTime,
+    };
+  }
+
+  private async performHealthChecks(details: any): Promise<any> {
+    const startTime = Date.now();
+    const errors: string[] = [];
+    let processed = 0;
+
+    try {
+      this.logger.log('Performing system health checks...');
+
+      const checks = [
+        await this.checkDatabaseHealth(),
+        await this.checkSchedulerHealth(),
+        await this.checkMemoryUsage(),
+        await this.checkDiskSpace(),
+        await this.checkConnectivity(),
+      ];
+
+      for (const check of checks) {
+        processed++;
+        if (check.passed) {
+          details.healthChecks.checksPassed++;
+        } else {
+          details.healthChecks.checksFailed++;
+          errors.push(`Health check failed: ${check.name} - ${check.error}`);
+        }
+      }
+
+      this.logger.log(
+        `Health checks completed. Passed: ${details.healthChecks.checksPassed}, Failed: ${details.healthChecks.checksFailed}`,
+      );
+    } catch (error) {
+      errors.push(`Health checks failed: ${error.message}`);
+      this.logger.error('Health checks failed', error);
+    }
+
+    return {
+      type: 'health_checks',
+      success: errors.length === 0,
+      processed,
+      errors,
+      duration: Date.now() - startTime,
+    };
+  }
+
+  private async generateReports(details: any): Promise<any> {
+    const startTime = Date.now();
+    const errors: string[] = [];
+    let processed = 0;
+
+    try {
+      this.logger.log('Generating maintenance reports...');
+
+      const reports = [
+        await this.generateSchedulerReport(),
+        await this.generateSystemReport(),
+        await this.generatePerformanceReport(),
+      ];
+
+      for (const report of reports) {
+        if (report.success) {
+          processed++;
+          details.reportGeneration.reportsGenerated++;
+        } else {
+          errors.push(
+            `Report generation failed: ${report.name} - ${report.error}`,
+          );
+        }
+      }
+
+      this.logger.log(
+        `Report generation completed. Generated ${processed} reports`,
+      );
+    } catch (error) {
+      errors.push(`Report generation failed: ${error.message}`);
+      this.logger.error('Report generation failed', error);
+    }
+
+    return {
+      type: 'report_generation',
+      success: errors.length === 0,
+      processed,
+      errors,
+      duration: Date.now() - startTime,
+    };
+  }
+
+  private async performRoutineMaintenance(details: any): Promise<any> {
+    const startTime = Date.now();
+    const errors: string[] = [];
+    let processed = 0;
+
+    try {
+      this.logger.log('Performing routine maintenance...');
+
+      // Basic cleanup and optimization
+      await this.cleanupOldAuditTrails();
+      await this.clearApplicationCache();
+      processed = 2;
+
+      this.logger.log(
+        `Routine maintenance completed. Processed ${processed} items`,
+      );
+    } catch (error) {
+      errors.push(`Routine maintenance failed: ${error.message}`);
+      this.logger.error('Routine maintenance failed', error);
+    }
+
+    return {
+      type: 'routine_maintenance',
+      success: errors.length === 0,
+      processed,
+      errors,
+      duration: Date.now() - startTime,
+    };
+  }
+
+  private async cleanupOldAuditTrails(): Promise<{
+    deleted: number;
+    spaceFreed: number;
+  }> {
+    const cutoffDate = new Date();
+    cutoffDate.setDate(cutoffDate.getDate() - 90); // Keep 90 days
+
+    const result = await this.scheduledJobRepository
+      .createQueryBuilder()
+      .delete()
+      .where('createdAt < :cutoffDate', { cutoffDate })
+      .execute();
+
+    return {
+      deleted: result.affected || 0,
+      spaceFreed: (result.affected || 0) * 1024, // Estimate 1KB per record
+    };
+  }
+
+  private async cleanupOldScheduledJobs(): Promise<{
+    deleted: number;
+    spaceFreed: number;
+  }> {
+    const cutoffDate = new Date();
+    cutoffDate.setDate(cutoffDate.getDate() - 30); // Keep 30 days
+
+    const result = await this.scheduledJobRepository
+      .createQueryBuilder()
+      .delete()
+      .where('createdAt < :cutoffDate', { cutoffDate })
+      .andWhere('status IN (:...statuses)', {
+        statuses: [JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.CANCELLED],
+      })
+      .execute();
+
+    return {
+      deleted: result.affected || 0,
+      spaceFreed: (result.affected || 0) * 2048, // Estimate 2KB per job record
+    };
+  }
+
+  private async cleanupTemporaryData(): Promise<{
+    deleted: number;
+    spaceFreed: number;
+  }> {
+    // This would clean up any temporary tables, cache entries, etc.
+    // For now, return placeholder values
+    return {
+      deleted: 0,
+      spaceFreed: 0,
+    };
+  }
+
+  private async optimizeDatabaseIndexes(): Promise<{ optimized: number }> {
+    try {
+      // This would typically run ANALYZE or REINDEX commands
+      // For now, return placeholder
+      return { optimized: 0 };
+    } catch (error) {
+      this.logger.error('Database index optimization failed', error);
+      return { optimized: 0 };
+    }
+  }
+
+  private async clearApplicationCache(): Promise<{
+    cleared: number;
+    success: boolean;
+  }> {
+    try {
+      // This would clear application caches
+      // For now, return placeholder
+      return { cleared: 1, success: true };
+    } catch (error) {
+      this.logger.error('Cache clearing failed', error);
+      return { cleared: 0, success: false };
+    }
+  }
+
+  private async updateDatabaseStatistics(): Promise<{ updated: number }> {
+    try {
+      // This would update database statistics
+      // For now, return placeholder
+      return { updated: 1 };
+    } catch (error) {
+      this.logger.error('Database statistics update failed', error);
+      return { updated: 0 };
+    }
+  }
+
+  private async checkDatabaseHealth(): Promise<{
+    name: string;
+    passed: boolean;
+    error?: string;
+  }> {
+    try {
+      await this.dataSource.query('SELECT 1');
+      return { name: 'database', passed: true };
+    } catch (error) {
+      return { name: 'database', passed: false, error: error.message };
+    }
+  }
+
+  private async checkSchedulerHealth(): Promise<{
+    name: string;
+    passed: boolean;
+    error?: string;
+  }> {
+    try {
+      const pendingJobs = await this.scheduledJobRepository.count({
+        where: { status: JobStatus.PENDING },
+      });
+      return { name: 'scheduler', passed: true };
+    } catch (error) {
+      return { name: 'scheduler', passed: false, error: error.message };
+    }
+  }
+
+  private async checkMemoryUsage(): Promise<{
+    name: string;
+    passed: boolean;
+    error?: string;
+  }> {
+    try {
+      const memUsage = process.memoryUsage();
+      const totalMemory = memUsage.heapTotal;
+      const usedMemory = memUsage.heapUsed;
+      const memoryUsagePercent = (usedMemory / totalMemory) * 100;
+
+      if (memoryUsagePercent > 90) {
+        return {
+          name: 'memory',
+          passed: false,
+          error: `Memory usage at ${memoryUsagePercent.toFixed(2)}%`,
+        };
+      }
+
+      return { name: 'memory', passed: true };
+    } catch (error) {
+      return { name: 'memory', passed: false, error: error.message };
+    }
+  }
+
+  private async checkDiskSpace(): Promise<{
+    name: string;
+    passed: boolean;
+    error?: string;
+  }> {
+    try {
+      // This would check disk space
+      // For now, assume it passes
+      return { name: 'disk_space', passed: true };
+    } catch (error) {
+      return { name: 'disk_space', passed: false, error: error.message };
+    }
+  }
+
+  private async checkConnectivity(): Promise<{
+    name: string;
+    passed: boolean;
+    error?: string;
+  }> {
+    try {
+      // This would check external connectivity
+      // For now, assume it passes
+      return { name: 'connectivity', passed: true };
+    } catch (error) {
+      return { name: 'connectivity', passed: false, error: error.message };
+    }
+  }
+
+  private async generateSchedulerReport(): Promise<{
+    name: string;
+    success: boolean;
+    error?: string;
+  }> {
+    try {
+      const totalJobs = await this.scheduledJobRepository.count();
+      const pendingJobs = await this.scheduledJobRepository.count({
+        where: { status: JobStatus.PENDING },
+      });
+      const failedJobs = await this.scheduledJobRepository.count({
+        where: { status: JobStatus.FAILED },
+      });
+
+      this.logger.log(
+        `Scheduler Report - Total: ${totalJobs}, Pending: ${pendingJobs}, Failed: ${failedJobs}`,
+      );
+      return { name: 'scheduler_report', success: true };
+    } catch (error) {
+      return { name: 'scheduler_report', success: false, error: error.message };
+    }
+  }
+
+  private async generateSystemReport(): Promise<{
+    name: string;
+    success: boolean;
+    error?: string;
+  }> {
+    try {
+      const memUsage = process.memoryUsage();
+      this.logger.log(
+        `System Report - Memory: ${Math.round(memUsage.heapUsed / 1024 / 1024)}MB`,
+      );
+      return { name: 'system_report', success: true };
+    } catch (error) {
+      return { name: 'system_report', success: false, error: error.message };
+    }
+  }
+
+  private async generatePerformanceReport(): Promise<{
+    name: string;
+    success: boolean;
+    error?: string;
+  }> {
+    try {
+      // This would generate performance metrics
+      this.logger.log('Performance report generated');
+      return { name: 'performance_report', success: true };
+    } catch (error) {
+      return {
+        name: 'performance_report',
+        success: false,
+        error: error.message,
+      };
+    }
+  }
+
+  private async createDailyMaintenanceJob(): Promise<ScheduledJob> {
+    const job = this.scheduledJobRepository.create({
+      name: 'Daily System Maintenance',
+      description: 'Automated daily maintenance tasks',
+      type: 'maintenance' as any,
+      status: JobStatus.PENDING,
+      priority: 2, // MEDIUM
+      cronExpression: '0 2 * * *', // 2 AM daily
+      scheduledAt: new Date(),
+      parameters: {
+        maintenanceType: 'comprehensive',
+      },
+      retryStrategy: RetryStrategy.EXPONENTIAL_BACKOFF,
+      maxRetries: 2,
+      timeoutSeconds: 1800, // 30 minutes
+      isSystemJob: true,
+      scheduling: {
+        isActive: true,
+        isRecurring: true,
+      },
+    });
+
+    return await this.scheduledJobRepository.save(job);
+  }
+
+  private async createWeeklyMaintenanceJob(): Promise<ScheduledJob> {
+    const job = this.scheduledJobRepository.create({
+      name: 'Weekly System Maintenance',
+      description: 'Comprehensive weekly maintenance and optimization',
+      type: 'maintenance' as any,
+      status: JobStatus.PENDING,
+      priority: 3, // HIGH
+      cronExpression: '0 3 * * 0', // 3 AM on Sundays
+      scheduledAt: new Date(),
+      parameters: {
+        maintenanceType: 'comprehensive',
+        deepCleanup: true,
+      },
+      retryStrategy: RetryStrategy.EXPONENTIAL_BACKOFF,
+      maxRetries: 3,
+      timeoutSeconds: 3600, // 1 hour
+      isSystemJob: true,
+      scheduling: {
+        isActive: true,
+        isRecurring: true,
+      },
+    });
+
+    return await this.scheduledJobRepository.save(job);
+  }
+
+  private async updateJobStatus(
+    job: ScheduledJob,
+    status: JobStatus,
+  ): Promise<void> {
+    job.status = status;
+    job.updatedAt = new Date();
+
+    if (status === JobStatus.RUNNING) {
+      job.startedAt = new Date();
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private async updateJobCompletion(
+    job: ScheduledJob,
+    result: MaintenanceResult,
+  ): Promise<void> {
+    job.status = result.success ? JobStatus.COMPLETED : JobStatus.FAILED;
+    job.completedAt = new Date();
+    job.result = {
+      success: result.success,
+      data: result.details,
+      processedCount: result.totalProcessed,
+      errorCount: result.totalErrors,
+      duration: result.executionTime,
+    };
+
+    if (!job.metrics)
+      job.metrics = {
+        executionCount: 0,
+        successCount: 0,
+        failureCount: 0,
+        avgExecutionTime: 0,
+        minExecutionTime: 0,
+        maxExecutionTime: 0,
+        totalExecutionTime: 0,
+      };
+
+    job.metrics.executionCount++;
+    if (result.success) {
+      job.metrics.successCount++;
+    } else {
+      job.metrics.failureCount++;
+    }
+
+    job.metrics.totalExecutionTime += result.executionTime;
+    job.metrics.avgExecutionTime =
+      job.metrics.totalExecutionTime / job.metrics.executionCount;
+
+    if (
+      job.metrics.minExecutionTime === 0 ||
+      result.executionTime < job.metrics.minExecutionTime
+    ) {
+      job.metrics.minExecutionTime = result.executionTime;
+    }
+
+    if (result.executionTime > job.metrics.maxExecutionTime) {
+      job.metrics.maxExecutionTime = result.executionTime;
+    }
+
+    if (job.scheduling?.isRecurring && job.scheduling.isActive) {
+      job.nextRunAt = this.calculateNextRunTime(job);
+      job.status = JobStatus.PENDING;
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private async handleJobFailure(
+    job: ScheduledJob,
+    error: any,
+    executionTime: number,
+  ): Promise<void> {
+    job.retryCount++;
+    job.status = JobStatus.FAILED;
+    job.completedAt = new Date();
+    job.error = {
+      message: error.message,
+      stack: error.stack,
+      timestamp: new Date(),
+      retryCount: job.retryCount,
+      maxRetries: job.maxRetries,
+    };
+
+    if (this.shouldRetry(job)) {
+      const nextRetryAt = this.calculateNextRetryTime(job);
+      job.error.nextRetryAt = nextRetryAt;
+      job.status = JobStatus.RETRYING;
+      job.scheduledAt = nextRetryAt;
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private shouldRetry(job: ScheduledJob): boolean {
+    return job.retryCount < job.maxRetries && this.isRetryableError(job.error);
+  }
+
+  private isRetryableError(error: any): boolean {
+    const retryableErrors = [
+      'TIMEOUT',
+      'CONNECTION_ERROR',
+      'TEMPORARY_FAILURE',
+      'RATE_LIMITED',
+      'SERVICE_UNAVAILABLE',
+    ];
+
+    const errorMessage = error?.message?.toUpperCase() || '';
+    return retryableErrors.some((retryableError) =>
+      errorMessage.includes(retryableError),
+    );
+  }
+
+  private calculateNextRetryTime(job: ScheduledJob): Date {
+    const baseDelay = job.retryDelay || 15; // Maintenance jobs have longer delays
+    let delay: number;
+
+    switch (job.retryStrategy) {
+      case RetryStrategy.IMMEDIATE:
+        delay = 0;
+        break;
+      case RetryStrategy.EXPONENTIAL_BACKOFF:
+        delay = baseDelay * Math.pow(2, job.retryCount - 1);
+        break;
+      case RetryStrategy.LINEAR_BACKOFF:
+        delay = baseDelay * job.retryCount;
+        break;
+      case RetryStrategy.FIXED_INTERVAL:
+        delay = baseDelay;
+        break;
+      default:
+        delay = baseDelay;
+    }
+
+    const maxDelay = 14400; // 4 hours max for maintenance
+    delay = Math.min(delay, maxDelay);
+
+    return new Date(Date.now() + delay * 1000);
+  }
+
+  private calculateNextRunTime(job: ScheduledJob): Date {
+    const now = new Date();
+
+    if (job.cronExpression.includes('0 2 * * *')) {
+      // Daily job - schedule for next day at 2 AM
+      const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000);
+      tomorrow.setUTCHours(2, 0, 0, 0);
+      return tomorrow;
+    } else if (job.cronExpression.includes('0 3 * * 0')) {
+      // Weekly job - schedule for next Sunday at 3 AM
+      const daysUntilSunday = (7 - now.getDay()) % 7 || 7;
+      const nextSunday = new Date(
+        now.getTime() + daysUntilSunday * 24 * 60 * 60 * 1000,
+      );
+      nextSunday.setUTCHours(3, 0, 0, 0);
+      return nextSunday;
+    }
+
+    // Default to next day
+    return new Date(now.getTime() + 24 * 60 * 60 * 1000);
+  }
+
+  async getMaintenanceMetrics(): Promise<any> {
+    const recentJobs = await this.scheduledJobRepository.find({
+      where: { type: 'maintenance' as any },
+      order: { completedAt: 'DESC' },
+      take: 10,
+    });
+
+    const totalJobs = recentJobs.length;
+    const successfulJobs = recentJobs.filter(
+      (job) => job.status === JobStatus.COMPLETED,
+    ).length;
+    const avgExecutionTime =
+      recentJobs.reduce((sum, job) => {
+        return sum + (job.metrics?.avgExecutionTime || 0);
+      }, 0) / totalJobs;
+
+    return {
+      totalMaintenanceJobs: totalJobs,
+      successRate: totalJobs > 0 ? (successfulJobs / totalJobs) * 100 : 0,
+      avgExecutionTime: avgExecutionTime,
+      lastMaintenance: recentJobs[0]?.completedAt,
+      nextScheduledMaintenance: await this.getNextScheduledMaintenance(),
+    };
+  }
+
+  private async getNextScheduledMaintenance(): Promise<Date | null> {
+    const nextJob = await this.scheduledJobRepository.findOne({
+      where: {
+        type: 'maintenance' as any,
+        status: JobStatus.PENDING,
+        isActive: true,
+      },
+      order: { scheduledAt: 'ASC' },
+    });
+
+    return nextJob?.scheduledAt || null;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/jobs/settlement.job.ts.html b/coverage/lcov-report/src/scheduler/jobs/settlement.job.ts.html new file mode 100644 index 0000000..c3110b3 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/jobs/settlement.job.ts.html @@ -0,0 +1,2350 @@ + + + + + + Code coverage report for src/scheduler/jobs/settlement.job.ts + + + + + + + + + +
+
+

All files / src/scheduler/jobs settlement.job.ts

+
+ +
+ 0% + Statements + 0/755 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/755 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource, LessThan } from 'typeorm';
+import {
+  ScheduledJob,
+  JobStatus,
+  RetryStrategy,
+} from '../entities/scheduled-job.entity';
+import {
+  Trade,
+  TradeStatus,
+  PaymentStatus,
+  DeliveryStatus,
+} from '../../energy/entities/trade.entity';
+
+export interface SettlementResult {
+  success: boolean;
+  settledTrades: string[];
+  failedSettlements: Array<{
+    tradeId: string;
+    error: string;
+    retryable: boolean;
+    amount?: number;
+  }>;
+  totalAmount: number;
+  processedCount: number;
+  executionTime: number;
+  details: {
+    paymentsProcessed: number;
+    deliveriesConfirmed: number;
+    commissionsCollected: number;
+    refundsProcessed: number;
+  };
+}
+
+@Injectable()
+export class SettlementJob {
+  private readonly logger = new Logger(SettlementJob.name);
+
+  constructor(
+    @InjectRepository(ScheduledJob)
+    private readonly scheduledJobRepository: Repository<ScheduledJob>,
+    @InjectRepository(Trade)
+    private readonly tradeRepository: Repository<Trade>,
+    private readonly dataSource: DataSource,
+  ) {}
+
+  @Cron(CronExpression.EVERY_5_MINUTES)
+  async processScheduledSettlements(): Promise<void> {
+    this.logger.log('Checking for scheduled settlement processing...');
+
+    try {
+      const pendingJobs = await this.scheduledJobRepository.find({
+        where: {
+          type: 'settlement' as any,
+          status: JobStatus.PENDING,
+          isActive: true,
+          isEmergencyStop: false,
+          scheduledAt: LessThan(new Date()),
+        },
+        order: { priority: 'DESC', scheduledAt: 'ASC' },
+      });
+
+      if (pendingJobs.length === 0) {
+        this.logger.debug('No pending settlement jobs found');
+        return;
+      }
+
+      this.logger.log(`Found ${pendingJobs.length} pending settlement jobs`);
+
+      for (const job of pendingJobs) {
+        await this.executeSettlementJob(job);
+      }
+    } catch (error) {
+      this.logger.error('Error in settlement scheduler', error);
+    }
+  }
+
+  async executeSettlementJob(job: ScheduledJob): Promise<SettlementResult> {
+    const startTime = Date.now();
+
+    this.logger.log(`Executing settlement job: ${job.id} - ${job.name}`);
+
+    try {
+      await this.updateJobStatus(job, JobStatus.RUNNING);
+
+      if (job.marketHoursOnly && !this.isWithinMarketHours(job.timeZone)) {
+        await this.rescheduleForMarketHours(job);
+        return this.createResult(false, [], [], 0, 0, {
+          paymentsProcessed: 0,
+          deliveriesConfirmed: 0,
+          commissionsCollected: 0,
+          refundsProcessed: 0,
+        });
+      }
+
+      const result = await this.processSettlement(job);
+
+      await this.updateJobCompletion(job, result);
+
+      const executionTime = Date.now() - startTime;
+      this.logger.log(
+        `Settlement job ${job.id} completed in ${executionTime}ms. Settled: ${result.settledTrades.length}, Amount: ${result.totalAmount}`,
+      );
+
+      return result;
+    } catch (error) {
+      const executionTime = Date.now() - startTime;
+      this.logger.error(`Settlement job ${job.id} failed`, error);
+
+      await this.handleJobFailure(job, error, executionTime);
+
+      return this.createResult(false, [], [], 0, executionTime, {
+        paymentsProcessed: 0,
+        deliveriesConfirmed: 0,
+        commissionsCollected: 0,
+        refundsProcessed: 0,
+      });
+    }
+  }
+
+  private async processSettlement(
+    job: ScheduledJob,
+  ): Promise<SettlementResult> {
+    const parameters = job.parameters || {};
+    const settlementId = parameters.settlementId;
+
+    if (settlementId) {
+      return await this.processSingleSettlement(settlementId, job);
+    } else {
+      return await this.processBatchSettlements(job);
+    }
+  }
+
+  private async processSingleSettlement(
+    settlementId: string,
+    job: ScheduledJob,
+  ): Promise<SettlementResult> {
+    const startTime = Date.now();
+
+    try {
+      const trade = await this.tradeRepository.findOne({
+        where: { id: settlementId },
+        relations: ['listing', 'bid'],
+      });
+
+      if (!trade) {
+        throw new Error(`Trade ${settlementId} not found`);
+      }
+
+      if (!this.isTradeSettleable(trade)) {
+        throw new Error(
+          `Trade ${settlementId} is not ready for settlement: ${trade.status}/${trade.deliveryStatus}`,
+        );
+      }
+
+      const result = await this.performSettlement(trade, job);
+
+      return {
+        success: true,
+        settledTrades: [settlementId],
+        failedSettlements: [],
+        totalAmount: trade.finalAmount || 0,
+        processedCount: 1,
+        executionTime: Date.now() - startTime,
+        details: result,
+      };
+    } catch (error) {
+      return {
+        success: false,
+        settledTrades: [],
+        failedSettlements: [
+          {
+            tradeId: settlementId,
+            error: error.message,
+            retryable: this.isRetryableError(error),
+          },
+        ],
+        totalAmount: 0,
+        processedCount: 0,
+        executionTime: Date.now() - startTime,
+        details: {
+          paymentsProcessed: 0,
+          deliveriesConfirmed: 0,
+          commissionsCollected: 0,
+          refundsProcessed: 0,
+        },
+      };
+    }
+  }
+
+  private async processBatchSettlements(
+    job: ScheduledJob,
+  ): Promise<SettlementResult> {
+    const startTime = Date.now();
+    const batchSize = job.parameters?.batchSize || 20;
+    const settledTrades: string[] = [];
+    const failedSettlements: Array<{
+      tradeId: string;
+      error: string;
+      retryable: boolean;
+      amount?: number;
+    }> = [];
+    let totalAmount = 0;
+
+    const details = {
+      paymentsProcessed: 0,
+      deliveriesConfirmed: 0,
+      commissionsCollected: 0,
+      refundsProcessed: 0,
+    };
+
+    try {
+      const eligibleTrades = await this.getSettleableTrades(batchSize);
+
+      this.logger.log(
+        `Processing batch settlement of ${eligibleTrades.length} trades`,
+      );
+
+      for (const trade of eligibleTrades) {
+        try {
+          const result = await this.performSettlement(trade, job);
+          settledTrades.push(trade.id);
+          totalAmount += trade.finalAmount || 0;
+
+          details.paymentsProcessed += result.paymentsProcessed || 0;
+          details.deliveriesConfirmed += result.deliveriesConfirmed || 0;
+          details.commissionsCollected += result.commissionsCollected || 0;
+          details.refundsProcessed += result.refundsProcessed || 0;
+
+          this.logger.debug(`Successfully settled trade ${trade.id}`);
+        } catch (error) {
+          failedSettlements.push({
+            tradeId: trade.id,
+            error: error.message,
+            retryable: this.isRetryableError(error),
+            amount: trade.finalAmount,
+          });
+
+          this.logger.error(`Failed to settle trade ${trade.id}`, error);
+        }
+      }
+
+      const totalProcessed = settledTrades.length + failedSettlements.length;
+      const success = failedSettlements.length === 0;
+
+      return {
+        success,
+        settledTrades,
+        failedSettlements,
+        totalAmount,
+        processedCount: totalProcessed,
+        executionTime: Date.now() - startTime,
+        details,
+      };
+    } catch (error) {
+      return {
+        success: false,
+        settledTrades,
+        failedSettlements,
+        totalAmount,
+        processedCount: settledTrades.length + failedSettlements.length,
+        executionTime: Date.now() - startTime,
+        details,
+      };
+    }
+  }
+
+  private async getSettleableTrades(limit: number): Promise<Trade[]> {
+    return await this.tradeRepository.find({
+      where: [
+        {
+          status: TradeStatus.IN_PROGRESS,
+          deliveryStatus: DeliveryStatus.DELIVERED,
+          paymentStatus: PaymentStatus.PENDING,
+        },
+        {
+          status: TradeStatus.IN_PROGRESS,
+          deliveryStatus: DeliveryStatus.DELIVERED,
+          paymentStatus: PaymentStatus.PROCESSING,
+        },
+      ],
+      relations: ['listing', 'bid'],
+      take: limit,
+      order: { deliveryConfirmedAt: 'ASC' },
+    });
+  }
+
+  private isTradeSettleable(trade: Trade): boolean {
+    return (
+      (trade.status === TradeStatus.IN_PROGRESS ||
+        trade.status === TradeStatus.CONFIRMED) &&
+      (trade.deliveryStatus === DeliveryStatus.DELIVERED ||
+        trade.deliveryStatus === DeliveryStatus.CONFIRMED) &&
+      (trade.paymentStatus === PaymentStatus.PENDING ||
+        trade.paymentStatus === PaymentStatus.PROCESSING)
+    );
+  }
+
+  private async performSettlement(
+    trade: Trade,
+    job: ScheduledJob,
+  ): Promise<any> {
+    return await this.dataSource.transaction(async (manager) => {
+      const settlementDetails = {
+        settledAt: new Date(),
+        settledBy: job.id,
+        previousStatus: trade.status,
+        previousPaymentStatus: trade.paymentStatus,
+      };
+
+      let paymentsProcessed = 0;
+      let commissionsCollected = 0;
+      let refundsProcessed = 0;
+
+      if (trade.paymentStatus === PaymentStatus.PENDING) {
+        await this.processPayment(trade, manager);
+        paymentsProcessed = 1;
+      }
+
+      if (trade.deliveryStatus === DeliveryStatus.DELIVERED) {
+        await this.confirmDelivery(trade, manager);
+      }
+
+      const commission = await this.calculateAndCollectCommission(
+        trade,
+        manager,
+      );
+      commissionsCollected = commission > 0 ? 1 : 0;
+
+      if (this.shouldProcessRefund(trade)) {
+        await this.processRefund(trade, manager);
+        refundsProcessed = 1;
+      }
+
+      trade.status = TradeStatus.COMPLETED;
+      trade.paymentStatus = PaymentStatus.COMPLETED;
+      trade.completedAt = new Date();
+      trade.paymentCompletedAt = new Date();
+
+      if (!trade.auditTrail) trade.auditTrail = [];
+      trade.auditTrail.push({
+        timestamp: new Date(),
+        action: 'trade_settled',
+        userId: 'system',
+        reason: `Automated settlement by job ${job.id}`,
+        details: settlementDetails,
+      });
+
+      await manager.save(trade);
+
+      await this.triggerSettlementNotifications(
+        trade,
+        'settlement_completed',
+        manager,
+      );
+
+      const result = {
+        tradeId: trade.id,
+        status: trade.status,
+        paymentStatus: trade.paymentStatus,
+        settledAt: trade.completedAt,
+        totalAmount: trade.finalAmount,
+        paymentsProcessed,
+        commissionsCollected,
+        refundsProcessed,
+      };
+
+      this.logger.log(`Trade ${trade.id} settlement completed successfully`);
+      return result;
+    });
+  }
+
+  private async processPayment(trade: Trade, manager: any): Promise<void> {
+    this.logger.log(`Processing payment for trade ${trade.id}`);
+
+    if (trade.paymentDetails?.paymentSchedule) {
+      for (const payment of trade.paymentDetails.paymentSchedule) {
+        if (payment.status === 'pending') {
+          payment.status = 'completed';
+          payment.transactionId = `txn_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+        }
+      }
+    }
+
+    trade.paymentStatus = PaymentStatus.PROCESSING;
+    await manager.save(trade);
+  }
+
+  private async confirmDelivery(trade: Trade, manager: any): Promise<void> {
+    this.logger.log(`Confirming delivery for trade ${trade.id}`);
+
+    trade.deliveryStatus = DeliveryStatus.CONFIRMED;
+    trade.deliveryConfirmedAt = new Date();
+
+    await manager.save(trade);
+  }
+
+  private async calculateAndCollectCommission(
+    trade: Trade,
+    manager: any,
+  ): Promise<number> {
+    const commissionRate = 0.02; // 2% commission
+    const commission = (trade.finalAmount || 0) * commissionRate;
+
+    if (commission > 0) {
+      this.logger.log(
+        `Collecting commission of ${commission} for trade ${trade.id}`,
+      );
+
+      if (!trade.paymentDetails) trade.paymentDetails = {};
+      trade.paymentDetails.commission = commission;
+      trade.paymentDetails.commissionCollected = true;
+      trade.paymentDetails.commissionCollectedAt = new Date();
+
+      await manager.save(trade);
+    }
+
+    return commission;
+  }
+
+  private shouldProcessRefund(trade: Trade): boolean {
+    return (
+      trade.isDisputed || trade.refundAmount > 0 || trade.penaltyAmount > 0
+    );
+  }
+
+  private async processRefund(trade: Trade, manager: any): Promise<void> {
+    this.logger.log(`Processing refund for trade ${trade.id}`);
+
+    const refundAmount = (trade.refundAmount || 0) + (trade.penaltyAmount || 0);
+
+    if (refundAmount > 0) {
+      trade.paymentStatus = PaymentStatus.REFUNDED;
+      trade.refundedAt = new Date();
+
+      if (!trade.paymentDetails) trade.paymentDetails = {};
+      trade.paymentDetails.refundAmount = refundAmount;
+      trade.paymentDetails.refundReason =
+        trade.disputeReason || 'Settlement refund';
+      trade.paymentDetails.refundTransactionId = `refund_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
+
+      await manager.save(trade);
+    }
+  }
+
+  private async triggerSettlementNotifications(
+    trade: Trade,
+    event: string,
+    manager: any,
+  ): Promise<void> {
+    this.logger.log(`Triggering ${event} notifications for trade ${trade.id}`);
+  }
+
+  private async updateJobStatus(
+    job: ScheduledJob,
+    status: JobStatus,
+  ): Promise<void> {
+    job.status = status;
+    job.updatedAt = new Date();
+
+    if (status === JobStatus.RUNNING) {
+      job.startedAt = new Date();
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private async updateJobCompletion(
+    job: ScheduledJob,
+    result: SettlementResult,
+  ): Promise<void> {
+    job.status = result.success ? JobStatus.COMPLETED : JobStatus.FAILED;
+    job.completedAt = new Date();
+    job.result = {
+      success: result.success,
+      data: result.details,
+      processedCount: result.processedCount,
+      errorCount: result.failedSettlements.length,
+      duration: result.executionTime,
+    };
+
+    if (!job.metrics)
+      job.metrics = {
+        executionCount: 0,
+        successCount: 0,
+        failureCount: 0,
+        avgExecutionTime: 0,
+        minExecutionTime: 0,
+        maxExecutionTime: 0,
+        totalExecutionTime: 0,
+      };
+
+    job.metrics.executionCount++;
+    if (result.success) {
+      job.metrics.successCount++;
+    } else {
+      job.metrics.failureCount++;
+    }
+
+    job.metrics.totalExecutionTime += result.executionTime;
+    job.metrics.avgExecutionTime =
+      job.metrics.totalExecutionTime / job.metrics.executionCount;
+
+    if (
+      job.metrics.minExecutionTime === 0 ||
+      result.executionTime < job.metrics.minExecutionTime
+    ) {
+      job.metrics.minExecutionTime = result.executionTime;
+    }
+
+    if (result.executionTime > job.metrics.maxExecutionTime) {
+      job.metrics.maxExecutionTime = result.executionTime;
+    }
+
+    if (job.scheduling?.isRecurring && job.scheduling.isActive) {
+      job.nextRunAt = this.calculateNextRunTime(job);
+      job.status = JobStatus.PENDING;
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private async handleJobFailure(
+    job: ScheduledJob,
+    error: any,
+    executionTime: number,
+  ): Promise<void> {
+    job.retryCount++;
+    job.status = JobStatus.FAILED;
+    job.completedAt = new Date();
+    job.error = {
+      message: error.message,
+      stack: error.stack,
+      timestamp: new Date(),
+      retryCount: job.retryCount,
+      maxRetries: job.maxRetries,
+    };
+
+    if (this.shouldRetry(job)) {
+      const nextRetryAt = this.calculateNextRetryTime(job);
+      job.error.nextRetryAt = nextRetryAt;
+      job.status = JobStatus.RETRYING;
+      job.scheduledAt = nextRetryAt;
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private shouldRetry(job: ScheduledJob): boolean {
+    return job.retryCount < job.maxRetries && this.isRetryableError(job.error);
+  }
+
+  private isRetryableError(error: any): boolean {
+    const retryableErrors = [
+      'TIMEOUT',
+      'CONNECTION_ERROR',
+      'TEMPORARY_FAILURE',
+      'RATE_LIMITED',
+      'SERVICE_UNAVAILABLE',
+      'PAYMENT_GATEWAY_ERROR',
+    ];
+
+    const errorMessage = error?.message?.toUpperCase() || '';
+    return retryableErrors.some((retryableError) =>
+      errorMessage.includes(retryableError),
+    );
+  }
+
+  private calculateNextRetryTime(job: ScheduledJob): Date {
+    const baseDelay = job.retryDelay || 10; // Settlement jobs have longer delays
+    let delay: number;
+
+    switch (job.retryStrategy) {
+      case RetryStrategy.IMMEDIATE:
+        delay = 0;
+        break;
+      case RetryStrategy.EXPONENTIAL_BACKOFF:
+        delay = baseDelay * Math.pow(2, job.retryCount - 1);
+        break;
+      case RetryStrategy.LINEAR_BACKOFF:
+        delay = baseDelay * job.retryCount;
+        break;
+      case RetryStrategy.FIXED_INTERVAL:
+        delay = baseDelay;
+        break;
+      default:
+        delay = baseDelay;
+    }
+
+    const maxDelay = 7200; // 2 hours max for settlements
+    delay = Math.min(delay, maxDelay);
+
+    return new Date(Date.now() + delay * 1000);
+  }
+
+  private calculateNextRunTime(job: ScheduledJob): Date {
+    const now = new Date();
+    const nextRun = new Date(now.getTime() + 24 * 60 * 60 * 1000); // Next day by default
+
+    if (job.scheduling?.endDate && nextRun > job.scheduling.endDate) {
+      job.scheduling.isActive = false;
+    }
+
+    return nextRun;
+  }
+
+  private isWithinMarketHours(timeZone: string = 'UTC'): boolean {
+    const now = new Date();
+
+    try {
+      const options: Intl.DateTimeFormatOptions = {
+        timeZone,
+        hour: '2-digit',
+        hour12: false,
+      };
+
+      const timeString = now.toLocaleTimeString('en-US', options);
+      const currentHour = parseInt(timeString);
+
+      const dayOptions: Intl.DateTimeFormatOptions = {
+        timeZone,
+        weekday: 'long',
+      };
+
+      const dayString = now.toLocaleDateString('en-US', dayOptions);
+      const isWeekday = !['Saturday', 'Sunday'].includes(dayString);
+
+      return isWeekday && currentHour >= 9 && currentHour < 17;
+    } catch (error) {
+      this.logger.warn(
+        `Error checking market hours for timezone ${timeZone}`,
+        error,
+      );
+      return true; // Default to allowing execution
+    }
+  }
+
+  private async rescheduleForMarketHours(job: ScheduledJob): Promise<void> {
+    const nextMarketOpen = this.getNextMarketOpen(job.timeZone);
+    job.scheduledAt = nextMarketOpen;
+    job.status = JobStatus.PENDING;
+
+    await this.scheduledJobRepository.save(job);
+
+    this.logger.log(
+      `Settlement job ${job.id} rescheduled for market open at ${nextMarketOpen.toISOString()}`,
+    );
+  }
+
+  private getNextMarketOpen(timeZone: string = 'UTC'): Date {
+    const now = new Date();
+    const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000);
+
+    try {
+      const marketOpen = new Date(tomorrow);
+      marketOpen.setUTCHours(14, 0, 0, 0); // 9:00 AM EST (2:00 PM UTC)
+
+      const options: Intl.DateTimeFormatOptions = {
+        timeZone,
+        weekday: 'long',
+      };
+
+      const dayString = marketOpen.toLocaleDateString('en-US', options);
+
+      if (['Saturday', 'Sunday'].includes(dayString)) {
+        marketOpen.setDate(
+          marketOpen.getDate() + (dayString === 'Saturday' ? 2 : 1),
+        );
+      }
+
+      return marketOpen;
+    } catch (error) {
+      this.logger.warn(
+        `Error calculating next market open for timezone ${timeZone}`,
+        error,
+      );
+      return new Date(Date.now() + 60 * 60 * 1000); // 1 hour from now as fallback
+    }
+  }
+
+  private createResult(
+    success: boolean,
+    settledTrades: string[],
+    failedSettlements: Array<{
+      tradeId: string;
+      error: string;
+      retryable: boolean;
+      amount?: number;
+    }>,
+    totalAmount: number,
+    executionTime: number,
+    details: any,
+  ): SettlementResult {
+    return {
+      success,
+      settledTrades,
+      failedSettlements,
+      totalAmount,
+      processedCount: settledTrades.length + failedSettlements.length,
+      executionTime,
+      details,
+    };
+  }
+
+  async getPendingSettlements(): Promise<Trade[]> {
+    return await this.getSettleableTrades(100);
+  }
+
+  async getSettlementMetrics(jobId: string): Promise<any> {
+    const job = await this.scheduledJobRepository.findOne({
+      where: { id: jobId },
+    });
+
+    if (!job) {
+      throw new Error(`Settlement job ${jobId} not found`);
+    }
+
+    const recentTrades = await this.tradeRepository.find({
+      where: { status: TradeStatus.COMPLETED },
+      order: { completedAt: 'DESC' },
+      take: 100,
+    });
+
+    const totalSettled = recentTrades.length;
+    const totalAmount = recentTrades.reduce(
+      (sum, trade) => sum + (trade.finalAmount || 0),
+      0,
+    );
+    const avgSettlementTime =
+      recentTrades.reduce((sum, trade) => {
+        if (trade.completedAt && trade.createdAt) {
+          return (
+            sum + (trade.completedAt.getTime() - trade.createdAt.getTime())
+          );
+        }
+        return sum;
+      }, 0) / totalSettled;
+
+    return {
+      jobId: job.id,
+      name: job.name,
+      status: job.status,
+      metrics: job.metrics,
+      lastExecution: job.lastRunAt,
+      nextExecution: job.nextRunAt,
+      recentSettlements: {
+        totalSettled,
+        totalAmount,
+        avgSettlementTime: avgSettlementTime / (1000 * 60 * 60), // Convert to hours
+      },
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/jobs/trade-execution.job.ts.html b/coverage/lcov-report/src/scheduler/jobs/trade-execution.job.ts.html new file mode 100644 index 0000000..d5e93e9 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/jobs/trade-execution.job.ts.html @@ -0,0 +1,1879 @@ + + + + + + Code coverage report for src/scheduler/jobs/trade-execution.job.ts + + + + + + + + + +
+
+

All files / src/scheduler/jobs trade-execution.job.ts

+
+ +
+ 0% + Statements + 0/598 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/598 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource } from 'typeorm';
+import {
+  ScheduledJob,
+  JobStatus,
+  RetryStrategy,
+} from '../entities/scheduled-job.entity';
+import {
+  Trade,
+  TradeStatus,
+  PaymentStatus,
+  DeliveryStatus,
+} from '../../energy/entities/trade.entity';
+
+export interface TradeExecutionResult {
+  success: boolean;
+  processedTrades: string[];
+  failedTrades: Array<{
+    tradeId: string;
+    error: string;
+    retryable: boolean;
+  }>;
+  totalProcessed: number;
+  executionTime: number;
+  details: any;
+}
+
+@Injectable()
+export class TradeExecutionJob {
+  private readonly logger = new Logger(TradeExecutionJob.name);
+
+  constructor(
+    @InjectRepository(ScheduledJob)
+    private readonly scheduledJobRepository: Repository<ScheduledJob>,
+    @InjectRepository(Trade)
+    private readonly tradeRepository: Repository<Trade>,
+    private readonly dataSource: DataSource,
+  ) {}
+
+  @Cron(CronExpression.EVERY_MINUTE)
+  async executeScheduledTrades(): Promise<void> {
+    this.logger.log('Checking for scheduled trade executions...');
+
+    try {
+      const pendingJobs = await this.scheduledJobRepository.find({
+        where: {
+          type: 'trade_execution' as any,
+          status: JobStatus.PENDING,
+          isActive: true,
+          isEmergencyStop: false,
+          scheduledAt: LessThan(new Date()),
+        },
+        order: { priority: 'DESC', scheduledAt: 'ASC' },
+      });
+
+      if (pendingJobs.length === 0) {
+        this.logger.debug('No pending trade execution jobs found');
+        return;
+      }
+
+      this.logger.log(
+        `Found ${pendingJobs.length} pending trade execution jobs`,
+      );
+
+      for (const job of pendingJobs) {
+        await this.executeTradeJob(job);
+      }
+    } catch (error) {
+      this.logger.error('Error in trade execution scheduler', error);
+    }
+  }
+
+  async executeTradeJob(job: ScheduledJob): Promise<TradeExecutionResult> {
+    const startTime = Date.now();
+
+    this.logger.log(`Executing trade job: ${job.id} - ${job.name}`);
+
+    try {
+      await this.updateJobStatus(job, JobStatus.RUNNING);
+
+      if (job.marketHoursOnly && !this.isWithinMarketHours(job.timeZone)) {
+        await this.rescheduleForMarketHours(job);
+        return this.createResult(false, [], [], 0, Date.now() - startTime, {
+          reason: 'Outside market hours',
+        });
+      }
+
+      const result = await this.processTradeExecution(job);
+
+      await this.updateJobCompletion(job, result);
+
+      const executionTime = Date.now() - startTime;
+      this.logger.log(
+        `Trade job ${job.id} completed in ${executionTime}ms. Processed: ${result.totalProcessed}, Success: ${result.success}`,
+      );
+
+      return result;
+    } catch (error) {
+      const executionTime = Date.now() - startTime;
+      this.logger.error(`Trade job ${job.id} failed`, error);
+
+      await this.handleJobFailure(job, error, executionTime);
+
+      return this.createResult(false, [], [], 0, executionTime, {
+        error: error.message,
+      });
+    }
+  }
+
+  private async processTradeExecution(
+    job: ScheduledJob,
+  ): Promise<TradeExecutionResult> {
+    const parameters = job.parameters || {};
+    const tradeId = parameters.tradeId;
+
+    if (tradeId) {
+      return await this.executeSingleTrade(tradeId, job);
+    } else {
+      return await this.executeBatchTrades(job);
+    }
+  }
+
+  private async executeSingleTrade(
+    tradeId: string,
+    job: ScheduledJob,
+  ): Promise<TradeExecutionResult> {
+    const startTime = Date.now();
+
+    try {
+      const trade = await this.tradeRepository.findOne({
+        where: { id: tradeId },
+        relations: ['listing', 'bid'],
+      });
+
+      if (!trade) {
+        throw new Error(`Trade ${tradeId} not found`);
+      }
+
+      if (
+        trade.status !== TradeStatus.PENDING &&
+        trade.status !== TradeStatus.CONFIRMED
+      ) {
+        throw new Error(
+          `Trade ${tradeId} is not in executable status: ${trade.status}`,
+        );
+      }
+
+      const result = await this.performTradeExecution(trade, job);
+
+      return {
+        success: true,
+        processedTrades: [tradeId],
+        failedTrades: [],
+        totalProcessed: 1,
+        executionTime: Date.now() - startTime,
+        details: result,
+      };
+    } catch (error) {
+      return {
+        success: false,
+        processedTrades: [],
+        failedTrades: [
+          {
+            tradeId,
+            error: error.message,
+            retryable: this.isRetryableError(error),
+          },
+        ],
+        totalProcessed: 0,
+        executionTime: Date.now() - startTime,
+        details: { error: error.message },
+      };
+    }
+  }
+
+  private async executeBatchTrades(
+    job: ScheduledJob,
+  ): Promise<TradeExecutionResult> {
+    const startTime = Date.now();
+    const batchSize = job.parameters?.batchSize || 10;
+    const processedTrades: string[] = [];
+    const failedTrades: Array<{
+      tradeId: string;
+      error: string;
+      retryable: boolean;
+    }> = [];
+
+    try {
+      const pendingTrades = await this.tradeRepository.find({
+        where: {
+          status: TradeStatus.CONFIRMED,
+          paymentStatus: PaymentStatus.COMPLETED,
+        },
+        relations: ['listing', 'bid'],
+        take: batchSize,
+        order: { createdAt: 'ASC' },
+      });
+
+      this.logger.log(`Processing batch of ${pendingTrades.length} trades`);
+
+      for (const trade of pendingTrades) {
+        try {
+          const result = await this.performTradeExecution(trade, job);
+          processedTrades.push(trade.id);
+
+          this.logger.debug(`Successfully executed trade ${trade.id}`);
+        } catch (error) {
+          failedTrades.push({
+            tradeId: trade.id,
+            error: error.message,
+            retryable: this.isRetryableError(error),
+          });
+
+          this.logger.error(`Failed to execute trade ${trade.id}`, error);
+        }
+      }
+
+      const totalProcessed = processedTrades.length + failedTrades.length;
+      const success = failedTrades.length === 0;
+
+      return {
+        success,
+        processedTrades,
+        failedTrades,
+        totalProcessed,
+        executionTime: Date.now() - startTime,
+        details: {
+          batchSize,
+          successRate: processedTrades.length / totalProcessed,
+        },
+      };
+    } catch (error) {
+      return {
+        success: false,
+        processedTrades,
+        failedTrades,
+        totalProcessed: processedTrades.length + failedTrades.length,
+        executionTime: Date.now() - startTime,
+        details: { error: error.message },
+      };
+    }
+  }
+
+  private async performTradeExecution(
+    trade: Trade,
+    job: ScheduledJob,
+  ): Promise<any> {
+    return await this.dataSource.transaction(async (manager) => {
+      const executionDetails = {
+        executedAt: new Date(),
+        executedBy: job.id,
+        previousStatus: trade.status,
+      };
+
+      trade.status = TradeStatus.IN_PROGRESS;
+      trade.deliveryStatus = DeliveryStatus.SCHEDULED;
+
+      if (!trade.auditTrail) trade.auditTrail = [];
+      trade.auditTrail.push({
+        timestamp: new Date(),
+        action: 'trade_execution_started',
+        userId: 'system',
+        reason: `Scheduled execution by job ${job.id}`,
+        details: executionDetails,
+      });
+
+      await manager.save(trade);
+
+      await this.initializeDeliveryProcess(trade, manager);
+      await this.triggerNotifications(trade, 'execution_started', manager);
+
+      const result = {
+        tradeId: trade.id,
+        status: trade.status,
+        deliveryStatus: trade.deliveryStatus,
+        executedAt: trade.updatedAt,
+        nextSteps: ['delivery_scheduled', 'payment_verified'],
+      };
+
+      this.logger.log(`Trade ${trade.id} execution initiated successfully`);
+      return result;
+    });
+  }
+
+  private async initializeDeliveryProcess(
+    trade: Trade,
+    manager: any,
+  ): Promise<void> {
+    if (trade.deliveryDetails?.deliveryDate) {
+      const deliveryDate = new Date(trade.deliveryDetails.deliveryDate);
+      const now = new Date();
+
+      if (deliveryDate <= now) {
+        trade.deliveryStatus = DeliveryStatus.IN_TRANSIT;
+        trade.deliveryConfirmedAt = new Date();
+      } else {
+        trade.deliveryStatus = DeliveryStatus.SCHEDULED;
+      }
+
+      await manager.save(trade);
+    }
+  }
+
+  private async triggerNotifications(
+    trade: Trade,
+    event: string,
+    manager: any,
+  ): Promise<void> {
+    this.logger.log(`Triggering ${event} notifications for trade ${trade.id}`);
+  }
+
+  private async updateJobStatus(
+    job: ScheduledJob,
+    status: JobStatus,
+  ): Promise<void> {
+    job.status = status;
+    job.updatedAt = new Date();
+
+    if (status === JobStatus.RUNNING) {
+      job.startedAt = new Date();
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private async updateJobCompletion(
+    job: ScheduledJob,
+    result: TradeExecutionResult,
+  ): Promise<void> {
+    job.status = result.success ? JobStatus.COMPLETED : JobStatus.FAILED;
+    job.completedAt = new Date();
+    job.result = {
+      success: result.success,
+      data: result.details,
+      processedCount: result.totalProcessed,
+      errorCount: result.failedTrades.length,
+      duration: result.executionTime,
+    };
+
+    if (!job.metrics)
+      job.metrics = {
+        executionCount: 0,
+        successCount: 0,
+        failureCount: 0,
+        avgExecutionTime: 0,
+        minExecutionTime: 0,
+        maxExecutionTime: 0,
+        totalExecutionTime: 0,
+      };
+
+    job.metrics.executionCount++;
+    if (result.success) {
+      job.metrics.successCount++;
+    } else {
+      job.metrics.failureCount++;
+    }
+
+    job.metrics.totalExecutionTime += result.executionTime;
+    job.metrics.avgExecutionTime =
+      job.metrics.totalExecutionTime / job.metrics.executionCount;
+
+    if (
+      job.metrics.minExecutionTime === 0 ||
+      result.executionTime < job.metrics.minExecutionTime
+    ) {
+      job.metrics.minExecutionTime = result.executionTime;
+    }
+
+    if (result.executionTime > job.metrics.maxExecutionTime) {
+      job.metrics.maxExecutionTime = result.executionTime;
+    }
+
+    if (job.scheduling?.isRecurring && job.scheduling.isActive) {
+      job.nextRunAt = this.calculateNextRunTime(job);
+      job.status = JobStatus.PENDING;
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private async handleJobFailure(
+    job: ScheduledJob,
+    error: any,
+    executionTime: number,
+  ): Promise<void> {
+    job.retryCount++;
+    job.status = JobStatus.FAILED;
+    job.completedAt = new Date();
+    job.error = {
+      message: error.message,
+      stack: error.stack,
+      timestamp: new Date(),
+      retryCount: job.retryCount,
+      maxRetries: job.maxRetries,
+    };
+
+    if (this.shouldRetry(job)) {
+      const nextRetryAt = this.calculateNextRetryTime(job);
+      job.error.nextRetryAt = nextRetryAt;
+      job.status = JobStatus.RETRYING;
+      job.scheduledAt = nextRetryAt;
+    }
+
+    await this.scheduledJobRepository.save(job);
+  }
+
+  private shouldRetry(job: ScheduledJob): boolean {
+    return job.retryCount < job.maxRetries && this.isRetryableError(job.error);
+  }
+
+  private isRetryableError(error: any): boolean {
+    const retryableErrors = [
+      'TIMEOUT',
+      'CONNECTION_ERROR',
+      'TEMPORARY_FAILURE',
+      'RATE_LIMITED',
+      'SERVICE_UNAVAILABLE',
+    ];
+
+    const errorMessage = error?.message?.toUpperCase() || '';
+    return retryableErrors.some((retryableError) =>
+      errorMessage.includes(retryableError),
+    );
+  }
+
+  private calculateNextRetryTime(job: ScheduledJob): Date {
+    const baseDelay = job.retryDelay || 5;
+    let delay: number;
+
+    switch (job.retryStrategy) {
+      case RetryStrategy.IMMEDIATE:
+        delay = 0;
+        break;
+      case RetryStrategy.EXPONENTIAL_BACKOFF:
+        delay = baseDelay * Math.pow(2, job.retryCount - 1);
+        break;
+      case RetryStrategy.LINEAR_BACKOFF:
+        delay = baseDelay * job.retryCount;
+        break;
+      case RetryStrategy.FIXED_INTERVAL:
+        delay = baseDelay;
+        break;
+      default:
+        delay = baseDelay;
+    }
+
+    const maxDelay = 3600; // 1 hour max
+    delay = Math.min(delay, maxDelay);
+
+    return new Date(Date.now() + delay * 1000);
+  }
+
+  private calculateNextRunTime(job: ScheduledJob): Date {
+    const now = new Date();
+    const nextRun = new Date(now.getTime() + 24 * 60 * 60 * 1000); // Next day by default
+
+    if (job.scheduling?.endDate && nextRun > job.scheduling.endDate) {
+      job.scheduling.isActive = false;
+    }
+
+    return nextRun;
+  }
+
+  private isWithinMarketHours(timeZone: string = 'UTC'): boolean {
+    const now = new Date();
+
+    try {
+      const options: Intl.DateTimeFormatOptions = {
+        timeZone,
+        hour: '2-digit',
+        hour12: false,
+      };
+
+      const timeString = now.toLocaleTimeString('en-US', options);
+      const currentHour = parseInt(timeString);
+
+      const dayOptions: Intl.DateTimeFormatOptions = {
+        timeZone,
+        weekday: 'long',
+      };
+
+      const dayString = now.toLocaleDateString('en-US', dayOptions);
+      const isWeekday = !['Saturday', 'Sunday'].includes(dayString);
+
+      return isWeekday && currentHour >= 9 && currentHour < 17;
+    } catch (error) {
+      this.logger.warn(
+        `Error checking market hours for timezone ${timeZone}`,
+        error,
+      );
+      return true; // Default to allowing execution
+    }
+  }
+
+  private async rescheduleForMarketHours(job: ScheduledJob): Promise<void> {
+    const nextMarketOpen = this.getNextMarketOpen(job.timeZone);
+    job.scheduledAt = nextMarketOpen;
+    job.status = JobStatus.PENDING;
+
+    await this.scheduledJobRepository.save(job);
+
+    this.logger.log(
+      `Job ${job.id} rescheduled for market open at ${nextMarketOpen.toISOString()}`,
+    );
+  }
+
+  private getNextMarketOpen(timeZone: string = 'UTC'): Date {
+    const now = new Date();
+    const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000);
+
+    try {
+      const marketOpen = new Date(tomorrow);
+      marketOpen.setUTCHours(14, 0, 0, 0); // 9:00 AM EST (2:00 PM UTC)
+
+      const options: Intl.DateTimeFormatOptions = {
+        timeZone,
+        weekday: 'long',
+      };
+
+      const dayString = marketOpen.toLocaleDateString('en-US', options);
+
+      if (['Saturday', 'Sunday'].includes(dayString)) {
+        marketOpen.setDate(
+          marketOpen.getDate() + (dayString === 'Saturday' ? 2 : 1),
+        );
+      }
+
+      return marketOpen;
+    } catch (error) {
+      this.logger.warn(
+        `Error calculating next market open for timezone ${timeZone}`,
+        error,
+      );
+      return new Date(Date.now() + 60 * 60 * 1000); // 1 hour from now as fallback
+    }
+  }
+
+  private createResult(
+    success: boolean,
+    processedTrades: string[],
+    failedTrades: Array<{ tradeId: string; error: string; retryable: boolean }>,
+    totalProcessed: number,
+    executionTime: number,
+    details: any,
+  ): TradeExecutionResult {
+    return {
+      success,
+      processedTrades,
+      failedTrades,
+      totalProcessed,
+      executionTime,
+      details,
+    };
+  }
+
+  async getJobMetrics(jobId: string): Promise<any> {
+    const job = await this.scheduledJobRepository.findOne({
+      where: { id: jobId },
+    });
+
+    if (!job) {
+      throw new Error(`Job ${jobId} not found`);
+    }
+
+    return {
+      jobId: job.id,
+      name: job.name,
+      type: job.type,
+      status: job.status,
+      metrics: job.metrics,
+      lastExecution: job.lastRunAt,
+      nextExecution: job.nextRunAt,
+      retryCount: job.retryCount,
+      maxRetries: job.maxRetries,
+    };
+  }
+
+  async emergencyStop(jobId: string, reason: string): Promise<void> {
+    const job = await this.scheduledJobRepository.findOne({
+      where: { id: jobId },
+    });
+
+    if (!job) {
+      throw new Error(`Job ${jobId} not found`);
+    }
+
+    job.isEmergencyStop = true;
+    job.emergencyStopReason = reason;
+    job.emergencyStoppedAt = new Date();
+    job.status = JobStatus.CANCELLED;
+
+    await this.scheduledJobRepository.save(job);
+
+    this.logger.warn(`Emergency stop triggered for job ${jobId}: ${reason}`);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/scheduler.module.ts.html b/coverage/lcov-report/src/scheduler/scheduler.module.ts.html new file mode 100644 index 0000000..fcaeead --- /dev/null +++ b/coverage/lcov-report/src/scheduler/scheduler.module.ts.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for src/scheduler/scheduler.module.ts + + + + + + + + + +
+
+

All files / src/scheduler scheduler.module.ts

+
+ +
+ 0% + Statements + 0/27 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/27 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { SchedulerModule } from '@nestjs/schedule';
+import { SchedulerService } from './scheduler.service';
+import { ScheduledJob } from './entities/scheduled-job.entity';
+import { TradeExecutionJob } from './jobs/trade-execution.job';
+import { SettlementJob } from './jobs/settlement.job';
+import { MaintenanceJob } from './jobs/maintenance.job';
+import { MarketHoursService } from './services/market-hours.service';
+import { SchedulerController } from './controllers/scheduler.controller';
+
+@Module({
+  imports: [
+    TypeOrmModule.forFeature([ScheduledJob]),
+    SchedulerModule.forRoot(),
+  ],
+  controllers: [SchedulerController],
+  providers: [
+    SchedulerService,
+    TradeExecutionJob,
+    SettlementJob,
+    MaintenanceJob,
+    MarketHoursService,
+  ],
+  exports: [SchedulerService, MarketHoursService],
+})
+export class SchedulerModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/scheduler.service.ts.html b/coverage/lcov-report/src/scheduler/scheduler.service.ts.html new file mode 100644 index 0000000..8e37c26 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/scheduler.service.ts.html @@ -0,0 +1,2533 @@ + + + + + + Code coverage report for src/scheduler/scheduler.service.ts + + + + + + + + + +
+
+

All files / src/scheduler scheduler.service.ts

+
+ +
+ 0% + Statements + 0/816 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/816 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource, LessThan, MoreThan } from 'typeorm';
+import { Cron, CronExpression, SchedulerRegistry } from '@nestjs/schedule';
+import {
+  ScheduledJob,
+  JobStatus,
+  JobType,
+  JobPriority,
+  RetryStrategy,
+} from './entities/scheduled-job.entity';
+import {
+  ScheduleTradeDto,
+  UpdateScheduleDto,
+  BulkScheduleDto,
+  EmergencyStopDto,
+  JobQueryDto,
+} from './dto/schedule-trade.dto';
+import { TradeExecutionJob } from './jobs/trade-execution.job';
+import { SettlementJob } from './jobs/settlement.job';
+import { MaintenanceJob } from './jobs/maintenance.job';
+
+export interface SchedulerMetrics {
+  totalJobs: number;
+  activeJobs: number;
+  pendingJobs: number;
+  runningJobs: number;
+  completedJobs: number;
+  failedJobs: number;
+  avgExecutionTime: number;
+  successRate: number;
+  jobsByType: Record<JobType, number>;
+  jobsByPriority: Record<JobPriority, number>;
+  emergencyStoppedJobs: number;
+}
+
+export interface JobExecutionResult {
+  success: boolean;
+  jobId: string;
+  executionTime: number;
+  result?: any;
+  error?: string;
+  nextRunAt?: Date;
+}
+
+@Injectable()
+export class SchedulerService implements OnModuleInit {
+  private readonly logger = new Logger(SchedulerService.name);
+  private readonly jobExecutors = new Map<JobType, any>();
+  private isEmergencyMode = false;
+  private emergencyReason = '';
+
+  constructor(
+    @InjectRepository(ScheduledJob)
+    private readonly scheduledJobRepository: Repository<ScheduledJob>,
+    private readonly dataSource: DataSource,
+    private readonly schedulerRegistry: SchedulerRegistry,
+    private readonly tradeExecutionJob: TradeExecutionJob,
+    private readonly settlementJob: SettlementJob,
+    private readonly maintenanceJob: MaintenanceJob,
+  ) {}
+
+  async onModuleInit() {
+    this.logger.log('Initializing scheduler service...');
+
+    this.jobExecutors.set(JobType.TRADE_EXECUTION, this.tradeExecutionJob);
+    this.jobExecutors.set(JobType.SETTLEMENT, this.settlementJob);
+    this.jobExecutors.set(JobType.MAINTENANCE, this.maintenanceJob);
+
+    await this.initializeSystemJobs();
+    await this.recoverPendingJobs();
+
+    this.logger.log('Scheduler service initialized successfully');
+  }
+
+  async scheduleTrade(
+    scheduleTradeDto: ScheduleTradeDto,
+    userId?: string,
+  ): Promise<ScheduledJob> {
+    this.logger.log(`Scheduling trade execution: ${scheduleTradeDto.name}`);
+
+    const job = this.scheduledJobRepository.create({
+      ...scheduleTradeDto,
+      status: JobStatus.PENDING,
+      isActive: true,
+      createdBy: userId,
+      scheduling: {
+        isActive: true,
+        isRecurring: scheduleTradeDto.scheduling?.isRecurring || false,
+        runCount: 0,
+        skipIfRunning: scheduleTradeDto.scheduling?.skipIfRunning || false,
+        concurrency: scheduleTradeDto.scheduling?.concurrency || 'forbid',
+      },
+      metrics: {
+        executionCount: 0,
+        successCount: 0,
+        failureCount: 0,
+        avgExecutionTime: 0,
+        minExecutionTime: 0,
+        maxExecutionTime: 0,
+        totalExecutionTime: 0,
+      },
+    });
+
+    if (scheduleTradeDto.scheduledAt) {
+      job.scheduledAt = new Date(scheduleTradeDto.scheduledAt);
+    }
+
+    const savedJob = await this.scheduledJobRepository.save(job);
+
+    this.logger.log(`Trade execution scheduled: ${savedJob.id}`);
+    return savedJob;
+  }
+
+  async updateSchedule(
+    jobId: string,
+    updateScheduleDto: UpdateScheduleDto,
+    userId?: string,
+  ): Promise<ScheduledJob> {
+    const job = await this.getJobById(jobId);
+
+    if (job.status === JobStatus.RUNNING) {
+      throw new Error('Cannot update a job that is currently running');
+    }
+
+    if (job.isEmergencyStop) {
+      throw new Error('Cannot update a job that has been emergency stopped');
+    }
+
+    Object.assign(job, updateScheduleDto);
+    job.updatedBy = userId;
+
+    if (updateScheduleDto.scheduledAt) {
+      job.scheduledAt = new Date(updateScheduleDto.scheduledAt);
+    }
+
+    const updatedJob = await this.scheduledJobRepository.save(job);
+
+    this.logger.log(`Schedule updated: ${jobId}`);
+    return updatedJob;
+  }
+
+  async bulkSchedule(
+    bulkScheduleDto: BulkScheduleDto,
+    userId?: string,
+  ): Promise<ScheduledJob[]> {
+    this.logger.log(`Bulk scheduling ${bulkScheduleDto.jobs.length} jobs`);
+
+    const jobs: ScheduledJob[] = [];
+
+    for (let i = 0; i < bulkScheduleDto.jobs.length; i++) {
+      const jobDto = bulkScheduleDto.jobs[i];
+
+      if (bulkScheduleDto.executeSequentially && i > 0) {
+        const delay = bulkScheduleDto.delayBetweenJobs || 30;
+        const scheduledAt = new Date(Date.now() + i * delay * 1000);
+        jobDto.scheduledAt = scheduledAt.toISOString();
+      }
+
+      const job = await this.scheduleTrade(jobDto, userId);
+      jobs.push(job);
+
+      if (bulkScheduleDto.executeSequentially) {
+        job.dependencies = {
+          jobIds: i > 0 ? [jobs[i - 1].id] : [],
+          conditions: [],
+        };
+        await this.scheduledJobRepository.save(job);
+      }
+    }
+
+    this.logger.log(`Bulk scheduling completed: ${jobs.length} jobs created`);
+    return jobs;
+  }
+
+  async executeJob(jobId: string): Promise<JobExecutionResult> {
+    const job = await this.getJobById(jobId);
+
+    if (job.status !== JobStatus.PENDING) {
+      throw new Error(`Job ${jobId} is not in pending status: ${job.status}`);
+    }
+
+    if (job.isEmergencyStop) {
+      throw new Error(`Job ${jobId} has been emergency stopped`);
+    }
+
+    const executor = this.jobExecutors.get(job.type);
+    if (!executor) {
+      throw new Error(`No executor found for job type: ${job.type}`);
+    }
+
+    this.logger.log(`Executing job: ${jobId} - ${job.name}`);
+
+    const startTime = Date.now();
+    let result: JobExecutionResult;
+
+    try {
+      const executionResult = await executor.executeTradeJob(job);
+
+      result = {
+        success: executionResult.success,
+        jobId,
+        executionTime: Date.now() - startTime,
+        result: executionResult,
+        nextRunAt: job.nextRunAt,
+      };
+
+      this.logger.log(`Job ${jobId} execution completed successfully`);
+    } catch (error) {
+      result = {
+        success: false,
+        jobId,
+        executionTime: Date.now() - startTime,
+        error: error.message,
+      };
+
+      this.logger.error(`Job ${jobId} execution failed`, error);
+    }
+
+    return result;
+  }
+
+  async cancelJob(
+    jobId: string,
+    userId?: string,
+    reason?: string,
+  ): Promise<ScheduledJob> {
+    const job = await this.getJobById(jobId);
+
+    if (job.status === JobStatus.RUNNING) {
+      throw new Error('Cannot cancel a job that is currently running');
+    }
+
+    if (job.status === JobStatus.COMPLETED) {
+      throw new Error('Cannot cancel a job that has already completed');
+    }
+
+    job.status = JobStatus.CANCELLED;
+    job.updatedBy = userId;
+
+    if (!job.auditTrail) job.auditTrail = [];
+    job.auditTrail.push({
+      timestamp: new Date(),
+      action: 'cancelled',
+      userId,
+      reason: reason || 'Job cancelled by user',
+    });
+
+    const cancelledJob = await this.scheduledJobRepository.save(job);
+
+    this.logger.log(`Job cancelled: ${jobId}${reason ? ` - ${reason}` : ''}`);
+    return cancelledJob;
+  }
+
+  async emergencyStop(
+    emergencyStopDto: EmergencyStopDto,
+    userId?: string,
+  ): Promise<{ stoppedJobs: number; affectedJobs: string[] }> {
+    this.logger.warn(`Emergency stop initiated: ${emergencyStopDto.reason}`);
+
+    this.isEmergencyMode = true;
+    this.emergencyReason = emergencyStopDto.reason;
+
+    const queryBuilder = this.scheduledJobRepository
+      .createQueryBuilder('job')
+      .where('job.status IN (:...statuses)', {
+        statuses: [JobStatus.PENDING, JobStatus.RETRYING],
+      })
+      .andWhere('job.isEmergencyStop = :isEmergencyStop', {
+        isEmergencyStop: false,
+      });
+
+    if (emergencyStopDto.scope === 'type' && emergencyStopDto.jobTypes) {
+      queryBuilder.andWhere('job.type IN (:...jobTypes)', {
+        jobTypes: emergencyStopDto.jobTypes,
+      });
+    }
+
+    if (emergencyStopDto.scope === 'priority' && emergencyStopDto.priorities) {
+      queryBuilder.andWhere('job.priority IN (:...priorities)', {
+        priorities: emergencyStopDto.priorities,
+      });
+    }
+
+    if (emergencyStopDto.scope === 'specific' && emergencyStopDto.jobIds) {
+      queryBuilder.andWhere('job.id IN (:...jobIds)', {
+        jobIds: emergencyStopDto.jobIds,
+      });
+    }
+
+    const jobsToStop = await queryBuilder.getMany();
+    const stoppedJobs: ScheduledJob[] = [];
+    const affectedJobs: string[] = [];
+
+    for (const job of jobsToStop) {
+      job.isEmergencyStop = true;
+      job.emergencyStopReason = emergencyStopDto.reason;
+      job.emergencyStoppedAt = new Date();
+      job.status = JobStatus.CANCELLED;
+
+      if (!job.auditTrail) job.auditTrail = [];
+      job.auditTrail.push({
+        timestamp: new Date(),
+        action: 'emergency_stopped',
+        userId,
+        reason: emergencyStopDto.reason,
+      });
+
+      const updatedJob = await this.scheduledJobRepository.save(job);
+      stoppedJobs.push(updatedJob);
+      affectedJobs.push(updatedJob.id);
+    }
+
+    this.logger.warn(
+      `Emergency stop completed: ${stoppedJobs.length} jobs stopped`,
+    );
+
+    return {
+      stoppedJobs: stoppedJobs.length,
+      affectedJobs,
+    };
+  }
+
+  async resumeEmergencyStops(
+    userId?: string,
+  ): Promise<{ resumedJobs: number; affectedJobs: string[] }> {
+    if (!this.isEmergencyMode) {
+      throw new Error('No emergency mode is currently active');
+    }
+
+    this.logger.log('Resuming emergency stopped jobs...');
+
+    const stoppedJobs = await this.scheduledJobRepository.find({
+      where: {
+        isEmergencyStop: true,
+        status: JobStatus.CANCELLED,
+      },
+    });
+
+    const resumedJobs: ScheduledJob[] = [];
+    const affectedJobs: string[] = [];
+
+    for (const job of stoppedJobs) {
+      if (job.emergencyStopReason === this.emergencyReason) {
+        job.isEmergencyStop = false;
+        job.emergencyStopReason = null;
+        job.emergencyStoppedAt = null;
+        job.status = JobStatus.PENDING;
+        job.scheduledAt = new Date(Date.now() + 5 * 60 * 1000); // 5 minutes from now
+
+        if (!job.auditTrail) job.auditTrail = [];
+        job.auditTrail.push({
+          timestamp: new Date(),
+          action: 'emergency_resumed',
+          userId,
+          reason: 'Emergency stop lifted',
+        });
+
+        const updatedJob = await this.scheduledJobRepository.save(job);
+        resumedJobs.push(updatedJob);
+        affectedJobs.push(updatedJob.id);
+      }
+    }
+
+    this.isEmergencyMode = false;
+    this.emergencyReason = '';
+
+    this.logger.log(
+      `Emergency stop resumed: ${resumedJobs.length} jobs resumed`,
+    );
+
+    return {
+      resumedJobs: resumedJobs.length,
+      affectedJobs,
+    };
+  }
+
+  async getJobs(query: JobQueryDto = {}): Promise<{
+    jobs: ScheduledJob[];
+    total: number;
+    page: number;
+    limit: number;
+  }> {
+    const queryBuilder = this.scheduledJobRepository.createQueryBuilder('job');
+
+    if (query.type) {
+      queryBuilder.andWhere('job.type = :type', { type: query.type });
+    }
+
+    if (query.status) {
+      queryBuilder.andWhere('job.status = :status', { status: query.status });
+    }
+
+    if (query.priority) {
+      queryBuilder.andWhere('job.priority = :priority', {
+        priority: query.priority,
+      });
+    }
+
+    if (query.name) {
+      queryBuilder.andWhere('job.name ILIKE :name', {
+        name: `%${query.name}%`,
+      });
+    }
+
+    if (query.createdBy) {
+      queryBuilder.andWhere('job.createdBy = :createdBy', {
+        createdBy: query.createdBy,
+      });
+    }
+
+    if (query.tags && query.tags.length > 0) {
+      queryBuilder.andWhere('job.tags && :tags', { tags: query.tags });
+    }
+
+    if (query.scheduledAfter) {
+      queryBuilder.andWhere('job.scheduledAt >= :scheduledAfter', {
+        scheduledAfter: new Date(query.scheduledAfter),
+      });
+    }
+
+    if (query.scheduledBefore) {
+      queryBuilder.andWhere('job.scheduledAt <= :scheduledBefore', {
+        scheduledBefore: new Date(query.scheduledBefore),
+      });
+    }
+
+    if (query.isActive !== undefined) {
+      queryBuilder.andWhere('job.isActive = :isActive', {
+        isActive: query.isActive,
+      });
+    }
+
+    if (query.isEmergencyStop !== undefined) {
+      queryBuilder.andWhere('job.isEmergencyStop = :isEmergencyStop', {
+        isEmergencyStop: query.isEmergencyStop,
+      });
+    }
+
+    const sortBy = query.sortBy || 'createdAt';
+    const sortOrder = query.sortOrder || 'DESC';
+    queryBuilder.orderBy(`job.${sortBy}`, sortOrder);
+
+    const page = query.page || 1;
+    const limit = Math.min(query.limit || 20, 100);
+    const skip = (page - 1) * limit;
+
+    queryBuilder.skip(skip).take(limit);
+
+    const [jobs, total] = await queryBuilder.getManyAndCount();
+
+    return {
+      jobs,
+      total,
+      page,
+      limit,
+    };
+  }
+
+  async getJobById(jobId: string): Promise<ScheduledJob> {
+    const job = await this.scheduledJobRepository.findOne({
+      where: { id: jobId },
+      relations: ['dependencies'],
+    });
+
+    if (!job) {
+      throw new Error(`Job ${jobId} not found`);
+    }
+
+    return job;
+  }
+
+  async getJobMetrics(jobId: string): Promise<any> {
+    const job = await this.getJobById(jobId);
+    const executor = this.jobExecutors.get(job.type);
+
+    if (executor && typeof executor.getJobMetrics === 'function') {
+      return await executor.getJobMetrics(jobId);
+    }
+
+    return {
+      jobId: job.id,
+      name: job.name,
+      type: job.type,
+      status: job.status,
+      metrics: job.metrics,
+      lastExecution: job.lastRunAt,
+      nextExecution: job.nextRunAt,
+      retryCount: job.retryCount,
+      maxRetries: job.maxRetries,
+    };
+  }
+
+  async getSchedulerMetrics(): Promise<SchedulerMetrics> {
+    const [
+      totalJobs,
+      activeJobs,
+      pendingJobs,
+      runningJobs,
+      completedJobs,
+      failedJobs,
+      emergencyStoppedJobs,
+    ] = await Promise.all([
+      this.scheduledJobRepository.count(),
+      this.scheduledJobRepository.count({ where: { isActive: true } }),
+      this.scheduledJobRepository.count({
+        where: { status: JobStatus.PENDING },
+      }),
+      this.scheduledJobRepository.count({
+        where: { status: JobStatus.RUNNING },
+      }),
+      this.scheduledJobRepository.count({
+        where: { status: JobStatus.COMPLETED },
+      }),
+      this.scheduledJobRepository.count({
+        where: { status: JobStatus.FAILED },
+      }),
+      this.scheduledJobRepository.count({ where: { isEmergencyStop: true } }),
+    ]);
+
+    const jobsByType = await this.getJobsByType();
+    const jobsByPriority = await this.getJobsByPriority();
+
+    const avgExecutionTime = await this.calculateAverageExecutionTime();
+    const successRate = totalJobs > 0 ? (completedJobs / totalJobs) * 100 : 0;
+
+    return {
+      totalJobs,
+      activeJobs,
+      pendingJobs,
+      runningJobs,
+      completedJobs,
+      failedJobs,
+      avgExecutionTime,
+      successRate,
+      jobsByType,
+      jobsByPriority,
+      emergencyStoppedJobs,
+    };
+  }
+
+  @Cron(CronExpression.EVERY_MINUTE)
+  async processPendingJobs(): Promise<void> {
+    if (this.isEmergencyMode) {
+      return;
+    }
+
+    try {
+      const pendingJobs = await this.scheduledJobRepository.find({
+        where: {
+          status: JobStatus.PENDING,
+          isActive: true,
+          isEmergencyStop: false,
+          scheduledAt: LessThan(new Date()),
+        },
+        order: { priority: 'DESC', scheduledAt: 'ASC' },
+        take: 10, // Process up to 10 jobs per minute
+      });
+
+      for (const job of pendingJobs) {
+        if (await this.checkJobDependencies(job)) {
+          await this.executeJob(job.id);
+        }
+      }
+    } catch (error) {
+      this.logger.error('Error processing pending jobs', error);
+    }
+  }
+
+  @Cron(CronExpression.EVERY_5_MINUTES)
+  async cleanupExpiredJobs(): Promise<void> {
+    try {
+      const expiredJobs = await this.scheduledJobRepository.find({
+        where: {
+          status: JobStatus.PENDING,
+          scheduledAt: LessThan(new Date(Date.now() - 24 * 60 * 60 * 1000)), // 24 hours ago
+        },
+      });
+
+      for (const job of expiredJobs) {
+        job.status = JobStatus.FAILED;
+        job.error = {
+          message: 'Job expired',
+          timestamp: new Date(),
+          retryCount: job.retryCount,
+          maxRetries: job.maxRetries,
+        };
+
+        await this.scheduledJobRepository.save(job);
+      }
+
+      if (expiredJobs.length > 0) {
+        this.logger.log(`Cleaned up ${expiredJobs.length} expired jobs`);
+      }
+    } catch (error) {
+      this.logger.error('Error cleaning up expired jobs', error);
+    }
+  }
+
+  private async initializeSystemJobs(): Promise<void> {
+    this.logger.log('Initializing system jobs...');
+
+    const systemJobs = [
+      {
+        name: 'Market Open',
+        description: 'Daily market opening procedures',
+        type: JobType.MARKET_OPEN,
+        cronExpression: '0 30 8 * * 1-5', // 8:30 AM Mon-Fri
+        priority: JobPriority.HIGH,
+        marketHoursOnly: false,
+        isSystemJob: true,
+        parameters: { action: 'market_open' },
+      },
+      {
+        name: 'Market Close',
+        description: 'Daily market closing procedures',
+        type: JobType.MARKET_CLOSE,
+        cronExpression: '0 0 17 * * 1-5', // 5:00 PM Mon-Fri
+        priority: JobPriority.HIGH,
+        marketHoursOnly: false,
+        isSystemJob: true,
+        parameters: { action: 'market_close' },
+      },
+    ];
+
+    for (const jobConfig of systemJobs) {
+      const existingJob = await this.scheduledJobRepository.findOne({
+        where: { name: jobConfig.name, type: jobConfig.type },
+      });
+
+      if (!existingJob) {
+        const job = this.scheduledJobRepository.create({
+          ...jobConfig,
+          status: JobStatus.PENDING,
+          isActive: true,
+          scheduledAt: this.getNextRunTime(jobConfig.cronExpression),
+          retryStrategy: RetryStrategy.EXPONENTIAL_BACKOFF,
+          maxRetries: 2,
+          timeoutSeconds: 300,
+          scheduling: {
+            isActive: true,
+            isRecurring: true,
+          },
+          metrics: {
+            executionCount: 0,
+            successCount: 0,
+            failureCount: 0,
+            avgExecutionTime: 0,
+            minExecutionTime: 0,
+            maxExecutionTime: 0,
+            totalExecutionTime: 0,
+          },
+        });
+
+        await this.scheduledJobRepository.save(job);
+        this.logger.log(`System job initialized: ${jobConfig.name}`);
+      }
+    }
+  }
+
+  private async recoverPendingJobs(): Promise<void> {
+    this.logger.log('Recovering pending jobs...');
+
+    const runningJobs = await this.scheduledJobRepository.find({
+      where: { status: JobStatus.RUNNING },
+    });
+
+    for (const job of runningJobs) {
+      const timeSinceStart = Date.now() - job.startedAt.getTime();
+      const timeoutMs = job.timeoutSeconds * 1000;
+
+      if (timeSinceStart > timeoutMs) {
+        job.status = JobStatus.FAILED;
+        job.error = {
+          message: 'Job timeout during recovery',
+          timestamp: new Date(),
+          retryCount: job.retryCount,
+          maxRetries: job.maxRetries,
+        };
+
+        await this.scheduledJobRepository.save(job);
+        this.logger.warn(
+          `Job ${job.id} marked as failed due to timeout during recovery`,
+        );
+      }
+    }
+  }
+
+  private async checkJobDependencies(job: ScheduledJob): Promise<boolean> {
+    if (!job.dependencies?.jobIds || job.dependencies.jobIds.length === 0) {
+      return true;
+    }
+
+    const dependencyJobs = await this.scheduledJobRepository.find({
+      where: { id: In(job.dependencies.jobIds) },
+    });
+
+    for (const depJob of dependencyJobs) {
+      if (depJob.status !== JobStatus.COMPLETED) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  private async getJobsByType(): Promise<Record<JobType, number>> {
+    const result = {} as Record<JobType, number>;
+
+    for (const jobType of Object.values(JobType)) {
+      result[jobType] = await this.scheduledJobRepository.count({
+        where: { type: jobType },
+      });
+    }
+
+    return result;
+  }
+
+  private async getJobsByPriority(): Promise<Record<JobPriority, number>> {
+    const result = {} as Record<JobPriority, number>;
+
+    for (const priority of Object.values(JobPriority)) {
+      result[priority] = await this.scheduledJobRepository.count({
+        where: { priority },
+      });
+    }
+
+    return result;
+  }
+
+  private async calculateAverageExecutionTime(): Promise<number> {
+    const jobs = await this.scheduledJobRepository.find({
+      where: { status: JobStatus.COMPLETED },
+      select: ['metrics'],
+    });
+
+    if (jobs.length === 0) return 0;
+
+    const totalTime = jobs.reduce(
+      (sum, job) => sum + (job.metrics?.avgExecutionTime || 0),
+      0,
+    );
+    return totalTime / jobs.length;
+  }
+
+  private getNextRunTime(cronExpression: string): Date {
+    // This would use a cron parser to calculate the next run time
+    // For now, return 1 hour from now as a placeholder
+    return new Date(Date.now() + 60 * 60 * 1000);
+  }
+
+  async isMarketOpen(timeZone: string = 'UTC'): Promise<boolean> {
+    const now = new Date();
+
+    try {
+      const options: Intl.DateTimeFormatOptions = {
+        timeZone,
+        hour: '2-digit',
+        hour12: false,
+        weekday: 'long',
+      };
+
+      const dateTimeString = now.toLocaleString('en-US', options);
+      const [timeString, dayString] = dateTimeString.split(', ');
+      const currentHour = parseInt(timeString.split(':')[0]);
+      const isWeekday = !['Saturday', 'Sunday'].includes(dayString.trim());
+
+      return isWeekday && currentHour >= 9 && currentHour < 17;
+    } catch (error) {
+      this.logger.warn(
+        `Error checking market hours for timezone ${timeZone}`,
+        error,
+      );
+      return true;
+    }
+  }
+
+  async getMarketStatus(timeZone: string = 'UTC'): Promise<{
+    isOpen: boolean;
+    nextOpen: Date;
+    nextClose: Date;
+    currentSession: string;
+  }> {
+    const now = new Date();
+    const isOpen = await this.isMarketOpen(timeZone);
+
+    let nextOpen: Date;
+    let nextClose: Date;
+
+    if (isOpen) {
+      nextClose = new Date(now);
+      nextClose.setUTCHours(17, 0, 0, 0); // 5 PM UTC
+
+      nextOpen = new Date(now);
+      nextOpen.setDate(nextOpen.getDate() + 1);
+      nextOpen.setUTCHours(14, 0, 0, 0); // 9 AM EST next day
+    } else {
+      nextOpen = new Date(now);
+      nextOpen.setUTCHours(14, 0, 0, 0); // 9 AM EST today
+
+      if (nextOpen <= now) {
+        nextOpen.setDate(nextOpen.getDate() + 1);
+      }
+
+      nextClose = new Date(nextOpen);
+      nextClose.setUTCHours(17, 0, 0, 0);
+    }
+
+    return {
+      isOpen,
+      nextOpen,
+      nextClose,
+      currentSession: isOpen ? 'open' : 'closed',
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/services/index.html b/coverage/lcov-report/src/scheduler/services/index.html new file mode 100644 index 0000000..e82d011 --- /dev/null +++ b/coverage/lcov-report/src/scheduler/services/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/scheduler/services + + + + + + + + + +
+
+

All files src/scheduler/services

+
+ +
+ 0% + Statements + 0/527 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/527 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
market-hours.service.ts +
+
0%0/5270%0/10%0/10%0/527
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/scheduler/services/market-hours.service.ts.html b/coverage/lcov-report/src/scheduler/services/market-hours.service.ts.html new file mode 100644 index 0000000..c4729be --- /dev/null +++ b/coverage/lcov-report/src/scheduler/services/market-hours.service.ts.html @@ -0,0 +1,1666 @@ + + + + + + Code coverage report for src/scheduler/services/market-hours.service.ts + + + + + + + + + +
+
+

All files / src/scheduler/services market-hours.service.ts

+
+ +
+ 0% + Statements + 0/527 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/527 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+export interface MarketHours {
+  open: string; // HH:MM format
+  close: string; // HH:MM format
+  timezone: string;
+  weekdays: number[]; // 0 = Sunday, 6 = Saturday
+  holidays: string[]; // ISO date strings
+}
+
+export interface MarketStatus {
+  isOpen: boolean;
+  nextOpen: Date;
+  nextClose: Date;
+  currentSession: 'pre_market' | 'open' | 'after_hours' | 'closed';
+  timeUntilOpen: number; // minutes
+  timeUntilClose: number; // minutes
+  timeZone: string;
+}
+
+export interface Holiday {
+  date: string;
+  name: string;
+  type: 'market_holiday' | 'early_close';
+  earlyCloseTime?: string;
+}
+
+@Injectable()
+export class MarketHoursService {
+  private readonly logger = new Logger(MarketHoursService.name);
+
+  private readonly marketHours: Map<string, MarketHours> = new Map([
+    [
+      'US',
+      {
+        open: '09:30',
+        close: '16:00',
+        timezone: 'America/New_York',
+        weekdays: [1, 2, 3, 4, 5], // Monday-Friday
+        holidays: [
+          '2024-01-01', // New Year's Day
+          '2024-01-15', // Martin Luther King Jr. Day
+          '2024-02-19', // Presidents' Day
+          '2024-04-15', // Good Friday
+          '2024-05-27', // Memorial Day
+          '2024-07-04', // Independence Day
+          '2024-09-02', // Labor Day
+          '2024-11-28', // Thanksgiving Day
+          '2024-12-25', // Christmas Day
+        ],
+      },
+    ],
+    [
+      'EU',
+      {
+        open: '09:00',
+        close: '17:30',
+        timezone: 'Europe/London',
+        weekdays: [1, 2, 3, 4, 5],
+        holidays: [
+          '2024-01-01', // New Year's Day
+          '2024-04-01', // Easter Monday
+          '2024-05-01', // Labor Day
+          '2024-12-25', // Christmas Day
+          '2024-12-26', // Boxing Day
+        ],
+      },
+    ],
+    [
+      'ASIA',
+      {
+        open: '09:00',
+        close: '15:00',
+        timezone: 'Asia/Tokyo',
+        weekdays: [1, 2, 3, 4, 5],
+        holidays: [
+          '2024-01-01', // New Year's Day
+          '2024-01-02', // New Year's Holiday
+          '2024-02-11', // National Foundation Day
+          '2024-02-12', // Emperor's Birthday
+          '2024-03-20', // Spring Equinox
+          '2024-04-29', // Showa Day
+          '2024-05-03', // Constitution Memorial Day
+          '2024-05-04', // Greenery Day
+          '2024-05-05', // Children's Day
+          '2024-08-11', // Mountain Day
+          '2024-09-16', // Respect for the Aged Day
+          '2024-09-22', // Autumn Equinox
+          '2024-10-14', // Sports Day
+          '2024-11-03', // Culture Day
+          '2024-11-23', // Labor Thanksgiving Day
+        ],
+      },
+    ],
+  ]);
+
+  async getMarketStatus(market: string = 'US'): Promise<MarketStatus> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    const now = new Date();
+    const marketTime = this.convertToMarketTime(now, marketConfig.timezone);
+
+    const isOpen = this.isMarketOpen(marketTime, marketConfig);
+    const nextOpen = this.getNextMarketOpen(marketTime, marketConfig);
+    const nextClose = this.getNextMarketClose(marketTime, marketConfig);
+
+    const currentSession = this.getCurrentSession(marketTime, marketConfig);
+    const timeUntilOpen = this.getMinutesUntil(nextOpen, marketTime);
+    const timeUntilClose = this.getMinutesUntil(nextClose, marketTime);
+
+    return {
+      isOpen,
+      nextOpen,
+      nextClose,
+      currentSession,
+      timeUntilOpen,
+      timeUntilClose,
+      timeZone: marketConfig.timezone,
+    };
+  }
+
+  async isMarketOpen(market: string = 'US'): Promise<boolean> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    const now = new Date();
+    const marketTime = this.convertToMarketTime(now, marketConfig.timezone);
+
+    return this.isMarketOpen(marketTime, marketConfig);
+  }
+
+  async getNextMarketOpen(market: string = 'US'): Promise<Date> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    const now = new Date();
+    const marketTime = this.convertToMarketTime(now, marketConfig.timezone);
+
+    return this.getNextMarketOpen(marketTime, marketConfig);
+  }
+
+  async getNextMarketClose(market: string = 'US'): Promise<Date> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    const now = new Date();
+    const marketTime = this.convertToMarketTime(now, marketConfig.timezone);
+
+    return this.getNextMarketClose(marketTime, marketConfig);
+  }
+
+  async getMarketHours(market: string = 'US'): Promise<MarketHours> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    return marketConfig;
+  }
+
+  async getAllMarketStatuses(): Promise<Record<string, MarketStatus>> {
+    const statuses: Record<string, MarketStatus> = {};
+
+    for (const market of this.marketHours.keys()) {
+      try {
+        statuses[market] = await this.getMarketStatus(market);
+      } catch (error) {
+        this.logger.error(`Error getting status for market ${market}`, error);
+      }
+    }
+
+    return statuses;
+  }
+
+  async isGloballyOpen(): Promise<boolean> {
+    const statuses = await this.getAllMarketStatuses();
+    return Object.values(statuses).some((status) => status.isOpen);
+  }
+
+  async getActiveMarkets(): Promise<string[]> {
+    const statuses = await this.getAllMarketStatuses();
+    return Object.entries(statuses)
+      .filter(([_, status]) => status.isOpen)
+      .map(([market, _]) => market);
+  }
+
+  async validateExecutionTime(
+    market: string,
+    executionTime: Date,
+  ): Promise<{
+    valid: boolean;
+    reason?: string;
+    suggestedTime?: Date;
+  }> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      return { valid: false, reason: `Market ${market} not supported` };
+    }
+
+    const marketTime = this.convertToMarketTime(
+      executionTime,
+      marketConfig.timezone,
+    );
+
+    if (!this.isWeekday(marketTime, marketConfig.weekdays)) {
+      const nextOpen = this.getNextMarketOpen(marketTime, marketConfig);
+      return {
+        valid: false,
+        reason: 'Execution time is on a weekend',
+        suggestedTime: nextOpen,
+      };
+    }
+
+    if (this.isHoliday(marketTime, marketConfig.holidays)) {
+      const nextOpen = this.getNextMarketOpen(marketTime, marketConfig);
+      return {
+        valid: false,
+        reason: 'Execution time is on a market holiday',
+        suggestedTime: nextOpen,
+      };
+    }
+
+    const [openHour, openMinute] = marketConfig.open.split(':').map(Number);
+    const [closeHour, closeMinute] = marketConfig.close.split(':').map(Number);
+    const executionHour = marketTime.getHours();
+    const executionMinute = marketTime.getMinutes();
+
+    const executionMinutes = executionHour * 60 + executionMinute;
+    const openMinutes = openHour * 60 + openMinute;
+    const closeMinutes = closeHour * 60 + closeMinute;
+
+    if (executionMinutes < openMinutes) {
+      const suggestedTime = new Date(marketTime);
+      suggestedTime.setHours(openHour, openMinute, 0, 0);
+      return {
+        valid: false,
+        reason: 'Execution time is before market open',
+        suggestedTime,
+      };
+    }
+
+    if (executionMinutes > closeMinutes) {
+      const nextOpen = this.getNextMarketOpen(marketTime, marketConfig);
+      return {
+        valid: false,
+        reason: 'Execution time is after market close',
+        suggestedTime: nextOpen,
+      };
+    }
+
+    return { valid: true };
+  }
+
+  async adjustForMarketHours(
+    market: string,
+    executionTime: Date,
+  ): Promise<Date> {
+    const validation = await this.validateExecutionTime(market, executionTime);
+
+    if (validation.valid) {
+      return executionTime;
+    }
+
+    return validation.suggestedTime || executionTime;
+  }
+
+  private convertToMarketTime(date: Date, timeZone: string): Date {
+    try {
+      const options: Intl.DateTimeFormatOptions = {
+        timeZone,
+        year: 'numeric',
+        month: '2-digit',
+        day: '2-digit',
+        hour: '2-digit',
+        minute: '2-digit',
+        second: '2-digit',
+        hour12: false,
+      };
+
+      const formatter = new Intl.DateTimeFormat('en-US', options);
+      const parts = formatter.formatToParts(date);
+
+      const year = parseInt(
+        parts.find((part) => part.type === 'year')?.value || '0',
+      );
+      const month =
+        parseInt(parts.find((part) => part.type === 'month')?.value || '0') - 1;
+      const day = parseInt(
+        parts.find((part) => part.type === 'day')?.value || '0',
+      );
+      const hour = parseInt(
+        parts.find((part) => part.type === 'hour')?.value || '0',
+      );
+      const minute = parseInt(
+        parts.find((part) => part.type === 'minute')?.value || '0',
+      );
+      const second = parseInt(
+        parts.find((part) => part.type === 'second')?.value || '0',
+      );
+
+      return new Date(year, month, day, hour, minute, second);
+    } catch (error) {
+      this.logger.error(`Error converting time to timezone ${timeZone}`, error);
+      return date;
+    }
+  }
+
+  private isMarketOpen(marketTime: Date, config: MarketHours): boolean {
+    if (!this.isWeekday(marketTime, config.weekdays)) {
+      return false;
+    }
+
+    if (this.isHoliday(marketTime, config.holidays)) {
+      return false;
+    }
+
+    const [openHour, openMinute] = config.open.split(':').map(Number);
+    const [closeHour, closeMinute] = config.close.split(':').map(Number);
+
+    const currentMinutes = marketTime.getHours() * 60 + marketTime.getMinutes();
+    const openMinutes = openHour * 60 + openMinute;
+    const closeMinutes = closeHour * 60 + closeMinute;
+
+    return currentMinutes >= openMinutes && currentMinutes < closeMinutes;
+  }
+
+  private isWeekday(date: Date, weekdays: number[]): boolean {
+    const day = date.getDay();
+    return weekdays.includes(day);
+  }
+
+  private isHoliday(date: Date, holidays: string[]): boolean {
+    const dateString = date.toISOString().split('T')[0];
+    return holidays.includes(dateString);
+  }
+
+  private getCurrentSession(
+    marketTime: Date,
+    config: MarketHours,
+  ): 'pre_market' | 'open' | 'after_hours' | 'closed' {
+    if (
+      !this.isWeekday(marketTime, config.weekdays) ||
+      this.isHoliday(marketTime, config.holidays)
+    ) {
+      return 'closed';
+    }
+
+    const [openHour, openMinute] = config.open.split(':').map(Number);
+    const [closeHour, closeMinute] = config.close.split(':').map(Number);
+
+    const currentMinutes = marketTime.getHours() * 60 + marketTime.getMinutes();
+    const openMinutes = openHour * 60 + openMinute;
+    const closeMinutes = closeHour * 60 + closeMinute;
+
+    if (currentMinutes < openMinutes - 30) {
+      return 'pre_market';
+    } else if (currentMinutes >= openMinutes && currentMinutes < closeMinutes) {
+      return 'open';
+    } else if (
+      currentMinutes >= closeMinutes &&
+      currentMinutes < closeMinutes + 120
+    ) {
+      return 'after_hours';
+    } else {
+      return 'closed';
+    }
+  }
+
+  private getNextMarketOpen(marketTime: Date, config: MarketHours): Date {
+    const nextOpen = new Date(marketTime);
+
+    // Move to next day
+    nextOpen.setDate(nextOpen.getDate() + 1);
+
+    // Find next valid weekday
+    while (
+      !this.isWeekday(nextOpen, config.weekdays) ||
+      this.isHoliday(nextOpen, config.holidays)
+    ) {
+      nextOpen.setDate(nextOpen.getDate() + 1);
+    }
+
+    // Set market open time
+    const [openHour, openMinute] = config.open.split(':').map(Number);
+    nextOpen.setHours(openHour, openMinute, 0, 0);
+
+    return nextOpen;
+  }
+
+  private getNextMarketClose(marketTime: Date, config: MarketHours): Date {
+    const [closeHour, closeMinute] = config.close.split(':').map(Number);
+
+    let nextClose = new Date(marketTime);
+    nextClose.setHours(closeHour, closeMinute, 0, 0);
+
+    // If today's close time has passed, move to next trading day
+    if (
+      nextClose <= marketTime ||
+      !this.isWeekday(nextClose, config.weekdays) ||
+      this.isHoliday(nextClose, config.holidays)
+    ) {
+      nextClose = this.getNextMarketOpen(marketTime, config);
+      nextClose.setHours(closeHour, closeMinute, 0, 0);
+    }
+
+    return nextClose;
+  }
+
+  private getMinutesUntil(targetDate: Date, currentTime: Date): number {
+    return Math.floor(
+      (targetDate.getTime() - currentTime.getTime()) / (1000 * 60),
+    );
+  }
+
+  async addHoliday(market: string, holiday: Holiday): Promise<void> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    if (!marketConfig.holidays.includes(holiday.date)) {
+      marketConfig.holidays.push(holiday.date);
+      this.logger.log(
+        `Added holiday ${holiday.name} (${holiday.date}) to market ${market}`,
+      );
+    }
+  }
+
+  async removeHoliday(market: string, date: string): Promise<void> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    const index = marketConfig.holidays.indexOf(date);
+    if (index > -1) {
+      marketConfig.holidays.splice(index, 1);
+      this.logger.log(`Removed holiday ${date} from market ${market}`);
+    }
+  }
+
+  async getHolidays(market: string, year?: number): Promise<string[]> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    if (year) {
+      return marketConfig.holidays.filter((date) =>
+        date.startsWith(year.toString()),
+      );
+    }
+
+    return marketConfig.holidays;
+  }
+
+  async updateMarketHours(
+    market: string,
+    hours: Partial<MarketHours>,
+  ): Promise<void> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    Object.assign(marketConfig, hours);
+    this.logger.log(`Updated market hours for ${market}`);
+  }
+
+  async getTradingCalendar(
+    market: string,
+    year: number,
+  ): Promise<{
+    holidays: Holiday[];
+    earlyCloses: Holiday[];
+    regularSchedule: MarketHours;
+  }> {
+    const marketConfig = this.marketHours.get(market);
+    if (!marketConfig) {
+      throw new Error(`Market ${market} not supported`);
+    }
+
+    const holidays: Holiday[] = [];
+    const earlyCloses: Holiday[] = [];
+
+    for (const holidayDate of marketConfig.holidays) {
+      if (holidayDate.startsWith(year.toString())) {
+        holidays.push({
+          date: holidayDate,
+          name: this.getHolidayName(holidayDate),
+          type: 'market_holiday',
+        });
+      }
+    }
+
+    return {
+      holidays,
+      earlyCloses,
+      regularSchedule: marketConfig,
+    };
+  }
+
+  private getHolidayName(date: string): string {
+    const holidayNames: Record<string, string> = {
+      '2024-01-01': "New Year's Day",
+      '2024-01-15': 'Martin Luther King Jr. Day',
+      '2024-02-19': "Presidents' Day",
+      '2024-04-15': 'Good Friday',
+      '2024-05-27': 'Memorial Day',
+      '2024-07-04': 'Independence Day',
+      '2024-09-02': 'Labor Day',
+      '2024-11-28': 'Thanksgiving Day',
+      '2024-12-25': 'Christmas Day',
+    };
+
+    return holidayNames[date] || 'Holiday';
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/alerts/index.html b/coverage/lcov-report/src/security/alerts/index.html new file mode 100644 index 0000000..a426c02 --- /dev/null +++ b/coverage/lcov-report/src/security/alerts/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/security/alerts + + + + + + + + + +
+
+

All files src/security/alerts

+
+ +
+ 0% + Statements + 0/250 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/250 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
security-alert.service.ts +
+
0%0/2500%0/10%0/10%0/250
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/alerts/security-alert.service.ts.html b/coverage/lcov-report/src/security/alerts/security-alert.service.ts.html new file mode 100644 index 0000000..6972632 --- /dev/null +++ b/coverage/lcov-report/src/security/alerts/security-alert.service.ts.html @@ -0,0 +1,835 @@ + + + + + + Code coverage report for src/security/alerts/security-alert.service.ts + + + + + + + + + +
+
+

All files / src/security/alerts security-alert.service.ts

+
+ +
+ 0% + Statements + 0/250 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/250 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import {
+  SecurityEvent,
+  SeverityLevel,
+} from '../entities/security-event.entity';
+
+export interface AlertPayload {
+  eventId: string;
+  type: string;
+  severity: SeverityLevel;
+  description: string;
+  timestamp: Date;
+  metadata: any;
+  recipients: AlertRecipient[];
+}
+
+export interface AlertRecipient {
+  type: 'email' | 'webhook' | 'slack' | 'pagerduty';
+  address: string;
+}
+
+@Injectable()
+export class SecurityAlertService {
+  private readonly logger = new Logger(SecurityAlertService.name);
+
+  private alertQueue: AlertPayload[] = [];
+  private isProcessing = false;
+
+  async sendAlert(event: SecurityEvent): Promise<void> {
+    const payload: AlertPayload = {
+      eventId: event.id,
+      type: event.eventType,
+      severity: event.severity,
+      description: event.description,
+      timestamp: event.createdAt,
+      metadata: event.metadata,
+      recipients: await this.determineRecipients(event),
+    };
+
+    this.alertQueue.push(payload);
+    this.processQueue();
+  }
+
+  private async processQueue(): Promise<void> {
+    if (this.isProcessing || this.alertQueue.length === 0) return;
+
+    this.isProcessing = true;
+
+    while (this.alertQueue.length > 0) {
+      const alert = this.alertQueue.shift();
+      try {
+        await this.dispatchAlert(alert);
+      } catch (error) {
+        this.logger.error(`Failed to dispatch alert ${alert.eventId}`, error);
+        // Re-queue for retry
+        this.alertQueue.push(alert);
+      }
+    }
+
+    this.isProcessing = false;
+  }
+
+  private async dispatchAlert(alert: AlertPayload): Promise<void> {
+    this.logger.log(`Dispatching alert: ${alert.type} - ${alert.severity}`);
+
+    // Send to all configured recipients
+    for (const recipient of alert.recipients) {
+      try {
+        switch (recipient.type) {
+          case 'email':
+            await this.sendEmail(recipient.address, alert);
+            break;
+          case 'webhook':
+            await this.sendWebhook(recipient.address, alert);
+            break;
+          case 'slack':
+            await this.sendSlack(recipient.address, alert);
+            break;
+          case 'pagerduty':
+            await this.sendPagerDuty(recipient.address, alert);
+            break;
+        }
+      } catch (error) {
+        this.logger.error(`Failed to send to ${recipient.type}`, error);
+      }
+    }
+  }
+
+  private async determineRecipients(
+    event: SecurityEvent,
+  ): Promise<AlertRecipient[]> {
+    const recipients: AlertRecipient[] = [];
+
+    // Configure based on severity
+    if (event.severity === SeverityLevel.CRITICAL) {
+      recipients.push(
+        { type: 'pagerduty', address: process.env.PAGERDUTY_INTEGRATION_URL },
+        { type: 'slack', address: process.env.SLACK_CRITICAL_WEBHOOK_URL },
+      );
+    } else if (event.severity === SeverityLevel.HIGH) {
+      recipients.push(
+        { type: 'slack', address: process.env.SLACK_HIGH_WEBHOOK_URL },
+        { type: 'email', address: process.env.SECURITY_TEAM_EMAIL },
+      );
+    } else if (event.severity === SeverityLevel.MEDIUM) {
+      recipients.push({
+        type: 'email',
+        address: process.env.SECURITY_TEAM_EMAIL,
+      });
+    }
+
+    // Add webhooks for compliance monitoring
+    if (process.env.COMPLIANCE_WEBHOOK_URL) {
+      recipients.push({
+        type: 'webhook',
+        address: process.env.COMPLIANCE_WEBHOOK_URL,
+      });
+    }
+
+    return recipients.filter((r) => r.address);
+  }
+
+  private async sendEmail(address: string, alert: AlertPayload): Promise<void> {
+    this.logger.log(`Sending email alert to ${address}: ${alert.description}`);
+    // Implement actual email sending with SES/SendGrid/etc.
+  }
+
+  private async sendWebhook(url: string, alert: AlertPayload): Promise<void> {
+    this.logger.log(`Sending webhook alert to ${url}`);
+
+    const response = await fetch(url, {
+      method: 'POST',
+      headers: { 'Content-Type': 'application/json' },
+      body: JSON.stringify({
+        event: alert.type,
+        severity: alert.severity,
+        description: alert.description,
+        timestamp: alert.timestamp,
+        metadata: alert.metadata,
+      }),
+    });
+
+    if (!response.ok) {
+      throw new Error(`Webhook failed with status ${response.status}`);
+    }
+  }
+
+  private async sendSlack(
+    webhookUrl: string,
+    alert: AlertPayload,
+  ): Promise<void> {
+    this.logger.log(`Sending Slack alert`);
+
+    const color = this.getSeverityColor(alert.severity);
+
+    const response = await fetch(webhookUrl, {
+      method: 'POST',
+      headers: { 'Content-Type': 'application/json' },
+      body: JSON.stringify({
+        attachments: [
+          {
+            color,
+            title: `🚨 Security Alert: ${alert.type}`,
+            fields: [
+              {
+                title: 'Severity',
+                value: alert.severity.toUpperCase(),
+                short: true,
+              },
+              { title: 'Event ID', value: alert.eventId, short: true },
+              { title: 'Description', value: alert.description, short: false },
+              {
+                title: 'Time',
+                value: alert.timestamp.toISOString(),
+                short: true,
+              },
+            ],
+            footer: 'Security Monitoring System',
+            ts: Math.floor(alert.timestamp.getTime() / 1000),
+          },
+        ],
+      }),
+    });
+
+    if (!response.ok) {
+      throw new Error(`Slack webhook failed with status ${response.status}`);
+    }
+  }
+
+  private async sendPagerDuty(url: string, alert: AlertPayload): Promise<void> {
+    this.logger.log(`Sending PagerDuty alert`);
+
+    const response = await fetch(url, {
+      method: 'POST',
+      headers: { 'Content-Type': 'application/json' },
+      body: JSON.stringify({
+        routing_key: process.env.PAGERDUTY_ROUTING_KEY,
+        event_action: 'trigger',
+        dedup_key: alert.eventId,
+        payload: {
+          summary: alert.description,
+          severity: this.mapToPagerDutySeverity(alert.severity),
+          source: 'security-monitoring-system',
+          component: alert.type,
+          group: 'security',
+          class: alert.severity,
+          custom_details: alert.metadata,
+        },
+      }),
+    });
+
+    if (!response.ok) {
+      throw new Error(`PagerDuty failed with status ${response.status}`);
+    }
+  }
+
+  private getSeverityColor(severity: SeverityLevel): string {
+    switch (severity) {
+      case SeverityLevel.CRITICAL:
+        return 'danger';
+      case SeverityLevel.HIGH:
+        return 'warning';
+      case SeverityLevel.MEDIUM:
+        return '#ffcc00';
+      case SeverityLevel.LOW:
+        return 'good';
+    }
+  }
+
+  private mapToPagerDutySeverity(severity: SeverityLevel): string {
+    switch (severity) {
+      case SeverityLevel.CRITICAL:
+        return 'critical';
+      case SeverityLevel.HIGH:
+        return 'error';
+      case SeverityLevel.MEDIUM:
+        return 'warning';
+      case SeverityLevel.LOW:
+        return 'info';
+    }
+  }
+
+  async getPendingAlerts(): Promise<number> {
+    return this.alertQueue.length;
+  }
+
+  async clearQueue(): Promise<void> {
+    this.alertQueue = [];
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/ddos/ddos-protection.service.ts.html b/coverage/lcov-report/src/security/ddos/ddos-protection.service.ts.html new file mode 100644 index 0000000..4662e16 --- /dev/null +++ b/coverage/lcov-report/src/security/ddos/ddos-protection.service.ts.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for src/security/ddos/ddos-protection.service.ts + + + + + + + + + +
+
+

All files / src/security/ddos ddos-protection.service.ts

+
+ +
+ 0% + Statements + 0/40 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import {
+  ThrottlerOptionsFactory,
+  ThrottlerModuleOptions,
+} from '@nestjs/throttler';
+
+@Injectable()
+export class DdosProtectionService implements ThrottlerOptionsFactory {
+  private readonly logger = new Logger(DdosProtectionService.name);
+
+  createThrottlerOptions(): ThrottlerModuleOptions {
+    this.logger.log('Configuring DDoS protection via Throttler...');
+    return [
+      {
+        name: 'short',
+        ttl: 1000, // 1 second
+        limit: 10, // 10 requests per second
+      },
+      {
+        name: 'medium',
+        ttl: 10000, // 10 seconds
+        limit: 50, // 50 requests per 10 seconds
+      },
+      {
+        name: 'long',
+        ttl: 60000, // 1 minute
+        limit: 100, // 100 requests per minute
+      },
+    ];
+  }
+
+  /**
+   * Log blocked requests
+   */
+  logBlockedRequest(ip: string, reason: string) {
+    this.logger.warn(
+      `DDoS protection blocked request from IP: ${ip}. Reason: ${reason}`,
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/ddos/index.html b/coverage/lcov-report/src/security/ddos/index.html new file mode 100644 index 0000000..0124cf6 --- /dev/null +++ b/coverage/lcov-report/src/security/ddos/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/security/ddos + + + + + + + + + +
+
+

All files src/security/ddos

+
+ +
+ 0% + Statements + 0/40 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ddos-protection.service.ts +
+
0%0/400%0/10%0/10%0/40
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/detectors/anomaly.detector.ts.html b/coverage/lcov-report/src/security/detectors/anomaly.detector.ts.html new file mode 100644 index 0000000..f3dab24 --- /dev/null +++ b/coverage/lcov-report/src/security/detectors/anomaly.detector.ts.html @@ -0,0 +1,652 @@ + + + + + + Code coverage report for src/security/detectors/anomaly.detector.ts + + + + + + + + + +
+
+

All files / src/security/detectors anomaly.detector.ts

+
+ +
+ 0% + Statements + 0/189 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/189 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import {
+  SecurityEvent,
+  SeverityLevel,
+} from '../entities/security-event.entity';
+
+export interface AnomalyResult {
+  type: string;
+  severity: SeverityLevel;
+  confidence: number;
+  description: string;
+  metrics: any;
+}
+
+@Injectable()
+export class AnomalyDetectorService {
+  private readonly logger = new Logger(AnomalyDetectorService.name);
+
+  // Thresholds for anomaly detection
+  private readonly thresholds = {
+    volumeSpike: 3.0, // 3x normal volume
+    priceDeviation: 0.15, // 15% deviation
+    frequencySpike: 5.0, // 5x normal frequency
+    sizeOutlier: 2.5, // 2.5 standard deviations
+  };
+
+  async detectAnomalies(transactionData: any): Promise<AnomalyResult[]> {
+    const anomalies: AnomalyResult[] = [];
+
+    // Volume anomaly detection
+    const volumeAnomaly = await this.detectVolumeSpike(transactionData);
+    if (volumeAnomaly) {
+      anomalies.push(volumeAnomaly);
+    }
+
+    // Price anomaly detection
+    const priceAnomaly = await this.detectPriceDeviation(transactionData);
+    if (priceAnomaly) {
+      anomalies.push(priceAnomaly);
+    }
+
+    // Frequency anomaly detection
+    const frequencyAnomaly = await this.detectFrequencySpike(transactionData);
+    if (frequencyAnomaly) {
+      anomalies.push(frequencyAnomaly);
+    }
+
+    // Size outlier detection
+    const sizeAnomaly = await this.detectSizeOutlier(transactionData);
+    if (sizeAnomaly) {
+      anomalies.push(sizeAnomaly);
+    }
+
+    return anomalies;
+  }
+
+  private async detectVolumeSpike(
+    transactionData: any,
+  ): Promise<AnomalyResult | null> {
+    const { amount, walletAddress } = transactionData;
+
+    // Get historical average volume for this wallet
+    const avgVolume = await this.getHistoricalAverageVolume(walletAddress);
+    const ratio = amount / avgVolume;
+
+    if (ratio > this.thresholds.volumeSpike) {
+      return {
+        type: 'VOLUME_SPIKE',
+        severity:
+          ratio > this.thresholds.volumeSpike * 2
+            ? SeverityLevel.HIGH
+            : SeverityLevel.MEDIUM,
+        confidence: Math.min(ratio / this.thresholds.volumeSpike, 1),
+        description: `Transaction volume ${ratio.toFixed(2)}x higher than average`,
+        metrics: { currentAmount: amount, averageVolume: avgVolume, ratio },
+      };
+    }
+
+    return null;
+  }
+
+  private async detectPriceDeviation(
+    transactionData: any,
+  ): Promise<AnomalyResult | null> {
+    const { price, marketPrice } = transactionData;
+
+    if (!price || !marketPrice) return null;
+
+    const deviation = Math.abs(price - marketPrice) / marketPrice;
+
+    if (deviation > this.thresholds.priceDeviation) {
+      return {
+        type: 'PRICE_DEVIATION',
+        severity:
+          deviation > this.thresholds.priceDeviation * 2
+            ? SeverityLevel.HIGH
+            : SeverityLevel.MEDIUM,
+        confidence: Math.min(deviation / this.thresholds.priceDeviation, 1),
+        description: `Transaction price deviates ${deviation.toFixed(2)}% from market price`,
+        metrics: { transactionPrice: price, marketPrice, deviation },
+      };
+    }
+
+    return null;
+  }
+
+  private async detectFrequencySpike(
+    transactionData: any,
+  ): Promise<AnomalyResult | null> {
+    const { walletAddress, timestamp } = transactionData;
+
+    // Count transactions in last hour
+    const recentCount = await this.getRecentTransactionCount(
+      walletAddress,
+      timestamp,
+    );
+    const avgHourly = await this.getAverageHourlyTransactions(walletAddress);
+    const ratio = recentCount / avgHourly;
+
+    if (ratio > this.thresholds.frequencySpike) {
+      return {
+        type: 'FREQUENCY_SPIKE',
+        severity:
+          ratio > this.thresholds.frequencySpike * 2
+            ? SeverityLevel.CRITICAL
+            : SeverityLevel.HIGH,
+        confidence: Math.min(ratio / this.thresholds.frequencySpike, 1),
+        description: `Transaction frequency ${ratio.toFixed(2)}x higher than normal`,
+        metrics: { recentCount, averageHourly: avgHourly, ratio },
+      };
+    }
+
+    return null;
+  }
+
+  private async detectSizeOutlier(
+    transactionData: any,
+  ): Promise<AnomalyResult | null> {
+    const { amount, walletAddress } = transactionData;
+
+    const stats = await this.getTransactionSizeStats(walletAddress);
+    const zScore = Math.abs(amount - stats.mean) / stats.stdDev;
+
+    if (zScore > this.thresholds.sizeOutlier) {
+      return {
+        type: 'SIZE_OUTLIER',
+        severity:
+          zScore > this.thresholds.sizeOutlier * 2
+            ? SeverityLevel.HIGH
+            : SeverityLevel.MEDIUM,
+        confidence: Math.min(zScore / this.thresholds.sizeOutlier, 1),
+        description: `Transaction size is ${zScore.toFixed(2)} standard deviations from mean`,
+        metrics: { amount, mean: stats.mean, stdDev: stats.stdDev, zScore },
+      };
+    }
+
+    return null;
+  }
+
+  // Mock methods - in production these would query the database
+  private async getHistoricalAverageVolume(
+    walletAddress: string,
+  ): Promise<number> {
+    // Placeholder - implement actual DB query
+    return 1000;
+  }
+
+  private async getRecentTransactionCount(
+    walletAddress: string,
+    timestamp: Date,
+  ): Promise<number> {
+    // Placeholder - implement actual DB query
+    return 10;
+  }
+
+  private async getAverageHourlyTransactions(
+    walletAddress: string,
+  ): Promise<number> {
+    // Placeholder - implement actual DB query
+    return 2;
+  }
+
+  private async getTransactionSizeStats(
+    walletAddress: string,
+  ): Promise<{ mean: number; stdDev: number }> {
+    // Placeholder - implement actual DB query
+    return { mean: 1000, stdDev: 200 };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/detectors/fraud.detector.ts.html b/coverage/lcov-report/src/security/detectors/fraud.detector.ts.html new file mode 100644 index 0000000..f54e0fd --- /dev/null +++ b/coverage/lcov-report/src/security/detectors/fraud.detector.ts.html @@ -0,0 +1,847 @@ + + + + + + Code coverage report for src/security/detectors/fraud.detector.ts + + + + + + + + + +
+
+

All files / src/security/detectors fraud.detector.ts

+
+ +
+ 0% + Statements + 0/254 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/254 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import {
+  SecurityEvent,
+  SeverityLevel,
+} from '../entities/security-event.entity';
+
+export interface FraudAnalysisResult {
+  isSuspicious: boolean;
+  severity: SeverityLevel;
+  patterns: string[];
+  confidence: number;
+  riskScore: number;
+}
+
+export interface WashTradingResult {
+  isWashTrading: boolean;
+  confidence: number;
+  indicators: string[];
+  relatedTransactions: string[];
+}
+
+@Injectable()
+export class FraudDetectorService {
+  private readonly logger = new Logger(FraudDetectorService.name);
+
+  // Risk scoring weights
+  private readonly riskWeights = {
+    selfTrading: 0.4,
+    rapidReversal: 0.3,
+    circularTrading: 0.2,
+    suspiciousPatterns: 0.1,
+  };
+
+  async analyzeTransaction(transactionData: any): Promise<FraudAnalysisResult> {
+    const patterns: string[] = [];
+    let riskScore = 0;
+
+    // Check for self-trading
+    const selfTradingResult = await this.detectSelfTrading(transactionData);
+    if (selfTradingResult) {
+      patterns.push('SELF_TRADING');
+      riskScore += this.riskWeights.selfTrading;
+    }
+
+    // Check for rapid reversal
+    const rapidReversalResult = await this.detectRapidReversal(transactionData);
+    if (rapidReversalResult) {
+      patterns.push('RAPID_REVERSAL');
+      riskScore += this.riskWeights.rapidReversal;
+    }
+
+    // Check for circular trading
+    const circularResult = await this.detectCircularTrading(transactionData);
+    if (circularResult) {
+      patterns.push('CIRCULAR_TRADING');
+      riskScore += this.riskWeights.circularTrading;
+    }
+
+    // Check for other suspicious patterns
+    const suspiciousPatternResult =
+      await this.detectSuspiciousPatterns(transactionData);
+    if (suspiciousPatternResult) {
+      patterns.push('SUSPICIOUS_PATTERN');
+      riskScore += this.riskWeights.suspiciousPatterns;
+    }
+
+    const severity = this.calculateSeverity(riskScore);
+
+    return {
+      isSuspicious: riskScore > 0.3,
+      severity,
+      patterns,
+      confidence: riskScore,
+      riskScore,
+    };
+  }
+
+  async detectWashTrading(transactionData: any): Promise<WashTradingResult> {
+    const indicators: string[] = [];
+    const relatedTransactions: string[] = [];
+    let confidence = 0;
+
+    // Check for same buyer and seller
+    if (await this.isSameBeneficialOwner(transactionData)) {
+      indicators.push('SAME_BENEFICIAL_OWNER');
+      confidence += 0.3;
+    }
+
+    // Check for matching buy/sell orders
+    const matchResult = await this.checkMatchingOrders(transactionData);
+    if (matchResult) {
+      indicators.push('MATCHING_ORDERS');
+      confidence += 0.3;
+      relatedTransactions.push(...matchResult);
+    }
+
+    // Check for price manipulation patterns
+    const priceManipulation =
+      await this.detectPriceManipulation(transactionData);
+    if (priceManipulation) {
+      indicators.push('PRICE_MANIPULATION');
+      confidence += 0.2;
+    }
+
+    // Check for volume inflation
+    const volumeInflation = await this.detectVolumeInflation(transactionData);
+    if (volumeInflation) {
+      indicators.push('VOLUME_INFLATION');
+      confidence += 0.2;
+    }
+
+    return {
+      isWashTrading: confidence > 0.5,
+      confidence,
+      indicators,
+      relatedTransactions,
+    };
+  }
+
+  private async detectSelfTrading(transactionData: any): Promise<boolean> {
+    const { buyerId, sellerId, walletAddress } = transactionData;
+
+    // Check if buyer and seller are the same entity
+    if (buyerId === sellerId) {
+      return true;
+    }
+
+    // Check for wallets controlled by same user
+    const areRelated = await this.checkWalletRelationship(buyerId, sellerId);
+    return areRelated;
+  }
+
+  private async detectRapidReversal(transactionData: any): Promise<boolean> {
+    const { walletAddress, timestamp, amount } = transactionData;
+
+    // Look for opposite transactions within short time window (e.g., 5 minutes)
+    const reversalExists = await this.findOppositeTransaction(
+      walletAddress,
+      timestamp,
+      amount,
+      5 * 60 * 1000, // 5 minutes
+    );
+
+    return reversalExists;
+  }
+
+  private async detectCircularTrading(transactionData: any): Promise<boolean> {
+    const { participants } = transactionData;
+
+    // Detect circular trading patterns (A->B->C->A)
+    if (participants && participants.length >= 3) {
+      const hasCircularPattern = await this.checkCircularPattern(participants);
+      return hasCircularPattern;
+    }
+
+    return false;
+  }
+
+  private async detectSuspiciousPatterns(
+    transactionData: any,
+  ): Promise<boolean> {
+    // Check for structuring (breaking large transactions into smaller ones)
+    const structuringDetected = await this.detectStructuring(transactionData);
+    if (structuringDetected) return true;
+
+    // Check for unusual timing patterns
+    const unusualTiming = await this.detectUnusualTiming(transactionData);
+    if (unusualTiming) return true;
+
+    return false;
+  }
+
+  private async detectPriceManipulation(
+    transactionData: any,
+  ): Promise<boolean> {
+    const { price, marketPrice, recentPrices } = transactionData;
+
+    if (!recentPrices || recentPrices.length === 0) return false;
+
+    // Check for artificial price movements
+    const avgRecentPrice =
+      recentPrices.reduce((a, b) => a + b, 0) / recentPrices.length;
+    const deviation = Math.abs(price - avgRecentPrice) / avgRecentPrice;
+
+    return deviation > 0.2; // 20% deviation suggests manipulation
+  }
+
+  private async detectVolumeInflation(transactionData: any): Promise<boolean> {
+    const { amount, walletAddress } = transactionData;
+
+    // Check for unusually high volume compared to historical data
+    const avgVolume = await this.getHistoricalAverageVolume(walletAddress);
+    const ratio = amount / avgVolume;
+
+    return ratio > 10; // 10x normal volume suggests inflation
+  }
+
+  private calculateSeverity(riskScore: number): SeverityLevel {
+    if (riskScore >= 0.8) return SeverityLevel.CRITICAL;
+    if (riskScore >= 0.6) return SeverityLevel.HIGH;
+    if (riskScore >= 0.4) return SeverityLevel.MEDIUM;
+    return SeverityLevel.LOW;
+  }
+
+  // Helper methods - implement actual DB queries in production
+  private async checkWalletRelationship(
+    wallet1: string,
+    wallet2: string,
+  ): Promise<boolean> {
+    // Check if wallets are related through common ownership, IP, etc.
+    return false; // Placeholder
+  }
+
+  private async findOppositeTransaction(
+    wallet: string,
+    timestamp: Date,
+    amount: number,
+    windowMs: number,
+  ): Promise<boolean> {
+    // Search for opposite transaction within time window
+    return false; // Placeholder
+  }
+
+  private async checkCircularPattern(participants: string[]): Promise<boolean> {
+    // Analyze trading pattern for circular behavior
+    return false; // Placeholder
+  }
+
+  private async detectStructuring(transactionData: any): Promise<boolean> {
+    // Detect multiple transactions just below reporting thresholds
+    return false; // Placeholder
+  }
+
+  private async detectUnusualTiming(transactionData: any): Promise<boolean> {
+    // Check for transactions at unusual hours or frequencies
+    return false; // Placeholder
+  }
+
+  private async checkMatchingOrders(transactionData: any): Promise<string[]> {
+    // Find matching buy/sell orders
+    return []; // Placeholder
+  }
+
+  private async isSameBeneficialOwner(transactionData: any): Promise<boolean> {
+    // Check ultimate beneficial ownership
+    return false; // Placeholder
+  }
+
+  private async getHistoricalAverageVolume(
+    walletAddress: string,
+  ): Promise<number> {
+    return 1000; // Placeholder
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/detectors/index.html b/coverage/lcov-report/src/security/detectors/index.html new file mode 100644 index 0000000..d313824 --- /dev/null +++ b/coverage/lcov-report/src/security/detectors/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/security/detectors + + + + + + + + + +
+
+

All files src/security/detectors

+
+ +
+ 0% + Statements + 0/443 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/443 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
anomaly.detector.ts +
+
0%0/1890%0/10%0/10%0/189
fraud.detector.ts +
+
0%0/2540%0/10%0/10%0/254
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/entities/index.html b/coverage/lcov-report/src/security/entities/index.html new file mode 100644 index 0000000..a6be8b2 --- /dev/null +++ b/coverage/lcov-report/src/security/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/security/entities + + + + + + + + + +
+
+

All files src/security/entities

+
+ +
+ 0% + Statements + 0/76 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/76 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
security-event.entity.ts +
+
0%0/760%0/10%0/10%0/76
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/entities/security-event.entity.ts.html b/coverage/lcov-report/src/security/entities/security-event.entity.ts.html new file mode 100644 index 0000000..7d66c3b --- /dev/null +++ b/coverage/lcov-report/src/security/entities/security-event.entity.ts.html @@ -0,0 +1,313 @@ + + + + + + Code coverage report for src/security/entities/security-event.entity.ts + + + + + + + + + +
+
+

All files / src/security/entities security-event.entity.ts

+
+ +
+ 0% + Statements + 0/76 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/76 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  Index,
+} from 'typeorm';
+
+export enum SecurityEventType {
+  ANOMALY_DETECTED = 'anomaly_detected',
+  FRAUD_SUSPECTED = 'fraud_suspected',
+  SUSPICIOUS_TRANSACTION = 'suspicious_transaction',
+  WASH_TRADING = 'wash_trading',
+  COMPLIANCE_VIOLATION = 'compliance_violation',
+  INCIDENT_CREATED = 'incident_created',
+  ALERT_TRIGGERED = 'alert_triggered',
+}
+
+export enum SeverityLevel {
+  LOW = 'low',
+  MEDIUM = 'medium',
+  HIGH = 'high',
+  CRITICAL = 'critical',
+}
+
+@Entity('security_events')
+export class SecurityEvent {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'enum', enum: SecurityEventType })
+  @Index()
+  eventType: SecurityEventType;
+
+  @Column({ type: 'enum', enum: SeverityLevel, default: SeverityLevel.MEDIUM })
+  @Index()
+  severity: SeverityLevel;
+
+  @Column('text')
+  description: string;
+
+  @Column('jsonb')
+  metadata: any;
+
+  @Column({ nullable: true })
+  @Index()
+  walletAddress?: string;
+
+  @Column({ nullable: true })
+  @Index()
+  transactionHash?: string;
+
+  @Column({ default: false })
+  isResolved: boolean;
+
+  @Column({ nullable: true })
+  resolvedAt?: Date;
+
+  @Column({ nullable: true })
+  resolvedBy?: string;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @Column({ default: 0 })
+  falsePositiveCount: number;
+
+  @Column({ default: 0 })
+  truePositiveCount: number;
+
+  getConfidenceScore(): number {
+    const total = this.falsePositiveCount + this.truePositiveCount;
+    if (total === 0) return 0.5; // Default confidence
+    return this.truePositiveCount / total;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/headers/index.html b/coverage/lcov-report/src/security/headers/index.html new file mode 100644 index 0000000..59aadfb --- /dev/null +++ b/coverage/lcov-report/src/security/headers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/security/headers + + + + + + + + + +
+
+

All files src/security/headers

+
+ +
+ 0% + Statements + 0/46 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
security-headers.service.ts +
+
0%0/460%0/10%0/10%0/46
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/headers/security-headers.service.ts.html b/coverage/lcov-report/src/security/headers/security-headers.service.ts.html new file mode 100644 index 0000000..c462b6e --- /dev/null +++ b/coverage/lcov-report/src/security/headers/security-headers.service.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/security/headers/security-headers.service.ts + + + + + + + + + +
+
+

All files / src/security/headers security-headers.service.ts

+
+ +
+ 0% + Statements + 0/46 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import helmet from 'helmet';
+
+@Injectable()
+export class SecurityHeadersService {
+  private readonly logger = new Logger(SecurityHeadersService.name);
+
+  getHelmetMiddleware() {
+    this.logger.log('Configuring security headers via Helmet...');
+    return helmet({
+      contentSecurityPolicy: {
+        directives: {
+          defaultSrc: ["'self'"],
+          scriptSrc: ["'self'", "'unsafe-inline'", 'https://cdn.jsdelivr.net'], // Example extra sources
+          styleSrc: [
+            "'self'",
+            "'unsafe-inline'",
+            'https://fonts.googleapis.com',
+          ],
+          imgSrc: ["'self'", 'data:', 'https://images.unsplash.com'],
+          connectSrc: ["'self'"],
+          fontSrc: ["'self'", 'https://fonts.gstatic.com'],
+          objectSrc: ["'none'"],
+          mediaSrc: ["'self'"],
+          frameSrc: ["'none'"],
+          upgradeInsecureRequests: [],
+        },
+      },
+      crossOriginEmbedderPolicy: true,
+      crossOriginOpenerPolicy: true,
+      crossOriginResourcePolicy: { policy: 'same-origin' },
+      dnsPrefetchControl: { allow: false },
+      frameguard: { action: 'deny' },
+      hidePoweredBy: true,
+      hsts: {
+        maxAge: 31536000,
+        includeSubDomains: true,
+        preload: true,
+      },
+      ieNoOpen: true,
+      noSniff: true,
+      referrerPolicy: { policy: 'no-referrer' },
+      xssFilter: true,
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/index.html b/coverage/lcov-report/src/security/index.html new file mode 100644 index 0000000..5b23bd9 --- /dev/null +++ b/coverage/lcov-report/src/security/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/security + + + + + + + + + +
+
+

All files src/security

+
+ +
+ 0% + Statements + 0/156 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/156 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
security.controller.ts +
+
0%0/1050%0/10%0/10%0/105
security.module.ts +
+
0%0/510%0/10%0/10%0/51
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/middleware/index.html b/coverage/lcov-report/src/security/middleware/index.html new file mode 100644 index 0000000..42a41f5 --- /dev/null +++ b/coverage/lcov-report/src/security/middleware/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/security/middleware + + + + + + + + + +
+
+

All files src/security/middleware

+
+ +
+ 0% + Statements + 0/69 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
security.middleware.ts +
+
0%0/690%0/10%0/10%0/69
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/middleware/security.middleware.ts.html b/coverage/lcov-report/src/security/middleware/security.middleware.ts.html new file mode 100644 index 0000000..e543d55 --- /dev/null +++ b/coverage/lcov-report/src/security/middleware/security.middleware.ts.html @@ -0,0 +1,292 @@ + + + + + + Code coverage report for src/security/middleware/security.middleware.ts + + + + + + + + + +
+
+

All files / src/security/middleware security.middleware.ts

+
+ +
+ 0% + Statements + 0/69 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Injectable,
+  NestMiddleware,
+  Logger,
+  ForbiddenException,
+} from '@nestjs/common';
+import { Request, Response, NextFunction } from 'express';
+import { WafService } from '../waf/waf.service';
+import { SecurityMonitorService } from '../monitoring/security-monitor.service';
+import hpp from 'hpp';
+
+@Injectable()
+export class SecurityMiddleware implements NestMiddleware {
+  private readonly logger = new Logger(SecurityMiddleware.name);
+  private hppMiddleware = hpp();
+
+  constructor(
+    private readonly wafService: WafService,
+    private readonly monitor: SecurityMonitorService,
+  ) {}
+
+  use(req: Request, res: Response, next: NextFunction) {
+    const { method, url, body, query, ip } = req;
+
+    // 1. Parameter Pollution Protection (HPP)
+    this.hppMiddleware(req, res, () => {
+      // 2. WAF Pattern Check
+      const wafResult = this.wafService.isRequestSafe(url, body, query);
+      if (!wafResult.safe) {
+        this.monitor.logSecurityEvent({
+          type: 'WAF_BLOCK',
+          ip: ip || 'Unknown',
+          method,
+          url,
+          reason: wafResult.reason,
+        });
+
+        this.logger.warn(
+          `WAF Blocking malicious request: ${method} ${url} by ${ip}. Reason: ${wafResult.reason}`,
+        );
+        throw new ForbiddenException(
+          wafResult.reason || 'Malicious request blocked by WAF',
+        );
+      }
+
+      // 3. Simple CSRF check for state-changing operations
+      if (['POST', 'PUT', 'DELETE', 'PATCH'].includes(method)) {
+        const origin = req.get('origin') || req.get('referer');
+        if (origin && !origin.includes(req.get('host') || '')) {
+          this.monitor.logSecurityEvent({
+            type: 'CSRF_ATTEMPT',
+            ip: ip || 'Unknown',
+            method,
+            url,
+            reason:
+              'Potential CSRF attempt detected via origin/referer mismatch',
+          });
+
+          this.logger.warn(
+            `CSRF protection blocking request: origin mismatch ${origin}`,
+          );
+          throw new ForbiddenException('CSRF attempt detected');
+        }
+      }
+
+      next();
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/monitoring/index.html b/coverage/lcov-report/src/security/monitoring/index.html new file mode 100644 index 0000000..a93f188 --- /dev/null +++ b/coverage/lcov-report/src/security/monitoring/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/security/monitoring + + + + + + + + + +
+
+

All files src/security/monitoring

+
+ +
+ 0% + Statements + 0/193 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/193 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
security-monitor.service.ts +
+
0%0/1930%0/10%0/10%0/193
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/monitoring/security-monitor.service.ts.html b/coverage/lcov-report/src/security/monitoring/security-monitor.service.ts.html new file mode 100644 index 0000000..7b3cc1f --- /dev/null +++ b/coverage/lcov-report/src/security/monitoring/security-monitor.service.ts.html @@ -0,0 +1,664 @@ + + + + + + Code coverage report for src/security/monitoring/security-monitor.service.ts + + + + + + + + + +
+
+

All files / src/security/monitoring security-monitor.service.ts

+
+ +
+ 0% + Statements + 0/193 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/193 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, Between } from 'typeorm';
+import {
+  SecurityEvent,
+  SecurityEventType,
+  SeverityLevel,
+} from '../entities/security-event.entity';
+import { AnomalyDetectorService } from '../detectors/anomaly.detector';
+import { FraudDetectorService } from '../detectors/fraud.detector';
+
+@Injectable()
+export class SecurityMonitorService {
+  private readonly logger = new Logger(SecurityMonitorService.name);
+
+  constructor(
+    @InjectRepository(SecurityEvent)
+    private readonly securityEventRepo: Repository<SecurityEvent>,
+    private readonly anomalyDetector: AnomalyDetectorService,
+    private readonly fraudDetector: FraudDetectorService,
+  ) {}
+
+  async monitorTransaction(transactionData: any): Promise<void> {
+    try {
+      // Check for anomalies
+      const anomalies =
+        await this.anomalyDetector.detectAnomalies(transactionData);
+      if (anomalies.length > 0) {
+        await this.createSecurityEvent({
+          eventType: SecurityEventType.ANOMALY_DETECTED,
+          severity: anomalies[0].severity,
+          description: `Anomaly detected: ${anomalies[0].type}`,
+          metadata: { anomalies, transactionData },
+          walletAddress: transactionData.walletAddress,
+          transactionHash: transactionData.hash,
+        });
+      }
+
+      // Check for fraud patterns
+      const fraudIndicators =
+        await this.fraudDetector.analyzeTransaction(transactionData);
+      if (fraudIndicators.isSuspicious) {
+        await this.createSecurityEvent({
+          eventType: SecurityEventType.FRAUD_SUSPECTED,
+          severity: fraudIndicators.severity,
+          description: `Fraud pattern detected: ${fraudIndicators.patterns.join(', ')}`,
+          metadata: { fraudIndicators, transactionData },
+          walletAddress: transactionData.walletAddress,
+          transactionHash: transactionData.hash,
+        });
+      }
+
+      // Check for wash trading
+      const washTradingResult =
+        await this.fraudDetector.detectWashTrading(transactionData);
+      if (washTradingResult.isWashTrading) {
+        await this.createSecurityEvent({
+          eventType: SecurityEventType.WASH_TRADING,
+          severity: SeverityLevel.HIGH,
+          description: 'Potential wash trading detected',
+          metadata: { washTradingResult, transactionData },
+          walletAddress: transactionData.walletAddress,
+          transactionHash: transactionData.hash,
+        });
+      }
+    } catch (error) {
+      this.logger.error('Error monitoring transaction', error);
+    }
+  }
+
+  async createSecurityEvent(
+    eventData: Partial<SecurityEvent>,
+  ): Promise<SecurityEvent> {
+    const event = this.securityEventRepo.create(eventData);
+    const saved = await this.securityEventRepo.save(event);
+
+    this.logger.log(
+      `Security event created: ${eventData.eventType} - ${eventData.description}`,
+    );
+
+    // Trigger alerts for high/critical severity
+    if (
+      [SeverityLevel.HIGH, SeverityLevel.CRITICAL].includes(eventData.severity)
+    ) {
+      await this.triggerAlert(saved);
+    }
+
+    return saved;
+  }
+
+  async triggerAlert(event: SecurityEvent): Promise<void> {
+    // This will be handled by the SecurityAlertService
+    this.logger.warn(
+      `ALERT TRIGGERED: ${event.eventType} - ${event.description}`,
+    );
+    // In production, this would send to notification systems, webhooks, etc.
+  }
+
+  async getRecentEvents(limit: number = 50): Promise<SecurityEvent[]> {
+    return this.securityEventRepo.find({
+      order: { createdAt: 'DESC' },
+      take: limit,
+    });
+  }
+
+  async getUnresolvedEvents(): Promise<SecurityEvent[]> {
+    return this.securityEventRepo.find({
+      where: { isResolved: false },
+      order: { createdAt: 'DESC' },
+    });
+  }
+
+  async resolveEvent(
+    eventId: string,
+    resolvedBy: string,
+  ): Promise<SecurityEvent> {
+    const event = await this.securityEventRepo.findOne({
+      where: { id: eventId },
+    });
+    if (!event) {
+      throw new Error('Security event not found');
+    }
+
+    event.isResolved = true;
+    event.resolvedAt = new Date();
+    event.resolvedBy = resolvedBy;
+
+    return this.securityEventRepo.save(event);
+  }
+
+  async markAsFalsePositive(eventId: string): Promise<void> {
+    const event = await this.securityEventRepo.findOne({
+      where: { id: eventId },
+    });
+    if (event) {
+      event.falsePositiveCount += 1;
+      await this.securityEventRepo.save(event);
+    }
+  }
+
+  async markAsTruePositive(eventId: string): Promise<void> {
+    const event = await this.securityEventRepo.findOne({
+      where: { id: eventId },
+    });
+    if (event) {
+      event.truePositiveCount += 1;
+      await this.securityEventRepo.save(event);
+    }
+  }
+
+  async getSecurityMetrics(timeRange: {
+    start: Date;
+    end: Date;
+  }): Promise<any> {
+    const queryBuilder = this.securityEventRepo.createQueryBuilder('event');
+    queryBuilder.where('event.createdAt BETWEEN :start AND :end', {
+      start: timeRange.start,
+      end: timeRange.end,
+    });
+
+    const events = await queryBuilder.getMany();
+
+    return {
+      totalEvents: events.length,
+      byType: this.groupByEventType(events),
+      bySeverity: this.groupBySeverity(events),
+      unresolvedCount: events.filter((e) => !e.isResolved).length,
+      averageConfidenceScore:
+        events.reduce((acc, e) => acc + e.getConfidenceScore(), 0) /
+          events.length || 0,
+    };
+  }
+
+  private groupByEventType(events: SecurityEvent[]): Record<string, number> {
+    return events.reduce(
+      (acc, event) => {
+        acc[event.eventType] = (acc[event.eventType] || 0) + 1;
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+  }
+
+  private groupBySeverity(events: SecurityEvent[]): Record<string, number> {
+    return events.reduce(
+      (acc, event) => {
+        acc[event.severity] = (acc[event.severity] || 0) + 1;
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/response/incident-response.service.ts.html b/coverage/lcov-report/src/security/response/incident-response.service.ts.html new file mode 100644 index 0000000..02ea6ad --- /dev/null +++ b/coverage/lcov-report/src/security/response/incident-response.service.ts.html @@ -0,0 +1,1015 @@ + + + + + + Code coverage report for src/security/response/incident-response.service.ts + + + + + + + + + +
+
+

All files / src/security/response incident-response.service.ts

+
+ +
+ 0% + Statements + 0/310 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/310 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import {
+  SecurityEvent,
+  SecurityEventType,
+  SeverityLevel,
+} from '../entities/security-event.entity';
+import { SecurityMonitorService } from '../monitoring/security-monitor.service';
+
+export interface IncidentResponse {
+  incidentId: string;
+  status: 'investigating' | 'contained' | 'resolved' | 'escalated';
+  actions: IncidentAction[];
+  timeline: IncidentTimelineEntry[];
+}
+
+export interface IncidentAction {
+  type: string;
+  description: string;
+  automated: boolean;
+  timestamp: Date;
+  result?: any;
+}
+
+export interface IncidentTimelineEntry {
+  timestamp: Date;
+  event: string;
+  details: any;
+}
+
+@Injectable()
+export class IncidentResponseService {
+  private readonly logger = new Logger(IncidentResponseService.name);
+
+  constructor(private readonly securityMonitor: SecurityMonitorService) {}
+
+  async createIncidentFromEvent(
+    event: SecurityEvent,
+  ): Promise<IncidentResponse> {
+    this.logger.log(`Creating incident from security event: ${event.id}`);
+
+    const response: IncidentResponse = {
+      incidentId: `INC-${event.id}`,
+      status: 'investigating',
+      actions: [],
+      timeline: [
+        {
+          timestamp: new Date(),
+          event: 'INCIDENT_CREATED',
+          details: {
+            eventId: event.id,
+            eventType: event.eventType,
+            severity: event.severity,
+          },
+        },
+      ],
+    };
+
+    // Execute automated response based on severity and type
+    await this.executeAutomatedResponse(response, event);
+
+    return response;
+  }
+
+  private async executeAutomatedResponse(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    // Critical incidents - immediate containment
+    if (event.severity === SeverityLevel.CRITICAL) {
+      await this.executeContainmentActions(incident, event);
+    }
+
+    // Type-specific responses
+    switch (event.eventType) {
+      case SecurityEventType.WASH_TRADING:
+        await this.handleWashTrading(incident, event);
+        break;
+      case SecurityEventType.FRAUD_SUSPECTED:
+        await this.handleFraud(incident, event);
+        break;
+      case SecurityEventType.ANOMALY_DETECTED:
+        await this.handleAnomaly(incident, event);
+        break;
+      case SecurityEventType.COMPLIANCE_VIOLATION:
+        await this.handleComplianceViolation(incident, event);
+        break;
+    }
+
+    // Update incident status
+    if (incident.actions.some((a) => a.type === 'CONTAINMENT')) {
+      incident.status = 'contained';
+    }
+  }
+
+  private async executeContainmentActions(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    this.logger.log('Executing containment actions for critical incident');
+
+    // Suspend suspicious wallet
+    if (event.walletAddress) {
+      const suspendResult = await this.suspendWallet(event.walletAddress);
+      incident.actions.push({
+        type: 'CONTAINMENT',
+        description: `Suspended wallet ${event.walletAddress}`,
+        automated: true,
+        timestamp: new Date(),
+        result: suspendResult,
+      });
+    }
+
+    // Freeze related transactions
+    if (event.transactionHash) {
+      const freezeResult = await this.freezeTransaction(event.transactionHash);
+      incident.actions.push({
+        type: 'CONTAINMENT',
+        description: `Froze transaction ${event.transactionHash}`,
+        automated: true,
+        timestamp: new Date(),
+        result: freezeResult,
+      });
+    }
+
+    // Notify incident response team
+    await this.notifyIncidentTeam(incident, event);
+  }
+
+  private async handleWashTrading(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    this.logger.log('Handling wash trading incident');
+
+    // Flag related accounts for investigation
+    incident.actions.push({
+      type: 'INVESTIGATION',
+      description: 'Flagged related accounts for wash trading investigation',
+      automated: true,
+      timestamp: new Date(),
+    });
+
+    // Collect evidence
+    const evidence = await this.collectWashTradingEvidence(event);
+    incident.actions.push({
+      type: 'EVIDENCE_COLLECTION',
+      description: 'Collected wash trading evidence',
+      automated: true,
+      timestamp: new Date(),
+      result: evidence,
+    });
+
+    // Generate compliance report
+    await this.generateComplianceReport(incident, event);
+  }
+
+  private async handleFraud(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    this.logger.log('Handling fraud incident');
+
+    // Enhanced monitoring on related wallets
+    incident.actions.push({
+      type: 'ENHANCED_MONITORING',
+      description: 'Enabled enhanced monitoring on related wallets',
+      automated: true,
+      timestamp: new Date(),
+    });
+
+    // Risk assessment
+    const riskAssessment = await this.assessFraudRisk(event);
+    incident.actions.push({
+      type: 'RISK_ASSESSMENT',
+      description: 'Completed fraud risk assessment',
+      automated: true,
+      timestamp: new Date(),
+      result: riskAssessment,
+    });
+  }
+
+  private async handleAnomaly(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    this.logger.log('Handling anomaly incident');
+
+    // Baseline analysis
+    const baselineAnalysis = await this.analyzeDeviationFromBaseline(event);
+    incident.actions.push({
+      type: 'BASELINE_ANALYSIS',
+      description: 'Analyzed deviation from normal behavior',
+      automated: true,
+      timestamp: new Date(),
+      result: baselineAnalysis,
+    });
+
+    // Pattern correlation
+    const correlationResult = await this.correlateWithKnownPatterns(event);
+    incident.actions.push({
+      type: 'PATTERN_CORRELATION',
+      description: 'Correlated with known attack patterns',
+      automated: true,
+      timestamp: new Date(),
+      result: correlationResult,
+    });
+  }
+
+  private async handleComplianceViolation(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    this.logger.log('Handling compliance violation');
+
+    // Regulatory notification preparation
+    incident.actions.push({
+      type: 'REGULATORY_PREP',
+      description: 'Prepared regulatory notification documentation',
+      automated: true,
+      timestamp: new Date(),
+    });
+
+    // Compliance officer alert
+    await this.alertComplianceOfficer(incident, event);
+  }
+
+  private async notifyIncidentTeam(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    incident.timeline.push({
+      timestamp: new Date(),
+      event: 'INCIDENT_TEAM_NOTIFIED',
+      details: { incidentId: incident.incidentId, severity: event.severity },
+    });
+  }
+
+  private async generateComplianceReport(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    incident.timeline.push({
+      timestamp: new Date(),
+      event: 'COMPLIANCE_REPORT_GENERATED',
+      details: { incidentId: incident.incidentId, type: event.eventType },
+    });
+  }
+
+  // Helper methods - implement actual business logic
+  private async suspendWallet(walletAddress: string): Promise<any> {
+    this.logger.log(`Suspending wallet: ${walletAddress}`);
+    // Implement actual wallet suspension logic
+    return { success: true, walletAddress };
+  }
+
+  private async freezeTransaction(transactionHash: string): Promise<any> {
+    this.logger.log(`Freezing transaction: ${transactionHash}`);
+    // Implement actual transaction freeze logic
+    return { success: true, transactionHash };
+  }
+
+  private async collectWashTradingEvidence(event: SecurityEvent): Promise<any> {
+    // Collect trading history, related accounts, timestamps, etc.
+    return { eventId: event.id, evidenceCollected: true };
+  }
+
+  private async assessFraudRisk(event: SecurityEvent): Promise<any> {
+    // Calculate fraud risk score
+    return { riskScore: 0.75, factors: ['pattern_match', 'velocity'] };
+  }
+
+  private async analyzeDeviationFromBaseline(
+    event: SecurityEvent,
+  ): Promise<any> {
+    // Analyze how much current behavior deviates from baseline
+    return { deviationScore: 2.5, baselineMetrics: {} };
+  }
+
+  private async correlateWithKnownPatterns(event: SecurityEvent): Promise<any> {
+    // Match against known attack patterns
+    return { matchedPatterns: [], confidence: 0 };
+  }
+
+  private async alertComplianceOfficer(
+    incident: IncidentResponse,
+    event: SecurityEvent,
+  ): Promise<void> {
+    incident.timeline.push({
+      timestamp: new Date(),
+      event: 'COMPLIANCE_OFFICER_ALERTED',
+      details: { incidentId: incident.incidentId },
+    });
+  }
+
+  async updateIncidentStatus(
+    incidentId: string,
+    status: IncidentResponse['status'],
+  ): Promise<void> {
+    this.logger.log(`Updating incident ${incidentId} status to ${status}`);
+    // Implement status update logic
+  }
+
+  async addManualAction(
+    incidentId: string,
+    action: Omit<IncidentAction, 'timestamp'>,
+  ): Promise<void> {
+    this.logger.log(`Adding manual action to incident ${incidentId}`);
+    // Implement manual action addition
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/response/index.html b/coverage/lcov-report/src/security/response/index.html new file mode 100644 index 0000000..d533c3a --- /dev/null +++ b/coverage/lcov-report/src/security/response/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/security/response + + + + + + + + + +
+
+

All files src/security/response

+
+ +
+ 0% + Statements + 0/310 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/310 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
incident-response.service.ts +
+
0%0/3100%0/10%0/10%0/310
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/security.controller.ts.html b/coverage/lcov-report/src/security/security.controller.ts.html new file mode 100644 index 0000000..df4593f --- /dev/null +++ b/coverage/lcov-report/src/security/security.controller.ts.html @@ -0,0 +1,400 @@ + + + + + + Code coverage report for src/security/security.controller.ts + + + + + + + + + +
+
+

All files / src/security security.controller.ts

+
+ +
+ 0% + Statements + 0/105 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/105 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Controller,
+  Get,
+  Post,
+  Body,
+  Param,
+  Query,
+  UseGuards,
+} from '@nestjs/common';
+import {
+  ApiTags,
+  ApiOperation,
+  ApiResponse,
+  ApiBearerAuth,
+} from '@nestjs/swagger';
+import { SecurityMonitorService } from './monitoring/security-monitor.service';
+import { IncidentResponseService } from './response/incident-response.service';
+import { SecurityEvent } from './entities/security-event.entity';
+
+@ApiTags('Security')
+@Controller('security')
+export class SecurityController {
+  constructor(
+    private readonly securityMonitor: SecurityMonitorService,
+    private readonly incidentResponse: IncidentResponseService,
+  ) {}
+
+  @Get('events')
+  @ApiOperation({ summary: 'Get recent security events' })
+  @ApiResponse({ status: 200, description: 'Returns recent security events' })
+  async getRecentEvents(
+    @Query('limit') limit: number = 50,
+  ): Promise<SecurityEvent[]> {
+    return this.securityMonitor.getRecentEvents(limit);
+  }
+
+  @Get('events/unresolved')
+  @ApiOperation({ summary: 'Get unresolved security events' })
+  @ApiResponse({
+    status: 200,
+    description: 'Returns unresolved security events',
+  })
+  async getUnresolvedEvents(): Promise<SecurityEvent[]> {
+    return this.securityMonitor.getUnresolvedEvents();
+  }
+
+  @Post('events/:id/resolve')
+  @ApiOperation({ summary: 'Resolve a security event' })
+  @ApiResponse({ status: 200, description: 'Event resolved successfully' })
+  async resolveEvent(
+    @Param('id') eventId: string,
+    @Body('resolvedBy') resolvedBy: string,
+  ): Promise<SecurityEvent> {
+    return this.securityMonitor.resolveEvent(eventId, resolvedBy);
+  }
+
+  @Post('events/:id/false-positive')
+  @ApiOperation({ summary: 'Mark event as false positive' })
+  @ApiResponse({ status: 200, description: 'Event marked as false positive' })
+  async markAsFalsePositive(@Param('id') eventId: string): Promise<void> {
+    await this.securityMonitor.markAsFalsePositive(eventId);
+  }
+
+  @Post('events/:id/true-positive')
+  @ApiOperation({ summary: 'Mark event as true positive' })
+  @ApiResponse({ status: 200, description: 'Event marked as true positive' })
+  async markAsTruePositive(@Param('id') eventId: string): Promise<void> {
+    await this.securityMonitor.markAsTruePositive(eventId);
+  }
+
+  @Get('metrics')
+  @ApiOperation({ summary: 'Get security metrics' })
+  @ApiResponse({ status: 200, description: 'Returns security metrics' })
+  async getMetrics(
+    @Query('start') start: string,
+    @Query('end') end: string,
+  ): Promise<any> {
+    return this.securityMonitor.getSecurityMetrics({
+      start: new Date(start),
+      end: new Date(end),
+    });
+  }
+
+  @Post('incidents/create-from-event')
+  @ApiOperation({ summary: 'Create incident from security event' })
+  @ApiResponse({ status: 200, description: 'Incident created successfully' })
+  async createIncidentFromEvent(
+    @Body('eventId') eventId: string,
+  ): Promise<any> {
+    // In production, fetch the actual event
+    const event = new SecurityEvent();
+    event.id = eventId;
+    return this.incidentResponse.createIncidentFromEvent(event);
+  }
+
+  @Post('monitor/transaction')
+  @ApiOperation({ summary: 'Monitor a transaction for suspicious activity' })
+  @ApiResponse({
+    status: 200,
+    description: 'Transaction monitored successfully',
+  })
+  async monitorTransaction(@Body() transactionData: any): Promise<void> {
+    await this.securityMonitor.monitorTransaction(transactionData);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/security.module.ts.html b/coverage/lcov-report/src/security/security.module.ts.html new file mode 100644 index 0000000..9ae5920 --- /dev/null +++ b/coverage/lcov-report/src/security/security.module.ts.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for src/security/security.module.ts + + + + + + + + + +
+
+

All files / src/security security.module.ts

+
+ +
+ 0% + Statements + 0/51 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/51 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module, Global, NestModule, MiddlewareConsumer } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ThrottlerModule } from '@nestjs/throttler';
+import { SecurityHeadersService } from './headers/security-headers.service';
+import { WafService } from './waf/waf.service';
+import { DdosProtectionService } from './ddos/ddos-protection.service';
+import { SecurityMonitorService } from './monitoring/security-monitor.service';
+import { SecurityMiddleware } from './middleware/security.middleware';
+import { AnomalyDetectorService } from './detectors/anomaly.detector';
+import { FraudDetectorService } from './detectors/fraud.detector';
+import { SecurityAlertService } from './alerts/security-alert.service';
+import { IncidentResponseService } from './response/incident-response.service';
+import { SecurityEvent } from './entities/security-event.entity';
+import { SecurityController } from './security.controller';
+
+@Global()
+@Module({
+  imports: [
+    ThrottlerModule.forRootAsync({
+      useClass: DdosProtectionService,
+    }),
+    TypeOrmModule.forFeature([SecurityEvent]),
+  ],
+  controllers: [SecurityController],
+  providers: [
+    SecurityHeadersService,
+    WafService,
+    DdosProtectionService,
+    SecurityMonitorService,
+    SecurityMiddleware,
+    AnomalyDetectorService,
+    FraudDetectorService,
+    SecurityAlertService,
+    IncidentResponseService,
+  ],
+  exports: [
+    SecurityHeadersService,
+    WafService,
+    DdosProtectionService,
+    SecurityMonitorService,
+    AnomalyDetectorService,
+    FraudDetectorService,
+    SecurityAlertService,
+    IncidentResponseService,
+  ],
+})
+export class SecurityModule implements NestModule {
+  configure(consumer: MiddlewareConsumer) {
+    consumer.apply(SecurityMiddleware).forRoutes('*');
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/waf/index.html b/coverage/lcov-report/src/security/waf/index.html new file mode 100644 index 0000000..d322921 --- /dev/null +++ b/coverage/lcov-report/src/security/waf/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/security/waf + + + + + + + + + +
+
+

All files src/security/waf

+
+ +
+ 0% + Statements + 0/90 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/90 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
waf.service.ts +
+
0%0/900%0/10%0/10%0/90
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/security/waf/waf.service.ts.html b/coverage/lcov-report/src/security/waf/waf.service.ts.html new file mode 100644 index 0000000..39997bb --- /dev/null +++ b/coverage/lcov-report/src/security/waf/waf.service.ts.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for src/security/waf/waf.service.ts + + + + + + + + + +
+
+

All files / src/security/waf waf.service.ts

+
+ +
+ 0% + Statements + 0/90 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/90 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import * as fs from 'fs';
+import * as path from 'path';
+
+interface WafRule {
+  name: string;
+  pattern: string;
+  block: boolean;
+}
+
+interface WafConfig {
+  rules: WafRule[];
+  globalExcludes: string[];
+}
+
+@Injectable()
+export class WafService implements OnModuleInit {
+  private readonly logger = new Logger(WafService.name);
+  private config: WafConfig;
+  private readonly ruleCache: {
+    name: string;
+    regex: RegExp;
+    block: boolean;
+  }[] = [];
+
+  onModuleInit() {
+    this.loadRules();
+  }
+
+  private loadRules() {
+    try {
+      const configPath = path.resolve(process.cwd(), 'security/waf-rules.json');
+      const data = fs.readFileSync(configPath, 'utf8');
+      this.config = JSON.parse(data);
+
+      this.ruleCache.length = 0;
+      for (const rule of this.config.rules) {
+        this.ruleCache.push({
+          name: rule.name,
+          regex: new RegExp(rule.pattern, 'i'),
+          block: rule.block,
+        });
+      }
+      this.logger.log(`Successfully loaded ${this.ruleCache.length} WAF rules`);
+    } catch (error) {
+      this.logger.error(
+        'Failed to load WAF rules, falling back to empty ruleset',
+        error.stack,
+      );
+      this.config = { rules: [], globalExcludes: [] };
+    }
+  }
+
+  /**
+   * Check if a request payload contains malicious patterns
+   */
+  isRequestSafe(
+    url: string,
+    body: any,
+    query: any,
+  ): { safe: boolean; reason?: string } {
+    if (this.config.globalExcludes.some((exclude) => url.includes(exclude))) {
+      return { safe: true };
+    }
+
+    const checkValue = (val: any): { safe: boolean; reason?: string } => {
+      if (typeof val === 'string') {
+        for (const rule of this.ruleCache) {
+          if (rule.regex.test(val)) {
+            return { safe: false, reason: `Blocked by WAF rule: ${rule.name}` };
+          }
+        }
+      } else if (typeof val === 'object' && val !== null) {
+        for (const key in val) {
+          const result = checkValue(val[key]);
+          if (!result.safe) return result;
+        }
+      }
+      return { safe: true };
+    };
+
+    const queryResult = checkValue(query);
+    if (!queryResult.safe) return queryResult;
+
+    const bodyResult = checkValue(body);
+    if (!bodyResult.safe) return bodyResult;
+
+    return { safe: true };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/aggregators/index.html b/coverage/lcov-report/src/sentiment/aggregators/index.html new file mode 100644 index 0000000..fb546bc --- /dev/null +++ b/coverage/lcov-report/src/sentiment/aggregators/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sentiment/aggregators + + + + + + + + + +
+
+

All files src/sentiment/aggregators

+
+ +
+ 0% + Statements + 0/32 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
news-aggregator.service.ts +
+
0%0/320%0/10%0/10%0/32
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/aggregators/news-aggregator.service.ts.html b/coverage/lcov-report/src/sentiment/aggregators/news-aggregator.service.ts.html new file mode 100644 index 0000000..568e3c9 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/aggregators/news-aggregator.service.ts.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for src/sentiment/aggregators/news-aggregator.service.ts + + + + + + + + + +
+
+

All files / src/sentiment/aggregators news-aggregator.service.ts

+
+ +
+ 0% + Statements + 0/32 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class NewsAggregatorService {
+  private readonly logger = new Logger(NewsAggregatorService.name);
+
+  async aggregateNews(sources: string[]): Promise<any[]> {
+    this.logger.log('Aggregating news from sources');
+
+    // In production, integrate with news APIs (Reuters, Bloomberg, etc.)
+    const articles = await this.fetchFromSources(sources);
+    return articles;
+  }
+
+  private async fetchFromSources(sources: string[]): Promise<any[]> {
+    // Placeholder for actual API integration
+    return [
+      {
+        title: 'Renewable Energy Sector Shows Strong Growth',
+        source: 'Energy Today',
+        url: 'https://example.com/article1',
+        publishedAt: new Date(),
+        content:
+          'The renewable energy sector is experiencing unprecedented growth...',
+      },
+    ];
+  }
+
+  async getSupportedSources(): Promise<string[]> {
+    return ['reuters', 'bloomberg', 'energyvoice', 'renewablesnow'];
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/algorithms/index.html b/coverage/lcov-report/src/sentiment/algorithms/index.html new file mode 100644 index 0000000..bc36c7d --- /dev/null +++ b/coverage/lcov-report/src/sentiment/algorithms/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sentiment/algorithms + + + + + + + + + +
+
+

All files src/sentiment/algorithms

+
+ +
+ 0% + Statements + 0/65 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
sentiment-scorer.service.ts +
+
0%0/650%0/10%0/10%0/65
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/algorithms/sentiment-scorer.service.ts.html b/coverage/lcov-report/src/sentiment/algorithms/sentiment-scorer.service.ts.html new file mode 100644 index 0000000..885286b --- /dev/null +++ b/coverage/lcov-report/src/sentiment/algorithms/sentiment-scorer.service.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for src/sentiment/algorithms/sentiment-scorer.service.ts + + + + + + + + + +
+
+

All files / src/sentiment/algorithms sentiment-scorer.service.ts

+
+ +
+ 0% + Statements + 0/65 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class SentimentScorerService {
+  private readonly logger = new Logger(SentimentScorerService.name);
+
+  async calculateSentiment(
+    text: string,
+    processedData?: any,
+  ): Promise<{ score: number; confidence: number }> {
+    this.logger.log('Calculating sentiment score');
+
+    // In production, use NLP libraries like sentiment, natural, or transformer models
+    const positiveWords = [
+      'growth',
+      'surge',
+      'profit',
+      'gain',
+      'positive',
+      'strong',
+      'bullish',
+    ];
+    const negativeWords = [
+      'decline',
+      'loss',
+      'drop',
+      'fall',
+      'negative',
+      'weak',
+      'bearish',
+    ];
+
+    const words = text.toLowerCase().split(/\W+/);
+
+    let positiveCount = 0;
+    let negativeCount = 0;
+
+    words.forEach((word) => {
+      if (positiveWords.includes(word)) positiveCount++;
+      if (negativeWords.includes(word)) negativeCount++;
+    });
+
+    const total = words.length;
+    const score = (positiveCount - negativeCount) / Math.sqrt(total);
+    const normalizedScore = Math.max(-1, Math.min(1, score));
+
+    const confidence = Math.min(1, (positiveCount + negativeCount) / 10);
+
+    return { score: normalizedScore, confidence };
+  }
+
+  async calculateEngagementScore(metrics: {
+    likes?: number;
+    shares?: number;
+    comments?: number;
+  }): Promise<number> {
+    const weights = { likes: 1, shares: 3, comments: 2 };
+    const score =
+      (metrics.likes || 0) * weights.likes +
+      (metrics.shares || 0) * weights.shares +
+      (metrics.comments || 0) * weights.comments;
+
+    return Math.min(100, score);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/correlation/index.html b/coverage/lcov-report/src/sentiment/correlation/index.html new file mode 100644 index 0000000..c0b3367 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/correlation/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sentiment/correlation + + + + + + + + + +
+
+

All files src/sentiment/correlation

+
+ +
+ 0% + Statements + 0/71 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/71 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
market-correlation.service.ts +
+
0%0/710%0/10%0/10%0/71
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/correlation/market-correlation.service.ts.html b/coverage/lcov-report/src/sentiment/correlation/market-correlation.service.ts.html new file mode 100644 index 0000000..51e2cc0 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/correlation/market-correlation.service.ts.html @@ -0,0 +1,298 @@ + + + + + + Code coverage report for src/sentiment/correlation/market-correlation.service.ts + + + + + + + + + +
+
+

All files / src/sentiment/correlation market-correlation.service.ts

+
+ +
+ 0% + Statements + 0/71 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/71 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class MarketCorrelationService {
+  private readonly logger = new Logger(MarketCorrelationService.name);
+
+  async correlateSentimentWithMarket(
+    sentimentData: any[],
+    marketData: any[],
+  ): Promise<any> {
+    this.logger.log('Correlating sentiment with market movements');
+
+    // Calculate correlation coefficient between sentiment and price movements
+    const correlation = this.calculatePearsonCorrelation(
+      sentimentData.map((s) => s.sentimentScore),
+      marketData.map((m) => m.priceChange),
+    );
+
+    return {
+      correlationCoefficient: correlation,
+      strength: this.getCorrelationStrength(correlation),
+      isSignificant: Math.abs(correlation) > 0.5,
+    };
+  }
+
+  async generateTradingSignal(
+    sentimentTrend: string,
+    marketContext: any,
+  ): Promise<'bullish' | 'bearish' | 'neutral'> {
+    if (sentimentTrend === 'improving' && marketContext.volatility < 0.3) {
+      return 'bullish';
+    } else if (
+      sentimentTrend === 'declining' &&
+      marketContext.volatility < 0.3
+    ) {
+      return 'bearish';
+    }
+    return 'neutral';
+  }
+
+  private calculatePearsonCorrelation(x: number[], y: number[]): number {
+    const n = Math.min(x.length, y.length);
+    if (n === 0) return 0;
+
+    const meanX = x.reduce((a, b) => a + b, 0) / n;
+    const meanY = y.reduce((a, b) => a + b, 0) / n;
+
+    let numerator = 0;
+    let sumSqX = 0;
+    let sumSqY = 0;
+
+    for (let i = 0; i < n; i++) {
+      const dx = x[i] - meanX;
+      const dy = y[i] - meanY;
+      numerator += dx * dy;
+      sumSqX += dx * dx;
+      sumSqY += dy * dy;
+    }
+
+    const denominator = Math.sqrt(sumSqX * sumSqY);
+    return denominator === 0 ? 0 : numerator / denominator;
+  }
+
+  private getCorrelationStrength(correlation: number): string {
+    const abs = Math.abs(correlation);
+    if (abs >= 0.7) return 'strong';
+    if (abs >= 0.4) return 'moderate';
+    if (abs >= 0.2) return 'weak';
+    return 'negligible';
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/dto/index.html b/coverage/lcov-report/src/sentiment/dto/index.html new file mode 100644 index 0000000..5032ec5 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sentiment/dto + + + + + + + + + +
+
+

All files src/sentiment/dto

+
+ +
+ 0% + Statements + 0/72 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
sentiment-query.dto.ts +
+
0%0/720%0/10%0/10%0/72
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/dto/sentiment-query.dto.ts.html b/coverage/lcov-report/src/sentiment/dto/sentiment-query.dto.ts.html new file mode 100644 index 0000000..2c04025 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/dto/sentiment-query.dto.ts.html @@ -0,0 +1,301 @@ + + + + + + Code coverage report for src/sentiment/dto/sentiment-query.dto.ts + + + + + + + + + +
+
+

All files / src/sentiment/dto sentiment-query.dto.ts

+
+ +
+ 0% + Statements + 0/72 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ApiProperty } from '@nestjs/swagger';
+import {
+  IsOptional,
+  IsString,
+  IsNumber,
+  IsEnum,
+  IsDateString,
+} from 'class-validator';
+import { SentimentType, SourceType } from '../entities/sentiment-data.entity';
+
+export class SentimentQueryDto {
+  @ApiProperty({ description: 'Asset symbol to query', required: false })
+  @IsOptional()
+  @IsString()
+  assetSymbol?: string;
+
+  @ApiProperty({ description: 'Start date', required: false })
+  @IsOptional()
+  @IsDateString()
+  startDate?: string;
+
+  @ApiProperty({ description: 'End date', required: false })
+  @IsOptional()
+  @IsDateString()
+  endDate?: string;
+
+  @ApiProperty({
+    description: 'Sentiment type filter',
+    required: false,
+    enum: SentimentType,
+  })
+  @IsOptional()
+  @IsEnum(SentimentType)
+  sentimentType?: SentimentType;
+
+  @ApiProperty({
+    description: 'Source type filter',
+    required: false,
+    enum: SourceType,
+  })
+  @IsOptional()
+  @IsEnum(SourceType)
+  sourceType?: SourceType;
+
+  @ApiProperty({ description: 'Limit results', default: 50 })
+  @IsOptional()
+  @IsNumber()
+  limit?: number = 50;
+}
+
+export class SentimentResponseDto {
+  @ApiProperty({ description: 'Overall sentiment score' })
+  overallScore: number;
+
+  @ApiProperty({ description: 'Sentiment trend' })
+  trend: 'improving' | 'declining' | 'stable';
+
+  @ApiProperty({ description: 'Total articles analyzed' })
+  totalArticles: number;
+
+  @ApiProperty({ description: 'Positive percentage' })
+  positivePercent: number;
+
+  @ApiProperty({ description: 'Negative percentage' })
+  negativePercent: number;
+
+  @ApiProperty({ description: 'Neutral percentage' })
+  neutralPercent: number;
+
+  @ApiProperty({ description: 'Trading signal' })
+  tradingSignal: 'bullish' | 'bearish' | 'neutral';
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/entities/index.html b/coverage/lcov-report/src/sentiment/entities/index.html new file mode 100644 index 0000000..4b64b13 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sentiment/entities + + + + + + + + + +
+
+

All files src/sentiment/entities

+
+ +
+ 0% + Statements + 0/75 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
sentiment-data.entity.ts +
+
0%0/750%0/10%0/10%0/75
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/entities/sentiment-data.entity.ts.html b/coverage/lcov-report/src/sentiment/entities/sentiment-data.entity.ts.html new file mode 100644 index 0000000..116c566 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/entities/sentiment-data.entity.ts.html @@ -0,0 +1,310 @@ + + + + + + Code coverage report for src/sentiment/entities/sentiment-data.entity.ts + + + + + + + + + +
+
+

All files / src/sentiment/entities sentiment-data.entity.ts

+
+ +
+ 0% + Statements + 0/75 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  Index,
+} from 'typeorm';
+
+export enum SentimentType {
+  POSITIVE = 'positive',
+  NEGATIVE = 'negative',
+  NEUTRAL = 'neutral',
+}
+
+export enum SourceType {
+  NEWS = 'news',
+  SOCIAL_MEDIA = 'social_media',
+  ANALYST_REPORT = 'analyst_report',
+  BLOG = 'blog',
+  FORUM = 'forum',
+}
+
+@Entity('sentiment_data')
+export class SentimentData {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column('text')
+  content: string;
+
+  @Column({ type: 'float', default: 0 })
+  sentimentScore: number; // -1 to 1
+
+  @Column({ type: 'enum', enum: SentimentType })
+  sentimentType: SentimentType;
+
+  @Column({ type: 'float', default: 0 })
+  confidence: number;
+
+  @Column({ type: 'enum', enum: SourceType })
+  sourceType: SourceType;
+
+  @Column()
+  sourceUrl: string;
+
+  @Column({ nullable: true })
+  author?: string;
+
+  @Column({ nullable: true })
+  @Index()
+  assetSymbol?: string;
+
+  @Column({ nullable: true })
+  @Index()
+  topic?: string;
+
+  @Column('jsonb')
+  keywords: string[];
+
+  @Column({ default: 0 })
+  engagementScore: number;
+
+  @CreateDateColumn()
+  @Index()
+  publishedAt: Date;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  getSentimentLabel(): string {
+    if (this.sentimentScore > 0.3) return 'Positive';
+    if (this.sentimentScore < -0.3) return 'Negative';
+    return 'Neutral';
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/index.html b/coverage/lcov-report/src/sentiment/index.html new file mode 100644 index 0000000..3f3071c --- /dev/null +++ b/coverage/lcov-report/src/sentiment/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/sentiment + + + + + + + + + +
+
+

All files src/sentiment

+
+ +
+ 0% + Statements + 0/117 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
sentiment-analysis.module.ts +
+
0%0/290%0/10%0/10%0/29
sentiment.controller.ts +
+
0%0/880%0/10%0/10%0/88
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/monitors/index.html b/coverage/lcov-report/src/sentiment/monitors/index.html new file mode 100644 index 0000000..f9ba51b --- /dev/null +++ b/coverage/lcov-report/src/sentiment/monitors/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sentiment/monitors + + + + + + + + + +
+
+

All files src/sentiment/monitors

+
+ +
+ 0% + Statements + 0/36 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
social-media.service.ts +
+
0%0/360%0/10%0/10%0/36
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/monitors/social-media.service.ts.html b/coverage/lcov-report/src/sentiment/monitors/social-media.service.ts.html new file mode 100644 index 0000000..40cde62 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/monitors/social-media.service.ts.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for src/sentiment/monitors/social-media.service.ts + + + + + + + + + +
+
+

All files / src/sentiment/monitors social-media.service.ts

+
+ +
+ 0% + Statements + 0/36 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class SocialMediaMonitorService {
+  private readonly logger = new Logger(SocialMediaMonitorService.name);
+
+  async monitorPlatforms(keywords: string[]): Promise<any[]> {
+    this.logger.log('Monitoring social media platforms');
+
+    // In production, integrate with Twitter/X API, Reddit API, etc.
+    const posts = await this.fetchPosts(keywords);
+    return posts;
+  }
+
+  async fetchTrendingTopics(): Promise<string[]> {
+    return [
+      'renewable energy',
+      'solar power',
+      'wind energy',
+      'electric vehicles',
+    ];
+  }
+
+  private async fetchPosts(keywords: string[]): Promise<any[]> {
+    // Placeholder for actual API integration
+    return [
+      {
+        platform: 'twitter',
+        content: 'Solar energy stocks are surging!',
+        author: '@energytrader',
+        timestamp: new Date(),
+        engagement: { likes: 150, shares: 45 },
+      },
+    ];
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/nlp/index.html b/coverage/lcov-report/src/sentiment/nlp/index.html new file mode 100644 index 0000000..cc059e9 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/nlp/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sentiment/nlp + + + + + + + + + +
+
+

All files src/sentiment/nlp

+
+ +
+ 0% + Statements + 0/119 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
text-processor.service.ts +
+
0%0/1190%0/10%0/10%0/119
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/nlp/text-processor.service.ts.html b/coverage/lcov-report/src/sentiment/nlp/text-processor.service.ts.html new file mode 100644 index 0000000..7ed09c1 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/nlp/text-processor.service.ts.html @@ -0,0 +1,442 @@ + + + + + + Code coverage report for src/sentiment/nlp/text-processor.service.ts + + + + + + + + + +
+
+

All files / src/sentiment/nlp text-processor.service.ts

+
+ +
+ 0% + Statements + 0/119 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+
+export interface ProcessedText {
+  tokens: string[];
+  keywords: string[];
+  entities: string[];
+  language: string;
+  isRelevant: boolean;
+}
+
+@Injectable()
+export class TextProcessorService {
+  private readonly logger = new Logger(TextProcessorService.name);
+
+  async process(text: string): Promise<ProcessedText> {
+    this.logger.log('Processing text for NLP analysis');
+
+    // Tokenization
+    const tokens = this.tokenize(text);
+
+    // Keyword extraction
+    const keywords = this.extractKeywords(tokens);
+
+    // Named entity recognition (simplified)
+    const entities = this.extractEntities(text);
+
+    // Language detection
+    const language = this.detectLanguage(text);
+
+    // Relevance filtering
+    const isRelevant = this.checkRelevance(keywords, entities);
+
+    return { tokens, keywords, entities, language, isRelevant };
+  }
+
+  private tokenize(text: string): string[] {
+    // Simple tokenization - in production use proper NLP libraries
+    return text
+      .toLowerCase()
+      .split(/\W+/)
+      .filter((word) => word.length > 2);
+  }
+
+  private extractKeywords(tokens: string[]): string[] {
+    // Remove stop words and extract meaningful keywords
+    const stopWords = [
+      'the',
+      'and',
+      'is',
+      'in',
+      'at',
+      'of',
+      'to',
+      'for',
+      'on',
+      'with',
+    ];
+    const keywordCounts = tokens.reduce(
+      (acc, token) => {
+        if (!stopWords.includes(token)) {
+          acc[token] = (acc[token] || 0) + 1;
+        }
+        return acc;
+      },
+      {} as Record<string, number>,
+    );
+
+    return Object.entries(keywordCounts)
+      .sort((a, b) => b[1] - a[1])
+      .slice(0, 10)
+      .map(([word]) => word);
+  }
+
+  private extractEntities(text: string): string[] {
+    // Simplified entity extraction - detect capitalized terms
+    const entities = text.match(/\b[A-Z][A-Z]+\b/g) || [];
+    return [...new Set(entities)];
+  }
+
+  private detectLanguage(text: string): string {
+    // Simplified language detection
+    return 'en'; // Default to English
+  }
+
+  private checkRelevance(keywords: string[], entities: string[]): boolean {
+    // Check if content is relevant to energy/markets
+    const relevantTerms = [
+      'energy',
+      'power',
+      'electricity',
+      'renewable',
+      'solar',
+      'wind',
+      'market',
+      'price',
+      'trading',
+      'grid',
+      'consumption',
+    ];
+
+    const hasRelevantKeyword = keywords.some((k) =>
+      relevantTerms.includes(k.toLowerCase()),
+    );
+    const hasRelevantEntity = entities.some((e) =>
+      e.toLowerCase().includes('energy'),
+    );
+
+    return hasRelevantKeyword || hasRelevantEntity;
+  }
+
+  async batchProcess(texts: string[]): Promise<ProcessedText[]> {
+    this.logger.log(`Batch processing ${texts.length} texts`);
+
+    // Process in parallel for performance
+    const results = await Promise.all(texts.map((text) => this.process(text)));
+
+    return results.filter((result) => result.isRelevant);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/sentiment-analysis.module.ts.html b/coverage/lcov-report/src/sentiment/sentiment-analysis.module.ts.html new file mode 100644 index 0000000..b72af2f --- /dev/null +++ b/coverage/lcov-report/src/sentiment/sentiment-analysis.module.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/sentiment/sentiment-analysis.module.ts + + + + + + + + + +
+
+

All files / src/sentiment sentiment-analysis.module.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { SentimentData } from './entities/sentiment-data.entity';
+import { TextProcessorService } from './nlp/text-processor.service';
+import { SocialMediaMonitorService } from './monitors/social-media.service';
+import { NewsAggregatorService } from './aggregators/news-aggregator.service';
+import { SentimentScorerService } from './algorithms/sentiment-scorer.service';
+import { MarketCorrelationService } from './correlation/market-correlation.service';
+import { SentimentController } from './sentiment.controller';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([SentimentData])],
+  controllers: [SentimentController],
+  providers: [
+    TextProcessorService,
+    SocialMediaMonitorService,
+    NewsAggregatorService,
+    SentimentScorerService,
+    MarketCorrelationService,
+  ],
+  exports: [
+    TextProcessorService,
+    SocialMediaMonitorService,
+    NewsAggregatorService,
+    SentimentScorerService,
+    MarketCorrelationService,
+  ],
+})
+export class SentimentAnalysisModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sentiment/sentiment.controller.ts.html b/coverage/lcov-report/src/sentiment/sentiment.controller.ts.html new file mode 100644 index 0000000..34b1b10 --- /dev/null +++ b/coverage/lcov-report/src/sentiment/sentiment.controller.ts.html @@ -0,0 +1,349 @@ + + + + + + Code coverage report for src/sentiment/sentiment.controller.ts + + + + + + + + + +
+
+

All files / src/sentiment sentiment.controller.ts

+
+ +
+ 0% + Statements + 0/88 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/88 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, Post, Body, Query } from '@nestjs/common';
+import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
+import { TextProcessorService } from './nlp/text-processor.service';
+import { SocialMediaMonitorService } from './monitors/social-media.service';
+import { NewsAggregatorService } from './aggregators/news-aggregator.service';
+import { SentimentScorerService } from './algorithms/sentiment-scorer.service';
+import { MarketCorrelationService } from './correlation/market-correlation.service';
+
+@ApiTags('Sentiment Analysis')
+@Controller('sentiment')
+export class SentimentController {
+  constructor(
+    private readonly textProcessor: TextProcessorService,
+    private readonly socialMonitor: SocialMediaMonitorService,
+    private readonly newsAggregator: NewsAggregatorService,
+    private readonly sentimentScorer: SentimentScorerService,
+    private readonly marketCorrelation: MarketCorrelationService,
+  ) {}
+
+  @Get('analyze')
+  @ApiOperation({ summary: 'Analyze sentiment of text' })
+  async analyzeText(@Query('text') text: string): Promise<any> {
+    const processed = await this.textProcessor.process(text);
+    const sentiment = await this.sentimentScorer.calculateSentiment(
+      text,
+      processed,
+    );
+
+    return {
+      ...processed,
+      ...sentiment,
+      label:
+        sentiment.score > 0.3
+          ? 'positive'
+          : sentiment.score < -0.3
+            ? 'negative'
+            : 'neutral',
+    };
+  }
+
+  @Get('social/trending')
+  @ApiOperation({ summary: 'Get trending topics on social media' })
+  async getTrendingTopics(): Promise<string[]> {
+    return this.socialMonitor.fetchTrendingTopics();
+  }
+
+  @Get('news/latest')
+  @ApiOperation({ summary: 'Get latest energy news' })
+  async getLatestNews(): Promise<any[]> {
+    return this.newsAggregator.aggregateNews(['reuters', 'bloomberg']);
+  }
+
+  @Get('market/correlation')
+  @ApiOperation({ summary: 'Get sentiment-market correlation analysis' })
+  async getMarketCorrelation(): Promise<any> {
+    const sentimentData = [{ sentimentScore: 0.6 }, { sentimentScore: 0.4 }];
+    const marketData = [{ priceChange: 0.05 }, { priceChange: 0.03 }];
+
+    return this.marketCorrelation.correlateSentimentWithMarket(
+      sentimentData,
+      marketData,
+    );
+  }
+
+  @Get('trading-signal')
+  @ApiOperation({ summary: 'Generate trading signal based on sentiment' })
+  async getTradingSignal(@Query('trend') trend: string): Promise<any> {
+    const signal = await this.marketCorrelation.generateTradingSignal(trend, {
+      volatility: 0.2,
+    });
+    return { signal, generatedAt: new Date() };
+  }
+
+  @Post('batch-analyze')
+  @ApiOperation({ summary: 'Batch analyze multiple texts' })
+  async batchAnalyze(@Body('texts') texts: string[]): Promise<any[]> {
+    const results = [];
+    for (const text of texts) {
+      const processed = await this.textProcessor.process(text);
+      const sentiment = await this.sentimentScorer.calculateSentiment(
+        text,
+        processed,
+      );
+      results.push({ text: text.substring(0, 50) + '...', ...sentiment });
+    }
+    return results;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/dto/index.html b/coverage/lcov-report/src/settings/dto/index.html new file mode 100644 index 0000000..4c90082 --- /dev/null +++ b/coverage/lcov-report/src/settings/dto/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/settings/dto + + + + + + + + + +
+
+

All files src/settings/dto

+
+ +
+ 0% + Statements + 0/71 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/71 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
market-setting.dto.ts +
+
0%0/520%0/10%0/10%0/52
user-preference.dto.ts +
+
0%0/190%0/10%0/10%0/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/dto/market-setting.dto.ts.html b/coverage/lcov-report/src/settings/dto/market-setting.dto.ts.html new file mode 100644 index 0000000..11279c9 --- /dev/null +++ b/coverage/lcov-report/src/settings/dto/market-setting.dto.ts.html @@ -0,0 +1,241 @@ + + + + + + Code coverage report for src/settings/dto/market-setting.dto.ts + + + + + + + + + +
+
+

All files / src/settings/dto market-setting.dto.ts

+
+ +
+ 0% + Statements + 0/52 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsNumber,
+  IsObject,
+  IsOptional,
+  Min,
+  Max,
+  Matches,
+} from 'class-validator';
+import { PartialType } from '@nestjs/mapped-types';
+import { IsValidPriceRange } from '../validators/setting.validator';
+
+export class CreateMarketSettingDto {
+  @IsString()
+  @IsOptional()
+  settingKey?: string = 'global';
+
+  @IsString()
+  @Matches(/^([01]\d|2[0-3]):([0-5]\d)$/, {
+    message: 'Invalid time format, use HH:mm',
+  })
+  marketStartTime: string;
+
+  @IsString()
+  @Matches(/^([01]\d|2[0-3]):([0-5]\d)$/, {
+    message: 'Invalid time format, use HH:mm',
+  })
+  marketEndTime: string;
+
+  @IsString()
+  timezone: string;
+
+  @IsNumber({ maxDecimalPlaces: 2 })
+  @Min(0)
+  minTradeAmount: number;
+
+  @IsNumber({ maxDecimalPlaces: 2 })
+  @Min(0)
+  maxTradeAmount: number;
+
+  @IsObject()
+  @IsValidPriceRange()
+  defaultPriceRanges: Record<string, { min: number; max: number }>;
+
+  @IsString()
+  @IsOptional()
+  createdBy?: string;
+}
+
+export class UpdateMarketSettingDto extends PartialType(
+  CreateMarketSettingDto,
+) {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/dto/user-preference.dto.ts.html b/coverage/lcov-report/src/settings/dto/user-preference.dto.ts.html new file mode 100644 index 0000000..14d16f0 --- /dev/null +++ b/coverage/lcov-report/src/settings/dto/user-preference.dto.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for src/settings/dto/user-preference.dto.ts + + + + + + + + + +
+
+

All files / src/settings/dto user-preference.dto.ts

+
+ +
+ 0% + Statements + 0/19 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { IsString, IsObject, IsOptional } from 'class-validator';
+import { PartialType } from '@nestjs/mapped-types';
+import { UserPreferences } from '../entities/user-preference.entity';
+
+export class CreateUserPreferenceDto {
+  @IsString()
+  userId: string;
+
+  @IsObject()
+  preferences: UserPreferences;
+
+  @IsString()
+  @IsOptional()
+  createdBy?: string;
+}
+
+export class UpdateUserPreferenceDto extends PartialType(
+  CreateUserPreferenceDto,
+) {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/entities/index.html b/coverage/lcov-report/src/settings/entities/index.html new file mode 100644 index 0000000..845a0df --- /dev/null +++ b/coverage/lcov-report/src/settings/entities/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/settings/entities + + + + + + + + + +
+
+

All files src/settings/entities

+
+ +
+ 0% + Statements + 0/117 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
market-setting.entity.ts +
+
0%0/550%0/10%0/10%0/55
user-preference.entity.ts +
+
0%0/620%0/10%0/10%0/62
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/entities/market-setting.entity.ts.html b/coverage/lcov-report/src/settings/entities/market-setting.entity.ts.html new file mode 100644 index 0000000..def2459 --- /dev/null +++ b/coverage/lcov-report/src/settings/entities/market-setting.entity.ts.html @@ -0,0 +1,250 @@ + + + + + + Code coverage report for src/settings/entities/market-setting.entity.ts + + + + + + + + + +
+
+

All files / src/settings/entities market-setting.entity.ts

+
+ +
+ 0% + Statements + 0/55 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/55 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+
+@Entity('market_settings')
+@Index(['settingKey', 'isActive'])
+@Index(['version'])
+export class MarketSetting {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'varchar', length: 100, default: 'global' })
+  settingKey: string;
+
+  @Column({ type: 'varchar', length: 10 })
+  marketStartTime: string; // HH:mm
+
+  @Column({ type: 'varchar', length: 10 })
+  marketEndTime: string;
+
+  @Column({ type: 'varchar', length: 50 })
+  timezone: string;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  minTradeAmount: number;
+
+  @Column({ type: 'decimal', precision: 15, scale: 2 })
+  maxTradeAmount: number;
+
+  @Column({ type: 'json' })
+  defaultPriceRanges: Record<string, { min: number; max: number }>;
+
+  @Column({ type: 'int', default: 1 })
+  version: number;
+
+  @Column({ type: 'boolean', default: true })
+  isActive: boolean;
+
+  @Column({ type: 'varchar', length: 100, nullable: true })
+  createdBy: string;
+
+  @Column({ type: 'varchar', length: 100, nullable: true })
+  updatedBy: string;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @UpdateDateColumn()
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/entities/user-preference.entity.ts.html b/coverage/lcov-report/src/settings/entities/user-preference.entity.ts.html new file mode 100644 index 0000000..3431edc --- /dev/null +++ b/coverage/lcov-report/src/settings/entities/user-preference.entity.ts.html @@ -0,0 +1,271 @@ + + + + + + Code coverage report for src/settings/entities/user-preference.entity.ts + + + + + + + + + +
+
+

All files / src/settings/entities user-preference.entity.ts

+
+ +
+ 0% + Statements + 0/62 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+
+export interface NotificationPreferences {
+  email: boolean;
+  sms: boolean;
+  push: boolean;
+  tradeConfirmations: boolean;
+  priceAlerts: boolean;
+  marketNews: boolean;
+}
+
+export interface InterfacePreferences {
+  theme: 'light' | 'dark';
+  language: string;
+  timezone: string;
+  currency: string;
+  dashboardLayout: string[];
+}
+
+export interface UserPreferences {
+  notifications: NotificationPreferences;
+  interface: InterfacePreferences;
+}
+
+@Entity('user_preferences')
+@Index(['userId', 'isActive'])
+@Index(['version'])
+export class UserPreference {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'varchar', length: 100 })
+  userId: string;
+
+  @Column({ type: 'json' })
+  preferences: UserPreferences;
+
+  @Column({ type: 'int', default: 1 })
+  version: number;
+
+  @Column({ type: 'boolean', default: true })
+  isActive: boolean;
+
+  @Column({ type: 'varchar', length: 100, nullable: true })
+  createdBy: string;
+
+  @Column({ type: 'varchar', length: 100, nullable: true })
+  updatedBy: string;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @UpdateDateColumn()
+  updatedAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/index.html b/coverage/lcov-report/src/settings/index.html new file mode 100644 index 0000000..7d1300f --- /dev/null +++ b/coverage/lcov-report/src/settings/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/settings + + + + + + + + + +
+
+

All files src/settings

+
+ +
+ 0% + Statements + 0/419 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/419 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
settings.controller.ts +
+
0%0/890%0/10%0/10%0/89
settings.module.ts +
+
0%0/180%0/10%0/10%0/18
settings.service.ts +
+
0%0/3120%0/10%0/10%0/312
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/settings.controller.ts.html b/coverage/lcov-report/src/settings/settings.controller.ts.html new file mode 100644 index 0000000..de1c56f --- /dev/null +++ b/coverage/lcov-report/src/settings/settings.controller.ts.html @@ -0,0 +1,352 @@ + + + + + + Code coverage report for src/settings/settings.controller.ts + + + + + + + + + +
+
+

All files / src/settings settings.controller.ts

+
+ +
+ 0% + Statements + 0/89 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/89 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Controller, Get, Post, Put, Body, Param, Query } from '@nestjs/common';
+import { SettingsService } from './settings.service';
+import {
+  CreateMarketSettingDto,
+  UpdateMarketSettingDto,
+} from './dto/market-setting.dto';
+import {
+  CreateUserPreferenceDto,
+  UpdateUserPreferenceDto,
+} from './dto/user-preference.dto';
+
+@Controller('settings')
+export class SettingsController {
+  constructor(private readonly settingsService: SettingsService) {}
+
+  @Get('market')
+  async getMarketSettings(@Query('key') key = 'global') {
+    return this.settingsService.getActiveMarketSettings(key);
+  }
+
+  @Post('market')
+  async createMarketSettings(@Body() dto: CreateMarketSettingDto) {
+    return this.settingsService.createInitialMarketSettings(dto);
+  }
+
+  @Put('market')
+  async updateMarketSettings(
+    @Body() dto: UpdateMarketSettingDto,
+    @Query('updatedBy') updatedBy: string,
+  ) {
+    return this.settingsService.updateMarketSettings(dto, updatedBy);
+  }
+
+  @Put('market/rollback/:version')
+  async rollbackMarketSettings(
+    @Param('version') version: number,
+    @Query('key') key = 'global',
+    @Query('updatedBy') updatedBy: string,
+  ) {
+    return this.settingsService.rollbackMarketSettings(version, key, updatedBy);
+  }
+
+  @Get('user/:userId')
+  async getUserPreferences(@Param('userId') userId: string) {
+    return this.settingsService.getUserPreferences(userId);
+  }
+
+  @Post('user')
+  async createUserPreferences(@Body() dto: CreateUserPreferenceDto) {
+    return this.settingsService.createUserPreferences(dto);
+  }
+
+  @Put('user/:userId')
+  async updateUserPreferences(
+    @Param('userId') userId: string,
+    @Body() dto: UpdateUserPreferenceDto,
+    @Query('updatedBy') updatedBy: string,
+  ) {
+    return this.settingsService.updateUserPreferences(userId, dto, updatedBy);
+  }
+
+  @Put('user/:userId/rollback/:version')
+  async rollbackUserPreferences(
+    @Param('userId') userId: string,
+    @Param('version') version: number,
+    @Query('updatedBy') updatedBy: string,
+  ) {
+    return this.settingsService.rollbackUserPreferences(
+      userId,
+      version,
+      updatedBy,
+    );
+  }
+
+  @Get('backup')
+  async backupSettings() {
+    const json = await this.settingsService.backupSettings();
+    return { backup: json };
+  }
+
+  @Post('restore')
+  async restoreSettings(
+    @Body() body: { backup: string },
+    @Query('restoredBy') restoredBy: string,
+  ) {
+    await this.settingsService.restoreSettings(body.backup, restoredBy);
+    return { message: 'Settings restored successfully' };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/settings.module.ts.html b/coverage/lcov-report/src/settings/settings.module.ts.html new file mode 100644 index 0000000..cca9ddc --- /dev/null +++ b/coverage/lcov-report/src/settings/settings.module.ts.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for src/settings/settings.module.ts + + + + + + + + + +
+
+

All files / src/settings settings.module.ts

+
+ +
+ 0% + Statements + 0/18 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { MarketSetting } from './entities/market-setting.entity';
+import { UserPreference } from './entities/user-preference.entity';
+import { SettingsService } from './settings.service';
+import { SettingsController } from './settings.controller';
+import { LoggingModule } from '../logging/logging.module';
+
+@Module({
+  imports: [
+    TypeOrmModule.forFeature([MarketSetting, UserPreference]),
+    LoggingModule,
+  ],
+  controllers: [SettingsController],
+  providers: [SettingsService],
+  exports: [SettingsService],
+})
+export class SettingsModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/settings.service.ts.html b/coverage/lcov-report/src/settings/settings.service.ts.html new file mode 100644 index 0000000..d0fab41 --- /dev/null +++ b/coverage/lcov-report/src/settings/settings.service.ts.html @@ -0,0 +1,1021 @@ + + + + + + Code coverage report for src/settings/settings.service.ts + + + + + + + + + +
+
+

All files / src/settings settings.service.ts

+
+ +
+ 0% + Statements + 0/312 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/312 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Injectable,
+  Logger,
+  NotFoundException,
+  BadRequestException,
+} from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { MarketSetting } from './entities/market-setting.entity';
+import { UserPreference } from './entities/user-preference.entity';
+import {
+  CreateMarketSettingDto,
+  UpdateMarketSettingDto,
+} from './dto/market-setting.dto';
+import {
+  CreateUserPreferenceDto,
+  UpdateUserPreferenceDto,
+} from './dto/user-preference.dto';
+import { LoggingService } from '../logging/logging.service';
+
+@Injectable()
+export class SettingsService {
+  private readonly logger = new Logger(SettingsService.name);
+  private marketSettingsCache: MarketSetting | null = null;
+  private userPreferencesCache = new Map<string, UserPreference>();
+
+  constructor(
+    @InjectRepository(MarketSetting)
+    private marketSettingRepository: Repository<MarketSetting>,
+    @InjectRepository(UserPreference)
+    private userPreferenceRepository: Repository<UserPreference>,
+    private loggingService: LoggingService,
+  ) {}
+
+  async getActiveMarketSettings(settingKey = 'global'): Promise<MarketSetting> {
+    if (
+      this.marketSettingsCache &&
+      this.marketSettingsCache.settingKey === settingKey &&
+      this.marketSettingsCache.isActive
+    ) {
+      return this.marketSettingsCache;
+    }
+    const setting = await this.marketSettingRepository.findOne({
+      where: { settingKey, isActive: true },
+    });
+    if (!setting) {
+      throw new NotFoundException('Active market settings not found');
+    }
+    this.marketSettingsCache = setting;
+    return setting;
+  }
+
+  async updateMarketSettings(
+    dto: UpdateMarketSettingDto,
+    updatedBy: string,
+  ): Promise<MarketSetting> {
+    const current = await this.getActiveMarketSettings(
+      dto.settingKey || 'global',
+    );
+    // Validate
+    const min = dto.minTradeAmount ?? current.minTradeAmount;
+    const max = dto.maxTradeAmount ?? current.maxTradeAmount;
+    if (min >= max) {
+      throw new BadRequestException(
+        'minTradeAmount must be less than maxTradeAmount',
+      );
+    }
+    // Deactivate current
+    await this.marketSettingRepository.update(
+      { id: current.id },
+      { isActive: false, updatedBy, updatedAt: new Date() },
+    );
+    // Create new version
+    const newVersion = current.version + 1;
+    const newSetting = this.marketSettingRepository.create({
+      ...current,
+      ...dto,
+      version: newVersion,
+      isActive: true,
+      updatedBy,
+      createdBy: updatedBy,
+      createdAt: new Date(),
+      updatedAt: new Date(),
+    });
+    const saved = await this.marketSettingRepository.save(newSetting);
+    this.marketSettingsCache = saved;
+    // Log change
+    await this.loggingService.log('info', 'Market settings updated', {
+      context: { component: 'settings', function: 'updateMarketSettings' },
+      metadata: {
+        oldVersion: current.version,
+        newVersion,
+        updatedBy,
+        changes: dto,
+      },
+    });
+    return saved;
+  }
+
+  async createInitialMarketSettings(
+    dto: CreateMarketSettingDto,
+  ): Promise<MarketSetting> {
+    // Check if exists
+    const existing = await this.marketSettingRepository.findOne({
+      where: { settingKey: dto.settingKey || 'global', isActive: true },
+    });
+    if (existing) {
+      throw new BadRequestException('Active market settings already exist');
+    }
+    if (dto.minTradeAmount >= dto.maxTradeAmount) {
+      throw new BadRequestException(
+        'minTradeAmount must be less than maxTradeAmount',
+      );
+    }
+    const setting = this.marketSettingRepository.create(dto);
+    const saved = await this.marketSettingRepository.save(setting);
+    this.marketSettingsCache = saved;
+    return saved;
+  }
+
+  async rollbackMarketSettings(
+    version: number,
+    settingKey = 'global',
+    updatedBy: string,
+  ): Promise<MarketSetting> {
+    const target = await this.marketSettingRepository.findOne({
+      where: { settingKey, version, isActive: false },
+    });
+    if (!target) {
+      throw new NotFoundException(`Version ${version} not found for rollback`);
+    }
+    // Deactivate current
+    await this.marketSettingRepository.update(
+      { settingKey, isActive: true },
+      { isActive: false, updatedBy, updatedAt: new Date() },
+    );
+    // Activate target
+    await this.marketSettingRepository.update(
+      { id: target.id },
+      { isActive: true, updatedBy, updatedAt: new Date() },
+    );
+    this.marketSettingsCache = null; // clear cache
+    const updated = await this.getActiveMarketSettings(settingKey);
+    await this.loggingService.log('warn', 'Market settings rolled back', {
+      context: { component: 'settings', function: 'rollbackMarketSettings' },
+      metadata: { rolledBackToVersion: version, updatedBy },
+    });
+    return updated;
+  }
+
+  async getUserPreferences(userId: string): Promise<UserPreference> {
+    if (this.userPreferencesCache.has(userId)) {
+      const cached = this.userPreferencesCache.get(userId);
+      if (cached.isActive) return cached;
+    }
+    const pref = await this.userPreferenceRepository.findOne({
+      where: { userId, isActive: true },
+    });
+    if (!pref) {
+      throw new NotFoundException('User preferences not found');
+    }
+    this.userPreferencesCache.set(userId, pref);
+    return pref;
+  }
+
+  async updateUserPreferences(
+    userId: string,
+    dto: UpdateUserPreferenceDto,
+    updatedBy: string,
+  ): Promise<UserPreference> {
+    const current = await this.getUserPreferences(userId);
+    // Deactivate current
+    await this.userPreferenceRepository.update(
+      { id: current.id },
+      { isActive: false, updatedBy, updatedAt: new Date() },
+    );
+    // Create new version
+    const newVersion = current.version + 1;
+    const newPref = this.userPreferenceRepository.create({
+      ...current,
+      ...dto,
+      version: newVersion,
+      isActive: true,
+      updatedBy,
+      createdBy: updatedBy,
+      createdAt: new Date(),
+      updatedAt: new Date(),
+    });
+    const saved = await this.userPreferenceRepository.save(newPref);
+    this.userPreferencesCache.set(userId, saved);
+    await this.loggingService.log('info', 'User preferences updated', {
+      context: { component: 'settings', function: 'updateUserPreferences' },
+      metadata: {
+        userId,
+        oldVersion: current.version,
+        newVersion,
+        updatedBy,
+        changes: dto,
+      },
+    });
+    return saved;
+  }
+
+  async createUserPreferences(
+    dto: CreateUserPreferenceDto,
+  ): Promise<UserPreference> {
+    const existing = await this.userPreferenceRepository.findOne({
+      where: { userId: dto.userId, isActive: true },
+    });
+    if (existing) {
+      throw new BadRequestException('Active user preferences already exist');
+    }
+    const pref = this.userPreferenceRepository.create(dto);
+    const saved = await this.userPreferenceRepository.save(pref);
+    this.userPreferencesCache.set(dto.userId, saved);
+    return saved;
+  }
+
+  async rollbackUserPreferences(
+    userId: string,
+    version: number,
+    updatedBy: string,
+  ): Promise<UserPreference> {
+    const target = await this.userPreferenceRepository.findOne({
+      where: { userId, version, isActive: false },
+    });
+    if (!target) {
+      throw new NotFoundException(
+        `Version ${version} not found for user ${userId}`,
+      );
+    }
+    // Deactivate current
+    await this.userPreferenceRepository.update(
+      { userId, isActive: true },
+      { isActive: false, updatedBy, updatedAt: new Date() },
+    );
+    // Activate target
+    await this.userPreferenceRepository.update(
+      { id: target.id },
+      { isActive: true, updatedBy, updatedAt: new Date() },
+    );
+    this.userPreferencesCache.delete(userId);
+    const updated = await this.getUserPreferences(userId);
+    await this.loggingService.log('warn', 'User preferences rolled back', {
+      context: { component: 'settings', function: 'rollbackUserPreferences' },
+      metadata: { userId, rolledBackToVersion: version, updatedBy },
+    });
+    return updated;
+  }
+
+  async backupSettings(): Promise<string> {
+    const marketSettings = await this.marketSettingRepository.find();
+    const userPreferences = await this.userPreferenceRepository.find();
+    const backup = {
+      marketSettings,
+      userPreferences,
+      timestamp: new Date().toISOString(),
+    };
+    return JSON.stringify(backup, null, 2);
+  }
+
+  async restoreSettings(backupJson: string, restoredBy: string): Promise<void> {
+    try {
+      const backup = JSON.parse(backupJson);
+      // For restore, deactivate all current active
+      await this.marketSettingRepository.update(
+        {},
+        { isActive: false, updatedBy: restoredBy, updatedAt: new Date() },
+      );
+      await this.userPreferenceRepository.update(
+        {},
+        { isActive: false, updatedBy: restoredBy, updatedAt: new Date() },
+      );
+      // Insert restored as new versions
+      for (const setting of backup.marketSettings) {
+        const newSetting = {
+          ...setting,
+          id: undefined,
+          version: setting.version + 1000, // to distinguish restored
+          isActive: setting.isActive,
+          createdBy: restoredBy,
+          updatedBy: restoredBy,
+          createdAt: new Date(setting.createdAt),
+          updatedAt: new Date(),
+        };
+        await this.marketSettingRepository.save(newSetting);
+      }
+      for (const pref of backup.userPreferences) {
+        const newPref = {
+          ...pref,
+          id: undefined,
+          version: pref.version + 1000,
+          isActive: pref.isActive,
+          createdBy: restoredBy,
+          updatedBy: restoredBy,
+          createdAt: new Date(pref.createdAt),
+          updatedAt: new Date(),
+        };
+        await this.userPreferenceRepository.save(newPref);
+      }
+      // Clear caches
+      this.marketSettingsCache = null;
+      this.userPreferencesCache.clear();
+      await this.loggingService.log('info', 'Settings restored from backup', {
+        context: { component: 'settings', function: 'restoreSettings' },
+        metadata: { restoredBy, timestamp: backup.timestamp },
+      });
+    } catch (error) {
+      throw new BadRequestException('Invalid backup JSON');
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/validators/index.html b/coverage/lcov-report/src/settings/validators/index.html new file mode 100644 index 0000000..994d831 --- /dev/null +++ b/coverage/lcov-report/src/settings/validators/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/settings/validators + + + + + + + + + +
+
+

All files src/settings/validators

+
+ +
+ 0% + Statements + 0/37 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
setting.validator.ts +
+
0%0/370%0/10%0/10%0/37
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/settings/validators/setting.validator.ts.html b/coverage/lcov-report/src/settings/validators/setting.validator.ts.html new file mode 100644 index 0000000..015a4d6 --- /dev/null +++ b/coverage/lcov-report/src/settings/validators/setting.validator.ts.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for src/settings/validators/setting.validator.ts + + + + + + + + + +
+
+

All files / src/settings/validators setting.validator.ts

+
+ +
+ 0% + Statements + 0/37 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  registerDecorator,
+  ValidationOptions,
+  ValidationArguments,
+} from 'class-validator';
+
+export function IsValidPriceRange(validationOptions?: ValidationOptions) {
+  return function (object: object, propertyName: string) {
+    registerDecorator({
+      name: 'isValidPriceRange',
+      target: object.constructor,
+      propertyName: propertyName,
+      options: validationOptions,
+      validator: {
+        validate(value: any, args: ValidationArguments) {
+          if (typeof value !== 'object' || value === null) return false;
+          for (const [key, range] of Object.entries(value)) {
+            if (typeof range !== 'object' || range === null) return false;
+            const { min, max } = range as any;
+            if (
+              typeof min !== 'number' ||
+              typeof max !== 'number' ||
+              min >= max ||
+              min < 0 ||
+              max < 0
+            )
+              return false;
+          }
+          return true;
+        },
+        defaultMessage(args: ValidationArguments) {
+          return 'Each price range must have valid min and max numbers with min < max and >= 0';
+        },
+      },
+    });
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/entities/index.html b/coverage/lcov-report/src/sync/entities/index.html new file mode 100644 index 0000000..46d1c00 --- /dev/null +++ b/coverage/lcov-report/src/sync/entities/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sync/entities + + + + + + + + + +
+
+

All files src/sync/entities

+
+ +
+ 0% + Statements + 0/92 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/92 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
sync-state.entity.ts +
+
0%0/920%0/10%0/10%0/92
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/entities/sync-state.entity.ts.html b/coverage/lcov-report/src/sync/entities/sync-state.entity.ts.html new file mode 100644 index 0000000..7fec2fd --- /dev/null +++ b/coverage/lcov-report/src/sync/entities/sync-state.entity.ts.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for src/sync/entities/sync-state.entity.ts + + + + + + + + + +
+
+

All files / src/sync/entities sync-state.entity.ts

+
+ +
+ 0% + Statements + 0/92 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/92 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  Index,
+} from 'typeorm';
+
+export enum SyncStatus {
+  IDLE = 'idle',
+  SYNCING = 'syncing',
+  CONFLICT = 'conflict',
+  PARTITIONED = 'partitioned',
+  RECOVERING = 'recovering',
+  ERROR = 'error',
+}
+
+export enum SyncType {
+  FULL = 'full',
+  INCREMENTAL = 'incremental',
+  RECOVERY = 'recovery',
+}
+
+@Entity('sync_states')
+@Index(['entityType', 'entityId'])
+@Index(['status'])
+@Index(['lastSyncAt'])
+export class SyncState {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ type: 'varchar', length: 50 })
+  entityType: string;
+
+  @Column({ type: 'varchar', length: 255 })
+  entityId: string;
+
+  @Column({ type: 'enum', enum: SyncStatus, default: SyncStatus.IDLE })
+  status: SyncStatus;
+
+  @Column({ type: 'enum', enum: SyncType, default: SyncType.INCREMENTAL })
+  syncType: SyncType;
+
+  @Column({ type: 'bigint', name: 'last_ledger_sequence' })
+  lastLedgerSequence: number;
+
+  @Column({ type: 'bigint', name: 'target_ledger_sequence' })
+  targetLedgerSequence: number;
+
+  @Column({ type: 'json', nullable: true })
+  metadata: Record<string, any>;
+
+  @Column({ type: 'text', nullable: true })
+  errorMessage: string;
+
+  @Column({ type: 'int', default: 0 })
+  retryCount: number;
+
+  @Column({ type: 'bigint', name: 'conflict_count', default: 0 })
+  conflictCount: number;
+
+  @Column({ type: 'bigint', name: 'partition_start_time', nullable: true })
+  partitionStartTime: number;
+
+  @Column({ type: 'int', name: 'sync_latency_ms', default: 0 })
+  syncLatencyMs: number;
+
+  @Column({ type: 'int', name: 'transactions_processed', default: 0 })
+  transactionsProcessed: number;
+
+  @Column({ type: 'int', name: 'transactions_per_hour', default: 0 })
+  transactionsPerHour: number;
+
+  @CreateDateColumn({ name: 'created_at' })
+  createdAt: Date;
+
+  @UpdateDateColumn({ name: 'updated_at' })
+  updatedAt: Date;
+
+  @Column({ type: 'datetime', name: 'last_sync_at', nullable: true })
+  lastSyncAt: Date;
+
+  @Column({ type: 'datetime', name: 'next_sync_at', nullable: true })
+  nextSyncAt: Date;
+
+  @Column({ type: 'datetime', name: 'last_successful_sync_at', nullable: true })
+  lastSuccessfulSyncAt: Date;
+
+  @Column({ type: 'boolean', name: 'is_healthy', default: true })
+  isHealthy: boolean;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/handlers/index.html b/coverage/lcov-report/src/sync/handlers/index.html new file mode 100644 index 0000000..9d34e21 --- /dev/null +++ b/coverage/lcov-report/src/sync/handlers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sync/handlers + + + + + + + + + +
+
+

All files src/sync/handlers

+
+ +
+ 0% + Statements + 0/429 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/429 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
partition.handler.ts +
+
0%0/4290%0/10%0/10%0/429
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/handlers/partition.handler.ts.html b/coverage/lcov-report/src/sync/handlers/partition.handler.ts.html new file mode 100644 index 0000000..d40b3aa --- /dev/null +++ b/coverage/lcov-report/src/sync/handlers/partition.handler.ts.html @@ -0,0 +1,1372 @@ + + + + + + Code coverage report for src/sync/handlers/partition.handler.ts + + + + + + + + + +
+
+

All files / src/sync/handlers partition.handler.ts

+
+ +
+ 0% + Statements + 0/429 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/429 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource } from 'typeorm';
+import { Server } from '@stellar/stellar-sdk';
+import { interval, Subject, BehaviorSubject } from 'rxjs';
+import { takeWhile, switchMap, catchError } from 'rxjs/operators';
+import { SyncState, SyncStatus } from '../entities/sync-state.entity';
+
+export interface PartitionEvent {
+  type:
+    | 'partition_detected'
+    | 'partition_resolved'
+    | 'recovery_started'
+    | 'recovery_completed';
+  timestamp: Date;
+  duration?: number;
+  affectedEntities: string[];
+  metadata?: any;
+}
+
+export interface PartitionMetrics {
+  partitionCount: number;
+  totalPartitionTime: number;
+  averageRecoveryTime: number;
+  entitiesAffected: number;
+  dataLoss: boolean;
+}
+
+@Injectable()
+export class PartitionHandler {
+  private readonly logger = new Logger(PartitionHandler.name);
+  private server: Server;
+  private isPartitioned = new BehaviorSubject<boolean>(false);
+  private partitionEvents = new Subject<PartitionEvent>();
+  private metrics = new BehaviorSubject<PartitionMetrics>({
+    partitionCount: 0,
+    totalPartitionTime: 0,
+    averageRecoveryTime: 0,
+    entitiesAffected: 0,
+    dataLoss: false,
+  });
+  private partitionStartTime: number = 0;
+  private recoveryAttempts = 0;
+  private maxRecoveryAttempts = 5;
+
+  constructor(
+    private configService: ConfigService,
+    @InjectRepository(SyncState)
+    private syncStateRepository: Repository<SyncState>,
+    private dataSource: DataSource,
+  ) {
+    const stellarConfig = this.configService.get('stellar');
+    this.server = new Server(stellarConfig.horizonUrl);
+  }
+
+  async handlePartition(): Promise<void> {
+    this.logger.warn('Handling network partition');
+    this.partitionStartTime = Date.now();
+    this.isPartitioned.next(true);
+
+    // Log partition event
+    this.partitionEvents.next({
+      type: 'partition_detected',
+      timestamp: new Date(),
+      affectedEntities: await this.getAffectedEntities(),
+    });
+
+    try {
+      // Step 1: Pause all sync operations
+      await this.pauseSyncOperations();
+
+      // Step 2: Enter quarantine mode
+      await this.enterQuarantineMode();
+
+      // Step 3: Start recovery monitoring
+      await this.startRecoveryMonitoring();
+
+      // Step 4: Begin graceful degradation
+      await this.enableGracefulDegradation();
+
+      this.logger.log('Partition handling initialized');
+    } catch (error) {
+      this.logger.error('Error during partition handling', error);
+      throw error;
+    }
+  }
+
+  private async pauseSyncOperations(): Promise<void> {
+    const syncStates = await this.syncStateRepository.find({
+      where: { status: SyncStatus.SYNCING },
+    });
+
+    for (const syncState of syncStates) {
+      syncState.status = SyncStatus.PARTITIONED;
+      syncState.partitionStartTime = this.partitionStartTime;
+      await this.syncStateRepository.save(syncState);
+    }
+
+    this.logger.log(`Paused ${syncStates.length} sync operations`);
+  }
+
+  private async enterQuarantineMode(): Promise<void> {
+    // Implement quarantine mode logic
+    // This might include:
+    // - Read-only mode for affected services
+    // - Cache-only operations
+    // - Limited functionality
+
+    this.logger.log('Entered quarantine mode');
+  }
+
+  private async startRecoveryMonitoring(): Promise<void> {
+    this.recoveryAttempts = 0;
+
+    interval(10000) // Check every 10 seconds
+      .pipe(
+        takeWhile(() => this.isPartitioned.value),
+        switchMap(() => this.checkNetworkRecovery()),
+        catchError((error) => {
+          this.logger.error('Error during recovery monitoring', error);
+          return [];
+        }),
+      )
+      .subscribe((isRecovered) => {
+        if (isRecovered) {
+          this.initiateRecovery();
+        } else {
+          this.recoveryAttempts++;
+          if (this.recoveryAttempts >= this.maxRecoveryAttempts) {
+            this.logger.error('Max recovery attempts reached, escalating');
+            this.escalatePartition();
+          }
+        }
+      });
+  }
+
+  private async checkNetworkRecovery(): Promise<boolean> {
+    try {
+      // Check if we can reach the Stellar network
+      const latestLedger = await this.server
+        .ledgers()
+        .order('desc')
+        .limit(1)
+        .call();
+
+      if (!latestLedger.records || latestLedger.records.length === 0) {
+        return false;
+      }
+
+      // Check if ledger progression is normal
+      const currentLedger = latestLedger.records[0].sequence;
+      const syncStates = await this.syncStateRepository.find();
+
+      let maxGap = 0;
+      for (const syncState of syncStates) {
+        const gap = currentLedger - syncState.lastLedgerSequence;
+        maxGap = Math.max(maxGap, gap);
+      }
+
+      // Consider network recovered if gap is less than 10 ledgers
+      return maxGap < 10;
+    } catch (error) {
+      this.logger.debug('Network not yet recovered', error);
+      return false;
+    }
+  }
+
+  private async initiateRecovery(): Promise<void> {
+    this.logger.log('Network recovered, initiating recovery process');
+
+    this.partitionEvents.next({
+      type: 'recovery_started',
+      timestamp: new Date(),
+      affectedEntities: await this.getAffectedEntities(),
+    });
+
+    const recoveryStartTime = Date.now();
+
+    try {
+      // Step 1: Validate data integrity
+      await this.validateDataIntegrity();
+
+      // Step 2: Resume sync operations
+      await this.resumeSyncOperations();
+
+      // Step 3: Catch up on missed ledgers
+      await this.catchUpMissedLedgers();
+
+      // Step 4: Exit quarantine mode
+      await this.exitQuarantineMode();
+
+      // Step 5: Update metrics
+      await this.updateRecoveryMetrics(recoveryStartTime);
+
+      this.isPartitioned.next(false);
+      this.recoveryAttempts = 0;
+
+      this.partitionEvents.next({
+        type: 'recovery_completed',
+        timestamp: new Date(),
+        duration: Date.now() - recoveryStartTime,
+        affectedEntities: await this.getAffectedEntities(),
+      });
+
+      this.logger.log('Recovery completed successfully');
+    } catch (error) {
+      this.logger.error('Recovery failed', error);
+      await this.handleRecoveryFailure(error);
+    }
+  }
+
+  private async validateDataIntegrity(): Promise<void> {
+    this.logger.log('Validating data integrity after partition');
+
+    const syncStates = await this.syncStateRepository.find();
+
+    for (const syncState of syncStates) {
+      try {
+        // Validate that the last synced ledger is still valid
+        const ledger = await this.server
+          .ledgers()
+          .ledger(syncState.lastLedgerSequence)
+          .call();
+
+        if (!ledger) {
+          this.logger.warn(
+            `Invalid ledger sequence ${syncState.lastLedgerSequence} for ${syncState.entityType}`,
+          );
+          syncState.lastLedgerSequence = await this.getSafeStartingPoint();
+          await this.syncStateRepository.save(syncState);
+        }
+      } catch (error) {
+        this.logger.error(
+          `Error validating integrity for ${syncState.entityType}`,
+          error,
+        );
+        syncState.lastLedgerSequence = await this.getSafeStartingPoint();
+        await this.syncStateRepository.save(syncState);
+      }
+    }
+  }
+
+  private async resumeSyncOperations(): Promise<void> {
+    const syncStates = await this.syncStateRepository.find({
+      where: { status: SyncStatus.PARTITIONED },
+    });
+
+    for (const syncState of syncStates) {
+      syncState.status = SyncStatus.IDLE;
+      syncState.partitionStartTime = null;
+      await this.syncStateRepository.save(syncState);
+    }
+
+    this.logger.log(`Resumed ${syncStates.length} sync operations`);
+  }
+
+  private async catchUpMissedLedgers(): Promise<void> {
+    const currentLedger = await this.getCurrentLedgerSequence();
+    const syncStates = await this.syncStateRepository.find();
+
+    for (const syncState of syncStates) {
+      const missedLedgers = currentLedger - syncState.lastLedgerSequence;
+
+      if (missedLedgers > 0) {
+        this.logger.log(
+          `Catching up ${missedLedgers} missed ledgers for ${syncState.entityType}`,
+        );
+
+        // Update target ledger to trigger catch-up sync
+        syncState.targetLedgerSequence = currentLedger;
+        syncState.status = SyncStatus.RECOVERING;
+        await this.syncStateRepository.save(syncState);
+      }
+    }
+  }
+
+  private async exitQuarantineMode(): Promise<void> {
+    // Restore full functionality
+    this.logger.log('Exited quarantine mode');
+  }
+
+  private async updateRecoveryMetrics(
+    recoveryStartTime: number,
+  ): Promise<void> {
+    const recoveryDuration = Date.now() - recoveryStartTime;
+    const partitionDuration = recoveryStartTime - this.partitionStartTime;
+
+    const currentMetrics = this.metrics.value;
+    const newMetrics = {
+      ...currentMetrics,
+      partitionCount: currentMetrics.partitionCount + 1,
+      totalPartitionTime: currentMetrics.totalPartitionTime + partitionDuration,
+      averageRecoveryTime:
+        (currentMetrics.averageRecoveryTime + recoveryDuration) / 2,
+      entitiesAffected: await this.getAffectedEntityCount(),
+    };
+
+    this.metrics.next(newMetrics);
+  }
+
+  private async handleRecoveryFailure(error: any): Promise<void> {
+    this.logger.error('Recovery failed, implementing fallback strategy', error);
+
+    // Fallback strategy: reset to a known good state
+    const safeStartingPoint = await this.getSafeStartingPoint();
+    const syncStates = await this.syncStateRepository.find();
+
+    for (const syncState of syncStates) {
+      syncState.lastLedgerSequence = safeStartingPoint;
+      syncState.status = SyncStatus.RECOVERING;
+      syncState.retryCount++;
+      await this.syncStateRepository.save(syncState);
+    }
+
+    // If retry count is too high, mark as data loss scenario
+    const hasHighRetryCount = syncStates.some((state) => state.retryCount > 3);
+    if (hasHighRetryCount) {
+      const currentMetrics = this.metrics.value;
+      this.metrics.next({
+        ...currentMetrics,
+        dataLoss: true,
+      });
+
+      this.logger.error(
+        'Data loss scenario detected, manual intervention required',
+      );
+    }
+  }
+
+  private async escalatePartition(): Promise<void> {
+    this.logger.error(
+      'Partition escalation triggered - manual intervention required',
+    );
+
+    // Send alerts, create tickets, etc.
+    // This would integrate with your monitoring/alerting system
+  }
+
+  private async enableGracefulDegradation(): Promise<void> {
+    // Implement graceful degradation logic
+    // This might include:
+    // - Serving cached data
+    // - Limited write operations
+    // - Read-only mode for non-critical functions
+
+    this.logger.log('Enabled graceful degradation mode');
+  }
+
+  private async getCurrentLedgerSequence(): Promise<number> {
+    try {
+      const latestLedger = await this.server
+        .ledgers()
+        .order('desc')
+        .limit(1)
+        .call();
+      return latestLedger.records[0]?.sequence || 0;
+    } catch (error) {
+      this.logger.error('Failed to get current ledger sequence', error);
+      return 0;
+    }
+  }
+
+  private async getSafeStartingPoint(): Promise<number> {
+    try {
+      // Get a ledger from a few minutes ago to ensure it's stable
+      const currentLedger = await this.getCurrentLedgerSequence();
+      return Math.max(0, currentLedger - 100); // Go back 100 ledgers as safety margin
+    } catch (error) {
+      this.logger.error('Failed to get safe starting point', error);
+      return 0;
+    }
+  }
+
+  private async getAffectedEntities(): Promise<string[]> {
+    const syncStates = await this.syncStateRepository.find({
+      where: { status: SyncStatus.PARTITIONED },
+    });
+
+    return syncStates.map((state) => `${state.entityType}:${state.entityId}`);
+  }
+
+  private async getAffectedEntityCount(): Promise<number> {
+    const syncStates = await this.syncStateRepository.find({
+      where: { status: SyncStatus.PARTITIONED },
+    });
+
+    return syncStates.length;
+  }
+
+  // Public API methods
+  getPartitionStatus() {
+    return this.isPartitioned.asObservable();
+  }
+
+  getPartitionEvents() {
+    return this.partitionEvents.asObservable();
+  }
+
+  getMetrics() {
+    return this.metrics.asObservable();
+  }
+
+  async forceRecovery(): Promise<void> {
+    if (this.isPartitioned.value) {
+      await this.initiateRecovery();
+    }
+  }
+
+  async isInPartition(): Promise<boolean> {
+    return this.isPartitioned.value;
+  }
+
+  getPartitionStatistics() {
+    return this.metrics.value;
+  }
+
+  async testPartitionRecovery(): Promise<void> {
+    this.logger.log('Testing partition recovery procedures');
+
+    // Simulate partition detection and recovery
+    await this.handlePartition();
+
+    // Wait a bit then simulate recovery
+    setTimeout(async () => {
+      await this.initiateRecovery();
+    }, 5000);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/index.html b/coverage/lcov-report/src/sync/index.html new file mode 100644 index 0000000..4d41d50 --- /dev/null +++ b/coverage/lcov-report/src/sync/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/sync + + + + + + + + + +
+
+

All files src/sync

+
+ +
+ 0% + Statements + 0/456 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/456 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
sync.module.ts +
+
0%0/290%0/10%0/10%0/29
sync.service.ts +
+
0%0/4270%0/10%0/10%0/427
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/optimizers/index.html b/coverage/lcov-report/src/sync/optimizers/index.html new file mode 100644 index 0000000..cf89fca --- /dev/null +++ b/coverage/lcov-report/src/sync/optimizers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sync/optimizers + + + + + + + + + +
+
+

All files src/sync/optimizers

+
+ +
+ 0% + Statements + 0/539 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/539 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
performance.optimizer.ts +
+
0%0/5390%0/10%0/10%0/539
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/optimizers/performance.optimizer.ts.html b/coverage/lcov-report/src/sync/optimizers/performance.optimizer.ts.html new file mode 100644 index 0000000..1a99d13 --- /dev/null +++ b/coverage/lcov-report/src/sync/optimizers/performance.optimizer.ts.html @@ -0,0 +1,1702 @@ + + + + + + Code coverage report for src/sync/optimizers/performance.optimizer.ts + + + + + + + + + +
+
+

All files / src/sync/optimizers performance.optimizer.ts

+
+ +
+ 0% + Statements + 0/539 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/539 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository } from 'typeorm';
+import { SyncState } from '../entities/sync-state.entity';
+
+export interface PerformanceMetrics {
+  batchProcessingTime: number;
+  transactionProcessingTime: number;
+  memoryUsage: number;
+  cpuUsage: number;
+  throughput: number;
+  latency: number;
+  errorRate: number;
+}
+
+export interface OptimizationStrategy {
+  batchSize: number;
+  parallelism: number;
+  cacheSize: number;
+  retryAttempts: number;
+  timeoutMs: number;
+}
+
+export interface PerformanceReport {
+  timestamp: Date;
+  metrics: PerformanceMetrics;
+  strategy: OptimizationStrategy;
+  recommendations: string[];
+}
+
+@Injectable()
+export class PerformanceOptimizer {
+  private readonly logger = new Logger(PerformanceOptimizer.name);
+  private metricsHistory: PerformanceMetrics[] = [];
+  private currentStrategy: OptimizationStrategy;
+  private cache = new Map<string, any>();
+  private performanceThresholds = {
+    maxLatencyMs: 5000,
+    minThroughputTps: 100,
+    maxMemoryUsageMB: 1024,
+    maxCpuUsagePercent: 80,
+    maxErrorRatePercent: 5,
+  };
+
+  constructor(
+    private configService: ConfigService,
+    @InjectRepository(SyncState)
+    private syncStateRepository: Repository<SyncState>,
+  ) {
+    this.currentStrategy = this.initializeStrategy();
+    this.startPerformanceMonitoring();
+  }
+
+  private initializeStrategy(): OptimizationStrategy {
+    return {
+      batchSize: parseInt(process.env.SYNC_BATCH_SIZE || '100'),
+      parallelism: parseInt(process.env.SYNC_PARALLELISM || '4'),
+      cacheSize: parseInt(process.env.SYNC_CACHE_SIZE || '1000'),
+      retryAttempts: parseInt(process.env.SYNC_RETRY_ATTEMPTS || '3'),
+      timeoutMs: parseInt(process.env.SYNC_TIMEOUT_MS || '30000'),
+    };
+  }
+
+  private startPerformanceMonitoring(): void {
+    setInterval(() => {
+      this.collectMetrics();
+      this.analyzePerformance();
+      this.optimizeStrategy();
+    }, 30000); // Monitor every 30 seconds
+  }
+
+  private collectMetrics(): void {
+    const metrics: PerformanceMetrics = {
+      batchProcessingTime: this.getAverageBatchProcessingTime(),
+      transactionProcessingTime: this.getAverageTransactionProcessingTime(),
+      memoryUsage: this.getMemoryUsage(),
+      cpuUsage: this.getCpuUsage(),
+      throughput: this.getThroughput(),
+      latency: this.getLatency(),
+      errorRate: this.getErrorRate(),
+    };
+
+    this.metricsHistory.push(metrics);
+
+    // Keep only last 100 measurements
+    if (this.metricsHistory.length > 100) {
+      this.metricsHistory.shift();
+    }
+  }
+
+  private analyzePerformance(): void {
+    if (this.metricsHistory.length < 5) return;
+
+    const recentMetrics = this.metricsHistory.slice(-5);
+    const avgMetrics = this.calculateAverageMetrics(recentMetrics);
+
+    const issues: string[] = [];
+
+    if (avgMetrics.latency > this.performanceThresholds.maxLatencyMs) {
+      issues.push(
+        `High latency: ${avgMetrics.latency}ms > ${this.performanceThresholds.maxLatencyMs}ms`,
+      );
+    }
+
+    if (avgMetrics.throughput < this.performanceThresholds.minThroughputTps) {
+      issues.push(
+        `Low throughput: ${avgMetrics.throughput} TPS < ${this.performanceThresholds.minThroughputTps} TPS`,
+      );
+    }
+
+    if (avgMetrics.memoryUsage > this.performanceThresholds.maxMemoryUsageMB) {
+      issues.push(
+        `High memory usage: ${avgMetrics.memoryUsage}MB > ${this.performanceThresholds.maxMemoryUsageMB}MB`,
+      );
+    }
+
+    if (avgMetrics.cpuUsage > this.performanceThresholds.maxCpuUsagePercent) {
+      issues.push(
+        `High CPU usage: ${avgMetrics.cpuUsage}% > ${this.performanceThresholds.maxCpuUsagePercent}%`,
+      );
+    }
+
+    if (avgMetrics.errorRate > this.performanceThresholds.maxErrorRatePercent) {
+      issues.push(
+        `High error rate: ${avgMetrics.errorRate}% > ${this.performanceThresholds.maxErrorRatePercent}%`,
+      );
+    }
+
+    if (issues.length > 0) {
+      this.logger.warn('Performance issues detected:', issues);
+      this.generatePerformanceReport(issues);
+    }
+  }
+
+  private optimizeStrategy(): void {
+    if (this.metricsHistory.length < 10) return;
+
+    const recentMetrics = this.metricsHistory.slice(-10);
+    const avgMetrics = this.calculateAverageMetrics(recentMetrics);
+
+    let strategyChanged = false;
+
+    // Optimize batch size based on latency and throughput
+    if (avgMetrics.latency > this.performanceThresholds.maxLatencyMs) {
+      if (this.currentStrategy.batchSize > 10) {
+        this.currentStrategy.batchSize = Math.max(
+          10,
+          Math.floor(this.currentStrategy.batchSize * 0.8),
+        );
+        strategyChanged = true;
+        this.logger.log(
+          `Reduced batch size to ${this.currentStrategy.batchSize} due to high latency`,
+        );
+      }
+    } else if (
+      avgMetrics.throughput < this.performanceThresholds.minThroughputTps
+    ) {
+      if (this.currentStrategy.batchSize < 500) {
+        this.currentStrategy.batchSize = Math.min(
+          500,
+          Math.floor(this.currentStrategy.batchSize * 1.2),
+        );
+        strategyChanged = true;
+        this.logger.log(
+          `Increased batch size to ${this.currentStrategy.batchSize} to improve throughput`,
+        );
+      }
+    }
+
+    // Optimize parallelism based on CPU usage
+    if (avgMetrics.cpuUsage > this.performanceThresholds.maxCpuUsagePercent) {
+      if (this.currentStrategy.parallelism > 1) {
+        this.currentStrategy.parallelism = Math.max(
+          1,
+          this.currentStrategy.parallelism - 1,
+        );
+        strategyChanged = true;
+        this.logger.log(
+          `Reduced parallelism to ${this.currentStrategy.parallelism} due to high CPU usage`,
+        );
+      }
+    } else if (
+      avgMetrics.cpuUsage < 50 &&
+      avgMetrics.throughput < this.performanceThresholds.minThroughputTps
+    ) {
+      if (this.currentStrategy.parallelism < 8) {
+        this.currentStrategy.parallelism = Math.min(
+          8,
+          this.currentStrategy.parallelism + 1,
+        );
+        strategyChanged = true;
+        this.logger.log(
+          `Increased parallelism to ${this.currentStrategy.parallelism} to improve throughput`,
+        );
+      }
+    }
+
+    // Optimize cache size based on memory usage
+    if (avgMetrics.memoryUsage > this.performanceThresholds.maxMemoryUsageMB) {
+      if (this.currentStrategy.cacheSize > 100) {
+        this.currentStrategy.cacheSize = Math.max(
+          100,
+          Math.floor(this.currentStrategy.cacheSize * 0.8),
+        );
+        this.trimCache();
+        strategyChanged = true;
+        this.logger.log(
+          `Reduced cache size to ${this.currentStrategy.cacheSize} due to high memory usage`,
+        );
+      }
+    } else if (
+      avgMetrics.memoryUsage < 512 &&
+      this.currentStrategy.cacheSize < 5000
+    ) {
+      this.currentStrategy.cacheSize = Math.min(
+        5000,
+        Math.floor(this.currentStrategy.cacheSize * 1.2),
+      );
+      strategyChanged = true;
+      this.logger.log(
+        `Increased cache size to ${this.currentStrategy.cacheSize} to improve performance`,
+      );
+    }
+
+    if (strategyChanged) {
+      this.logger.log('Performance strategy optimized', this.currentStrategy);
+    }
+  }
+
+  calculateOptimalBatchSize(ledgerCount: number): number {
+    const baseBatchSize = this.currentStrategy.batchSize;
+
+    // Adjust based on ledger count
+    if (ledgerCount < 50) {
+      return Math.min(ledgerCount, baseBatchSize);
+    } else if (ledgerCount > 1000) {
+      return Math.min(baseBatchSize * 2, 500);
+    }
+
+    return baseBatchSize;
+  }
+
+  async optimizeBatchProcessing(transactions: any[]): Promise<any[]> {
+    const startTime = Date.now();
+
+    try {
+      // Apply caching
+      const cachedTransactions = await this.applyCaching(transactions);
+
+      // Apply parallel processing
+      const processedTransactions =
+        await this.processInParallel(cachedTransactions);
+
+      // Apply deduplication
+      const deduplicatedTransactions = this.deduplicateTransactions(
+        processedTransactions,
+      );
+
+      const processingTime = Date.now() - startTime;
+      this.updateBatchProcessingMetrics(processingTime, transactions.length);
+
+      return deduplicatedTransactions;
+    } catch (error) {
+      this.logger.error('Error in batch processing optimization', error);
+      throw error;
+    }
+  }
+
+  private async applyCaching(transactions: any[]): Promise<any[]> {
+    const uncachedTransactions = [];
+    const cachedResults = [];
+
+    for (const tx of transactions) {
+      const cacheKey = this.generateCacheKey(tx);
+
+      if (this.cache.has(cacheKey)) {
+        cachedResults.push(this.cache.get(cacheKey));
+      } else {
+        uncachedTransactions.push(tx);
+      }
+    }
+
+    // Process uncached transactions
+    const processedUncached =
+      await this.processTransactions(uncachedTransactions);
+
+    // Cache results
+    for (let i = 0; i < uncachedTransactions.length; i++) {
+      const tx = uncachedTransactions[i];
+      const result = processedUncached[i];
+      const cacheKey = this.generateCacheKey(tx);
+
+      this.cache.set(cacheKey, result);
+    }
+
+    return [...cachedResults, ...processedUncached];
+  }
+
+  private async processInParallel(transactions: any[]): Promise<any[]> {
+    const chunkSize = Math.ceil(
+      transactions.length / this.currentStrategy.parallelism,
+    );
+    const chunks = [];
+
+    for (let i = 0; i < transactions.length; i += chunkSize) {
+      chunks.push(transactions.slice(i, i + chunkSize));
+    }
+
+    const promises = chunks.map((chunk) => this.processTransactions(chunk));
+    const results = await Promise.all(promises);
+
+    return results.flat();
+  }
+
+  private async processTransactions(transactions: any[]): Promise<any[]> {
+    // Placeholder for actual transaction processing
+    return transactions.map((tx) => ({
+      ...tx,
+      processed: true,
+      timestamp: new Date(),
+    }));
+  }
+
+  private deduplicateTransactions(transactions: any[]): any[] {
+    const seen = new Set();
+    return transactions.filter((tx) => {
+      const key = tx.id || tx.hash;
+      if (seen.has(key)) {
+        return false;
+      }
+      seen.add(key);
+      return true;
+    });
+  }
+
+  private generateCacheKey(transaction: any): string {
+    return `${transaction.type}_${transaction.id}_${transaction.hash || ''}`;
+  }
+
+  private trimCache(): void {
+    if (this.cache.size <= this.currentStrategy.cacheSize) {
+      return;
+    }
+
+    // Remove oldest entries (simple LRU)
+    const entries = Array.from(this.cache.entries());
+    const toRemove = entries.slice(
+      0,
+      entries.length - this.currentStrategy.cacheSize,
+    );
+
+    for (const [key] of toRemove) {
+      this.cache.delete(key);
+    }
+  }
+
+  private updateBatchProcessingMetrics(
+    processingTime: number,
+    transactionCount: number,
+  ): void {
+    // Update metrics for performance tracking
+    const metrics: PerformanceMetrics = {
+      batchProcessingTime: processingTime,
+      transactionProcessingTime: processingTime / transactionCount,
+      memoryUsage: this.getMemoryUsage(),
+      cpuUsage: this.getCpuUsage(),
+      throughput: (transactionCount * 1000) / processingTime,
+      latency: processingTime / transactionCount,
+      errorRate: this.getErrorRate(),
+    };
+
+    this.metricsHistory.push(metrics);
+  }
+
+  private calculateAverageMetrics(
+    metrics: PerformanceMetrics[],
+  ): PerformanceMetrics {
+    const sum = metrics.reduce(
+      (acc, metric) => ({
+        batchProcessingTime:
+          acc.batchProcessingTime + metric.batchProcessingTime,
+        transactionProcessingTime:
+          acc.transactionProcessingTime + metric.transactionProcessingTime,
+        memoryUsage: acc.memoryUsage + metric.memoryUsage,
+        cpuUsage: acc.cpuUsage + metric.cpuUsage,
+        throughput: acc.throughput + metric.throughput,
+        latency: acc.latency + metric.latency,
+        errorRate: acc.errorRate + metric.errorRate,
+      }),
+      {
+        batchProcessingTime: 0,
+        transactionProcessingTime: 0,
+        memoryUsage: 0,
+        cpuUsage: 0,
+        throughput: 0,
+        latency: 0,
+        errorRate: 0,
+      },
+    );
+
+    const count = metrics.length;
+    return {
+      batchProcessingTime: sum.batchProcessingTime / count,
+      transactionProcessingTime: sum.transactionProcessingTime / count,
+      memoryUsage: sum.memoryUsage / count,
+      cpuUsage: sum.cpuUsage / count,
+      throughput: sum.throughput / count,
+      latency: sum.latency / count,
+      errorRate: sum.errorRate / count,
+    };
+  }
+
+  private generatePerformanceReport(issues: string[]): void {
+    const report: PerformanceReport = {
+      timestamp: new Date(),
+      metrics: this.metricsHistory[this.metricsHistory.length - 1],
+      strategy: this.currentStrategy,
+      recommendations: this.generateRecommendations(issues),
+    };
+
+    this.logger.warn('Performance Report Generated', report);
+  }
+
+  private generateRecommendations(issues: string[]): string[] {
+    const recommendations: string[] = [];
+
+    if (issues.some((issue) => issue.includes('latency'))) {
+      recommendations.push(
+        'Consider reducing batch size or increasing parallelism',
+      );
+    }
+
+    if (issues.some((issue) => issue.includes('throughput'))) {
+      recommendations.push('Consider increasing batch size or parallelism');
+    }
+
+    if (issues.some((issue) => issue.includes('memory'))) {
+      recommendations.push(
+        'Consider reducing cache size or implementing memory-efficient algorithms',
+      );
+    }
+
+    if (issues.some((issue) => issue.includes('CPU'))) {
+      recommendations.push(
+        'Consider reducing parallelism or optimizing CPU-intensive operations',
+      );
+    }
+
+    if (issues.some((issue) => issue.includes('error rate'))) {
+      recommendations.push('Review error handling and increase retry attempts');
+    }
+
+    return recommendations;
+  }
+
+  // Helper methods for metrics collection
+  private getAverageBatchProcessingTime(): number {
+    if (this.metricsHistory.length === 0) return 0;
+    const recent = this.metricsHistory.slice(-10);
+    return (
+      recent.reduce((sum, m) => sum + m.batchProcessingTime, 0) / recent.length
+    );
+  }
+
+  private getAverageTransactionProcessingTime(): number {
+    if (this.metricsHistory.length === 0) return 0;
+    const recent = this.metricsHistory.slice(-10);
+    return (
+      recent.reduce((sum, m) => sum + m.transactionProcessingTime, 0) /
+      recent.length
+    );
+  }
+
+  private getMemoryUsage(): number {
+    const usage = process.memoryUsage();
+    return usage.heapUsed / 1024 / 1024; // Convert to MB
+  }
+
+  private getCpuUsage(): number {
+    // Simplified CPU usage calculation
+    const usage = process.cpuUsage();
+    return (usage.user + usage.system) / 1000000; // Convert to percentage (simplified)
+  }
+
+  private getThroughput(): number {
+    if (this.metricsHistory.length === 0) return 0;
+    const recent = this.metricsHistory.slice(-5);
+    return recent.reduce((sum, m) => sum + m.throughput, 0) / recent.length;
+  }
+
+  private getLatency(): number {
+    if (this.metricsHistory.length === 0) return 0;
+    const recent = this.metricsHistory.slice(-5);
+    return recent.reduce((sum, m) => sum + m.latency, 0) / recent.length;
+  }
+
+  private getErrorRate(): number {
+    // This would be calculated based on actual error tracking
+    return 0; // Placeholder
+  }
+
+  // Public API methods
+  getCurrentStrategy(): OptimizationStrategy {
+    return { ...this.currentStrategy };
+  }
+
+  getPerformanceMetrics(): PerformanceMetrics {
+    return (
+      this.metricsHistory[this.metricsHistory.length - 1] || {
+        batchProcessingTime: 0,
+        transactionProcessingTime: 0,
+        memoryUsage: 0,
+        cpuUsage: 0,
+        throughput: 0,
+        latency: 0,
+        errorRate: 0,
+      }
+    );
+  }
+
+  updateStrategy(newStrategy: Partial<OptimizationStrategy>): void {
+    this.currentStrategy = { ...this.currentStrategy, ...newStrategy };
+    this.logger.log('Performance strategy updated', this.currentStrategy);
+  }
+
+  clearCache(): void {
+    this.cache.clear();
+    this.logger.log('Performance cache cleared');
+  }
+
+  getCacheStatistics(): { size: number; maxSize: number; hitRate: number } {
+    return {
+      size: this.cache.size,
+      maxSize: this.currentStrategy.cacheSize,
+      hitRate: 0, // Would need to track hits/misses for accurate rate
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/recovery/index.html b/coverage/lcov-report/src/sync/recovery/index.html new file mode 100644 index 0000000..a9bbbd3 --- /dev/null +++ b/coverage/lcov-report/src/sync/recovery/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sync/recovery + + + + + + + + + +
+
+

All files src/sync/recovery

+
+ +
+ 0% + Statements + 0/550 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/550 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
recovery.service.ts +
+
0%0/5500%0/10%0/10%0/550
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/recovery/recovery.service.ts.html b/coverage/lcov-report/src/sync/recovery/recovery.service.ts.html new file mode 100644 index 0000000..5db4fd4 --- /dev/null +++ b/coverage/lcov-report/src/sync/recovery/recovery.service.ts.html @@ -0,0 +1,1735 @@ + + + + + + Code coverage report for src/sync/recovery/recovery.service.ts + + + + + + + + + +
+
+

All files / src/sync/recovery recovery.service.ts

+
+ +
+ 0% + Statements + 0/550 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/550 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource } from 'typeorm';
+import { Server } from '@stellar/stellar-sdk';
+import { interval, Subject, BehaviorSubject } from 'rxjs';
+import { takeWhile, switchMap, catchError } from 'rxjs/operators';
+import { SyncState, SyncStatus, SyncType } from '../entities/sync-state.entity';
+
+export interface RecoveryEvent {
+  type:
+    | 'recovery_started'
+    | 'recovery_progress'
+    | 'recovery_completed'
+    | 'recovery_failed';
+  timestamp: Date;
+  entityType: string;
+  entityId: string;
+  progress?: number;
+  error?: string;
+  metadata?: any;
+}
+
+export interface RecoveryMetrics {
+  totalRecoveries: number;
+  successfulRecoveries: number;
+  failedRecoveries: number;
+  averageRecoveryTime: number;
+  dataLossIncidents: number;
+  lastRecoveryTime?: Date;
+}
+
+export interface RecoveryStrategy {
+  type:
+    | 'full_sync'
+    | 'incremental_sync'
+    | 'checkpoint_restore'
+    | 'manual_intervention';
+  priority: 'low' | 'medium' | 'high' | 'critical';
+  estimatedDuration: number;
+  dataLossRisk: 'none' | 'low' | 'medium' | 'high';
+}
+
+@Injectable()
+export class RecoveryService {
+  private readonly logger = new Logger(RecoveryService.name);
+  private server: Server;
+  private isRecovering = new BehaviorSubject<boolean>(false);
+  private recoveryEvents = new Subject<RecoveryEvent>();
+  private metrics = new BehaviorSubject<RecoveryMetrics>({
+    totalRecoveries: 0,
+    successfulRecoveries: 0,
+    failedRecoveries: 0,
+    averageRecoveryTime: 0,
+    dataLossIncidents: 0,
+  });
+  private activeRecoveries = new Map<string, RecoveryStrategy>();
+
+  constructor(
+    private configService: ConfigService,
+    @InjectRepository(SyncState)
+    private syncStateRepository: Repository<SyncState>,
+    private dataSource: DataSource,
+  ) {
+    const stellarConfig = this.configService.get('stellar');
+    this.server = new Server(stellarConfig.horizonUrl);
+  }
+
+  async initiateRecovery(syncState: SyncState | null): Promise<void> {
+    this.logger.log('Initiating recovery process');
+
+    const recoveryStartTime = Date.now();
+    this.isRecovering.next(true);
+
+    try {
+      if (syncState) {
+        await this.recoverSingleEntity(syncState);
+      } else {
+        await this.recoverAllEntities();
+      }
+
+      const recoveryDuration = Date.now() - recoveryStartTime;
+      await this.updateRecoveryMetrics(true, recoveryDuration);
+
+      this.logger.log(
+        `Recovery completed successfully in ${recoveryDuration}ms`,
+      );
+    } catch (error) {
+      const recoveryDuration = Date.now() - recoveryStartTime;
+      await this.updateRecoveryMetrics(false, recoveryDuration);
+
+      this.logger.error('Recovery failed', error);
+      throw error;
+    } finally {
+      this.isRecovering.next(false);
+    }
+  }
+
+  private async recoverAllEntities(): Promise<void> {
+    const syncStates = await this.syncStateRepository.find({
+      where: [
+        { status: SyncStatus.ERROR },
+        { status: SyncStatus.PARTITIONED },
+        { status: SyncStatus.CONFLICT },
+      ],
+    });
+
+    this.logger.log(`Recovering ${syncStates.length} entities`);
+
+    for (const syncState of syncStates) {
+      try {
+        await this.recoverSingleEntity(syncState);
+      } catch (error) {
+        this.logger.error(
+          `Failed to recover ${syncState.entityType}:${syncState.entityId}`,
+          error,
+        );
+      }
+    }
+  }
+
+  private async recoverSingleEntity(syncState: SyncState): Promise<void> {
+    const recoveryId = `${syncState.entityType}:${syncState.entityId}`;
+
+    this.logger.log(`Starting recovery for ${recoveryId}`);
+
+    this.recoveryEvents.next({
+      type: 'recovery_started',
+      timestamp: new Date(),
+      entityType: syncState.entityType,
+      entityId: syncState.entityId,
+    });
+
+    try {
+      // Determine recovery strategy
+      const strategy = await this.determineRecoveryStrategy(syncState);
+      this.activeRecoveries.set(recoveryId, strategy);
+
+      // Execute recovery based on strategy
+      switch (strategy.type) {
+        case 'full_sync':
+          await this.performFullSync(syncState);
+          break;
+        case 'incremental_sync':
+          await this.performIncrementalSync(syncState);
+          break;
+        case 'checkpoint_restore':
+          await this.performCheckpointRestore(syncState);
+          break;
+        case 'manual_intervention':
+          await this.requestManualIntervention(syncState);
+          break;
+      }
+
+      // Mark as recovered
+      syncState.status = SyncStatus.IDLE;
+      syncState.errorMessage = null;
+      syncState.retryCount = 0;
+      syncState.lastSuccessfulSyncAt = new Date();
+      await this.syncStateRepository.save(syncState);
+
+      this.recoveryEvents.next({
+        type: 'recovery_completed',
+        timestamp: new Date(),
+        entityType: syncState.entityType,
+        entityId: syncState.entityId,
+        metadata: { strategy: strategy.type },
+      });
+
+      this.activeRecoveries.delete(recoveryId);
+    } catch (error) {
+      syncState.status = SyncStatus.ERROR;
+      syncState.errorMessage = error.message;
+      syncState.retryCount++;
+      await this.syncStateRepository.save(syncState);
+
+      this.recoveryEvents.next({
+        type: 'recovery_failed',
+        timestamp: new Date(),
+        entityType: syncState.entityType,
+        entityId: syncState.entityId,
+        error: error.message,
+      });
+
+      throw error;
+    }
+  }
+
+  private async determineRecoveryStrategy(
+    syncState: SyncState,
+  ): Promise<RecoveryStrategy> {
+    const currentLedger = await this.getCurrentLedgerSequence();
+    const ledgerGap = currentLedger - syncState.lastLedgerSequence;
+    const timeSinceLastSync = syncState.lastSuccessfulSyncAt
+      ? Date.now() - syncState.lastSuccessfulSyncAt.getTime()
+      : Infinity;
+
+    // Determine strategy based on various factors
+    if (syncState.retryCount >= 5) {
+      return {
+        type: 'manual_intervention',
+        priority: 'critical',
+        estimatedDuration: 0,
+        dataLossRisk: 'high',
+      };
+    }
+
+    if (ledgerGap > 10000) {
+      return {
+        type: 'checkpoint_restore',
+        priority: 'high',
+        estimatedDuration: 300000, // 5 minutes
+        dataLossRisk: 'low',
+      };
+    }
+
+    if (ledgerGap > 1000 || timeSinceLastSync > 3600000) {
+      // 1 hour
+      return {
+        type: 'full_sync',
+        priority: 'medium',
+        estimatedDuration: 600000, // 10 minutes
+        dataLossRisk: 'none',
+      };
+    }
+
+    return {
+      type: 'incremental_sync',
+      priority: 'low',
+      estimatedDuration: 60000, // 1 minute
+      dataLossRisk: 'none',
+    };
+  }
+
+  private async performFullSync(syncState: SyncState): Promise<void> {
+    this.logger.log(
+      `Performing full sync for ${syncState.entityType}:${syncState.entityId}`,
+    );
+
+    syncState.status = SyncStatus.RECOVERING;
+    syncState.syncType = SyncType.FULL;
+    await this.syncStateRepository.save(syncState);
+
+    const currentLedger = await this.getCurrentLedgerSequence();
+
+    // Reset to a safe starting point
+    syncState.lastLedgerSequence = Math.max(0, currentLedger - 1000);
+    syncState.targetLedgerSequence = currentLedger;
+    await this.syncStateRepository.save(syncState);
+
+    // Process in batches
+    const batchSize = 100;
+    for (
+      let sequence = syncState.lastLedgerSequence;
+      sequence <= currentLedger;
+      sequence += batchSize
+    ) {
+      const endSequence = Math.min(sequence + batchSize - 1, currentLedger);
+
+      try {
+        await this.processLedgerBatch(syncState, sequence, endSequence);
+
+        syncState.lastLedgerSequence = endSequence;
+        await this.syncStateRepository.save(syncState);
+
+        // Report progress
+        const progress =
+          ((endSequence - syncState.lastLedgerSequence + 1000) /
+            (currentLedger - 1000 + 1)) *
+          100;
+        this.recoveryEvents.next({
+          type: 'recovery_progress',
+          timestamp: new Date(),
+          entityType: syncState.entityType,
+          entityId: syncState.entityId,
+          progress: Math.round(progress),
+        });
+      } catch (error) {
+        this.logger.error(
+          `Failed to process batch ${sequence}-${endSequence}`,
+          error,
+        );
+        throw error;
+      }
+    }
+  }
+
+  private async performIncrementalSync(syncState: SyncState): Promise<void> {
+    this.logger.log(
+      `Performing incremental sync for ${syncState.entityType}:${syncState.entityId}`,
+    );
+
+    syncState.status = SyncStatus.RECOVERING;
+    syncState.syncType = SyncType.INCREMENTAL;
+    await this.syncStateRepository.save(syncState);
+
+    const currentLedger = await this.getCurrentLedgerSequence();
+    const startSequence = syncState.lastLedgerSequence + 1;
+
+    // Process missed ledgers
+    await this.processLedgerBatch(syncState, startSequence, currentLedger);
+
+    syncState.lastLedgerSequence = currentLedger;
+    await this.syncStateRepository.save(syncState);
+  }
+
+  private async performCheckpointRestore(syncState: SyncState): Promise<void> {
+    this.logger.log(
+      `Performing checkpoint restore for ${syncState.entityType}:${syncState.entityId}`,
+    );
+
+    // Find the last known good checkpoint
+    const checkpoint = await this.findLastGoodCheckpoint(syncState);
+
+    if (!checkpoint) {
+      throw new Error('No valid checkpoint found for restore');
+    }
+
+    // Restore from checkpoint
+    syncState.lastLedgerSequence = checkpoint.ledgerSequence;
+    syncState.status = SyncStatus.RECOVERING;
+    syncState.syncType = SyncType.RECOVERY;
+    await this.syncStateRepository.save(syncState);
+
+    // Continue with incremental sync from checkpoint
+    await this.performIncrementalSync(syncState);
+  }
+
+  private async requestManualIntervention(syncState: SyncState): Promise<void> {
+    this.logger.error(
+      `Manual intervention required for ${syncState.entityType}:${syncState.entityId}`,
+    );
+
+    // Create incident ticket
+    await this.createIncidentTicket(syncState);
+
+    // Send alert
+    await this.sendAlert(syncState);
+
+    // Mark as awaiting manual intervention
+    syncState.status = SyncStatus.ERROR;
+    syncState.errorMessage = 'Manual intervention required';
+    await this.syncStateRepository.save(syncState);
+  }
+
+  private async processLedgerBatch(
+    syncState: SyncState,
+    startSequence: number,
+    endSequence: number,
+  ): Promise<void> {
+    for (let sequence = startSequence; sequence <= endSequence; sequence++) {
+      try {
+        const ledger = await this.server.ledgers().ledger(sequence).call();
+        const transactions = await this.server
+          .transactions()
+          .forLedger(sequence)
+          .order('asc')
+          .limit(100)
+          .call();
+
+        // Process transactions
+        for (const tx of transactions.records) {
+          await this.processTransactionForRecovery(tx, syncState);
+        }
+      } catch (error) {
+        this.logger.error(`Failed to process ledger ${sequence}`, error);
+        throw error;
+      }
+    }
+  }
+
+  private async processTransactionForRecovery(
+    tx: any,
+    syncState: SyncState,
+  ): Promise<void> {
+    // Implement transaction processing logic for recovery
+    // This would be similar to the normal sync processing but with additional validation
+    try {
+      // Validate transaction
+      await this.validateTransaction(tx);
+
+      // Apply transaction
+      await this.applyTransactionForRecovery(tx);
+
+      syncState.transactionsProcessed++;
+    } catch (error) {
+      this.logger.error(
+        `Failed to process transaction ${tx.id} during recovery`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  private async validateTransaction(tx: any): Promise<void> {
+    // Validate transaction structure and signatures
+    if (!tx.id || !tx.hash) {
+      throw new Error('Invalid transaction structure');
+    }
+
+    // Additional validation logic here
+  }
+
+  private async applyTransactionForRecovery(tx: any): Promise<void> {
+    // Apply transaction to local state
+    // This would update your database based on the transaction
+  }
+
+  private async findLastGoodCheckpoint(
+    syncState: SyncState,
+  ): Promise<{ ledgerSequence: number; timestamp: Date } | null> {
+    // This would query your checkpoints table for the last known good state
+    // For now, return a simple checkpoint based on time
+    const oneHourAgo = new Date(Date.now() - 3600000);
+    const currentLedger = await this.getCurrentLedgerSequence();
+
+    return {
+      ledgerSequence: Math.max(0, currentLedger - 3600), // Approximate 1 hour of ledgers
+      timestamp: oneHourAgo,
+    };
+  }
+
+  private async createIncidentTicket(syncState: SyncState): Promise<void> {
+    // Create incident in your incident management system
+    this.logger.error(
+      `Incident created for ${syncState.entityType}:${syncState.entityId}`,
+    );
+  }
+
+  private async sendAlert(syncState: SyncState): Promise<void> {
+    // Send alert to monitoring system
+    this.logger.error(
+      `Alert sent for ${syncState.entityType}:${syncState.entityId}`,
+    );
+  }
+
+  private async getCurrentLedgerSequence(): Promise<number> {
+    try {
+      const latestLedger = await this.server
+        .ledgers()
+        .order('desc')
+        .limit(1)
+        .call();
+      return latestLedger.records[0]?.sequence || 0;
+    } catch (error) {
+      this.logger.error('Failed to get current ledger sequence', error);
+      return 0;
+    }
+  }
+
+  private async updateRecoveryMetrics(
+    success: boolean,
+    duration: number,
+  ): Promise<void> {
+    const currentMetrics = this.metrics.value;
+    const newMetrics = {
+      ...currentMetrics,
+      totalRecoveries: currentMetrics.totalRecoveries + 1,
+      successfulRecoveries: success
+        ? currentMetrics.successfulRecoveries + 1
+        : currentMetrics.successfulRecoveries,
+      failedRecoveries: !success
+        ? currentMetrics.failedRecoveries + 1
+        : currentMetrics.failedRecoveries,
+      averageRecoveryTime: (currentMetrics.averageRecoveryTime + duration) / 2,
+      lastRecoveryTime: new Date(),
+    };
+
+    this.metrics.next(newMetrics);
+  }
+
+  // Public API methods
+  getRecoveryStatus() {
+    return this.isRecovering.asObservable();
+  }
+
+  getRecoveryEvents() {
+    return this.recoveryEvents.asObservable();
+  }
+
+  getMetrics() {
+    return this.metrics.asObservable();
+  }
+
+  async getActiveRecoveries(): Promise<Map<string, RecoveryStrategy>> {
+    return new Map(this.activeRecoveries);
+  }
+
+  async cancelRecovery(entityType: string, entityId: string): Promise<void> {
+    const recoveryId = `${entityType}:${entityId}`;
+
+    if (this.activeRecoveries.has(recoveryId)) {
+      this.activeRecoveries.delete(recoveryId);
+
+      const syncState = await this.syncStateRepository.findOne({
+        where: { entityType, entityId },
+      });
+
+      if (syncState) {
+        syncState.status = SyncStatus.ERROR;
+        syncState.errorMessage = 'Recovery cancelled';
+        await this.syncStateRepository.save(syncState);
+      }
+
+      this.logger.log(`Recovery cancelled for ${recoveryId}`);
+    }
+  }
+
+  async forceRecovery(entityType?: string, entityId?: string): Promise<void> {
+    if (entityType && entityId) {
+      const syncState = await this.syncStateRepository.findOne({
+        where: { entityType, entityId },
+      });
+
+      if (syncState) {
+        await this.initiateRecovery(syncState);
+      }
+    } else {
+      await this.initiateRecovery(null);
+    }
+  }
+
+  getRecoveryStatistics() {
+    return this.metrics.value;
+  }
+
+  async testRecoveryProcedures(): Promise<void> {
+    this.logger.log('Testing recovery procedures');
+
+    // Create a test sync state with error status
+    const testSyncState = await this.syncStateRepository.findOne({
+      where: { entityType: 'test', entityId: 'recovery_test' },
+    });
+
+    if (!testSyncState) {
+      // Create test state if it doesn't exist
+      const newState = this.syncStateRepository.create({
+        entityType: 'test',
+        entityId: 'recovery_test',
+        status: SyncStatus.ERROR,
+        lastLedgerSequence: 0,
+        targetLedgerSequence: 0,
+        errorMessage: 'Test error for recovery',
+      });
+      await this.syncStateRepository.save(newState);
+
+      await this.initiateRecovery(newState);
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/resolvers/conflict.resolver.ts.html b/coverage/lcov-report/src/sync/resolvers/conflict.resolver.ts.html new file mode 100644 index 0000000..6e586bb --- /dev/null +++ b/coverage/lcov-report/src/sync/resolvers/conflict.resolver.ts.html @@ -0,0 +1,1624 @@ + + + + + + Code coverage report for src/sync/resolvers/conflict.resolver.ts + + + + + + + + + +
+
+

All files / src/sync/resolvers conflict.resolver.ts

+
+ +
+ 0% + Statements + 0/513 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/513 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource } from 'typeorm';
+import { Horizon } from '@stellar/stellar-sdk';
+import { SyncState, SyncStatus } from '../entities/sync-state.entity';
+
+export interface Conflict {
+  type:
+    | 'double_spend'
+    | 'state_mismatch'
+    | 'sequence_conflict'
+    | 'balance_mismatch';
+  severity: 'low' | 'medium' | 'high' | 'critical';
+  description: string;
+  onChainData: any;
+  offChainData: any;
+  affectedAccounts: string[];
+  resolutionStrategy?: ConflictResolutionStrategy;
+}
+
+export interface ConflictResolution {
+  conflictId: string;
+  strategy: ConflictResolutionStrategy;
+  resolution: any;
+  timestamp: Date;
+  resolvedBy: 'automatic' | 'manual';
+}
+
+export enum ConflictResolutionStrategy {
+  PREFER_ON_CHAIN = 'prefer_on_chain',
+  PREFER_OFF_CHAIN = 'prefer_off_chain',
+  MERGE = 'merge',
+  MANUAL_REVIEW = 'manual_review',
+  ROLLBACK = 'rollback',
+  IGNORE = 'ignore',
+}
+
+@Injectable()
+export class ConflictResolver {
+  private readonly logger = new Logger(ConflictResolver.name);
+  private conflictCache = new Map<string, Conflict>();
+  private resolutionHistory = new Map<string, ConflictResolution>();
+
+  constructor(
+    @InjectRepository(SyncState)
+    private syncStateRepository: Repository<SyncState>,
+    private dataSource: DataSource,
+  ) {}
+
+  async detectConflict(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+  ): Promise<Conflict | null> {
+    try {
+      const txHash = transaction.hash;
+
+      // Check cache first
+      if (this.conflictCache.has(txHash)) {
+        return this.conflictCache.get(txHash);
+      }
+
+      // Detect different types of conflicts
+      const conflicts = await Promise.all([
+        this.detectDoubleSpend(transaction),
+        this.detectStateMismatch(transaction),
+        this.detectSequenceConflict(transaction),
+        this.detectBalanceMismatch(transaction),
+      ]);
+
+      const conflict = conflicts.find((c) => c !== null);
+
+      if (conflict) {
+        this.conflictCache.set(txHash, conflict);
+        await this.logConflict(conflict);
+      }
+
+      return conflict;
+    } catch (error) {
+      this.logger.error(
+        `Error detecting conflict for transaction ${transaction.hash}`,
+        error,
+      );
+      return null;
+    }
+  }
+
+  private async detectDoubleSpend(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+  ): Promise<Conflict | null> {
+    const operations = transaction.operations;
+
+    for (const op of operations) {
+      if (op.type === 'payment' || op.type === 'path_payment') {
+        const sourceAccount = op.source || transaction.source_account;
+
+        // Check if this account has other unconfirmed transactions
+        const pendingTxs = await this.findPendingTransactions(sourceAccount);
+
+        for (const pendingTx of pendingTxs) {
+          if (this.hasOverlappingOperations(op, pendingTx.operations)) {
+            return {
+              type: 'double_spend',
+              severity: 'critical',
+              description: `Double spend detected between transactions ${transaction.hash} and ${pendingTx.hash}`,
+              onChainData: {
+                hash: transaction.hash,
+                operations: operations.length,
+              },
+              offChainData: {
+                hash: pendingTx.hash,
+                operations: pendingTx.operations.length,
+              },
+              affectedAccounts: [sourceAccount],
+              resolutionStrategy: ConflictResolutionStrategy.PREFER_ON_CHAIN,
+            };
+          }
+        }
+      }
+    }
+
+    return null;
+  }
+
+  private async detectStateMismatch(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+  ): Promise<Conflict | null> {
+    try {
+      // Check if the on-chain state matches our off-chain state
+      const sourceAccount = transaction.source_account;
+
+      const onChainAccount = await this.getOnChainAccount(sourceAccount);
+      const offChainAccount = await this.getOffChainAccount(sourceAccount);
+
+      if (onChainAccount && offChainAccount) {
+        const balanceMismatch =
+          Math.abs(
+            parseFloat(onChainAccount.balance) -
+              parseFloat(offChainAccount.balance),
+          ) > 0.0000001; // Account for Stellar precision
+
+        if (balanceMismatch) {
+          return {
+            type: 'state_mismatch',
+            severity: 'high',
+            description: `Balance mismatch for account ${sourceAccount}: on-chain=${onChainAccount.balance}, off-chain=${offChainAccount.balance}`,
+            onChainData: {
+              balance: onChainAccount.balance,
+              sequence: onChainAccount.sequence,
+            },
+            offChainData: {
+              balance: offChainAccount.balance,
+              sequence: offChainAccount.sequence,
+            },
+            affectedAccounts: [sourceAccount],
+            resolutionStrategy: ConflictResolutionStrategy.PREFER_ON_CHAIN,
+          };
+        }
+      }
+    } catch (error) {
+      this.logger.error('Error detecting state mismatch', error);
+    }
+
+    return null;
+  }
+
+  private async detectSequenceConflict(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+  ): Promise<Conflict | null> {
+    try {
+      const sourceAccount = transaction.source_account;
+      const txSequence = transaction.source_account_sequence;
+
+      const onChainAccount = await this.getOnChainAccount(sourceAccount);
+      const offChainAccount = await this.getOffChainAccount(sourceAccount);
+
+      if (onChainAccount && offChainAccount) {
+        const onChainSequence = parseInt(onChainAccount.sequence);
+        const offChainSequence = parseInt(offChainAccount.sequence);
+
+        // Check if transaction sequence is out of order
+        if (txSequence !== onChainSequence + 1) {
+          return {
+            type: 'sequence_conflict',
+            severity: 'medium',
+            description: `Sequence conflict for account ${sourceAccount}: tx=${txSequence}, expected=${onChainSequence + 1}`,
+            onChainData: { sequence: onChainSequence },
+            offChainData: { sequence: offChainSequence },
+            affectedAccounts: [sourceAccount],
+            resolutionStrategy: ConflictResolutionStrategy.PREFER_ON_CHAIN,
+          };
+        }
+      }
+    } catch (error) {
+      this.logger.error('Error detecting sequence conflict', error);
+    }
+
+    return null;
+  }
+
+  private async detectBalanceMismatch(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+  ): Promise<Conflict | null> {
+    try {
+      const operations = transaction.operations;
+
+      for (const op of operations) {
+        if (op.type === 'payment') {
+          const destination = op.destination;
+          const amount = parseFloat(op.amount);
+
+          // Verify the payment can be processed
+          const onChainAccount = await this.getOnChainAccount(
+            transaction.source_account,
+          );
+          if (onChainAccount) {
+            const availableBalance =
+              parseFloat(onChainAccount.balance) -
+              parseFloat(onChainAccount.selling_liabilities);
+
+            if (availableBalance < amount) {
+              return {
+                type: 'balance_mismatch',
+                severity: 'high',
+                description: `Insufficient balance for payment: available=${availableBalance}, required=${amount}`,
+                onChainData: {
+                  balance: onChainAccount.balance,
+                  liabilities: onChainAccount.selling_liabilities,
+                },
+                offChainData: { payment_amount: amount },
+                affectedAccounts: [transaction.source_account, destination],
+                resolutionStrategy: ConflictResolutionStrategy.IGNORE,
+              };
+            }
+          }
+        }
+      }
+    } catch (error) {
+      this.logger.error('Error detecting balance mismatch', error);
+    }
+
+    return null;
+  }
+
+  async resolveConflict(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    conflict: Conflict,
+  ): Promise<any> {
+    const resolutionId = `${transaction.hash}_${Date.now()}`;
+
+    try {
+      let resolution: any;
+      let resolvedBy: 'automatic' | 'manual' = 'automatic';
+
+      switch (conflict.resolutionStrategy) {
+        case ConflictResolutionStrategy.PREFER_ON_CHAIN:
+          resolution = await this.resolvePreferOnChain(transaction, conflict);
+          break;
+
+        case ConflictResolutionStrategy.PREFER_OFF_CHAIN:
+          resolution = await this.resolvePreferOffChain(transaction, conflict);
+          break;
+
+        case ConflictResolutionStrategy.MERGE:
+          resolution = await this.resolveMerge(transaction, conflict);
+          break;
+
+        case ConflictResolutionStrategy.ROLLBACK:
+          resolution = await this.resolveRollback(transaction, conflict);
+          break;
+
+        case ConflictResolutionStrategy.IGNORE:
+          resolution = await this.resolveIgnore(transaction, conflict);
+          break;
+
+        case ConflictResolutionStrategy.MANUAL_REVIEW:
+          resolution = await this.resolveManualReview(transaction, conflict);
+          resolvedBy = 'manual';
+          break;
+
+        default:
+          throw new Error(
+            `Unknown resolution strategy: ${conflict.resolutionStrategy}`,
+          );
+      }
+
+      const conflictResolution: ConflictResolution = {
+        conflictId: resolutionId,
+        strategy: conflict.resolutionStrategy,
+        resolution,
+        timestamp: new Date(),
+        resolvedBy,
+      };
+
+      this.resolutionHistory.set(resolutionId, conflictResolution);
+      await this.logResolution(conflictResolution);
+
+      // Clear from cache
+      this.conflictCache.delete(transaction.hash);
+
+      return resolution;
+    } catch (error) {
+      this.logger.error(
+        `Error resolving conflict for transaction ${transaction.hash}`,
+        error,
+      );
+      throw error;
+    }
+  }
+
+  private async resolvePreferOnChain(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    conflict: Conflict,
+  ): Promise<any> {
+    // Update off-chain state to match on-chain state
+    for (const account of conflict.affectedAccounts) {
+      const onChainAccount = await this.getOnChainAccount(account);
+      if (onChainAccount) {
+        await this.updateOffChainAccount(account, {
+          balance: onChainAccount.balance,
+          sequence: onChainAccount.sequence,
+        });
+      }
+    }
+
+    return {
+      action: 'updated_off_chain_state',
+      accountsUpdated: conflict.affectedAccounts.length,
+      transaction: transaction.hash,
+    };
+  }
+
+  private async resolvePreferOffChain(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    conflict: Conflict,
+  ): Promise<any> {
+    // In this case, we might need to create a corrective transaction
+    // For now, we'll just log and continue with off-chain state
+    return {
+      action: 'maintained_off_chain_state',
+      transaction: transaction.hash,
+      note: 'Off-chain state preserved, on-chain transaction ignored',
+    };
+  }
+
+  private async resolveMerge(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    conflict: Conflict,
+  ): Promise<any> {
+    // Attempt to merge states by applying only non-conflicting operations
+    const validOperations = [];
+
+    for (const op of transaction.operations) {
+      if (await this.isOperationValid(op, conflict)) {
+        validOperations.push(op);
+      }
+    }
+
+    return {
+      action: 'merged_operations',
+      validOperations: validOperations.length,
+      totalOperations: transaction.operations.length,
+      transaction: transaction.hash,
+    };
+  }
+
+  private async resolveRollback(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    conflict: Conflict,
+  ): Promise<any> {
+    // Rollback any changes made by this transaction
+    return {
+      action: 'rolled_back',
+      transaction: transaction.hash,
+      reason: 'Critical conflict detected',
+    };
+  }
+
+  private async resolveIgnore(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    conflict: Conflict,
+  ): Promise<any> {
+    // Simply ignore the conflict and continue
+    return {
+      action: 'ignored',
+      transaction: transaction.hash,
+      reason: conflict.description,
+    };
+  }
+
+  private async resolveManualReview(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    conflict: Conflict,
+  ): Promise<any> {
+    // Flag for manual review
+    await this.flagForManualReview(transaction, conflict);
+
+    return {
+      action: 'flagged_for_manual_review',
+      transaction: transaction.hash,
+      conflictType: conflict.type,
+      severity: conflict.severity,
+    };
+  }
+
+  private async isOperationValid(
+    operation: any,
+    conflict: Conflict,
+  ): Promise<boolean> {
+    // Check if operation doesn't conflict with current state
+    if (conflict.type === 'balance_mismatch' && operation.type === 'payment') {
+      return false;
+    }
+
+    return true;
+  }
+
+  private async findPendingTransactions(accountId: string): Promise<any[]> {
+    // Find unconfirmed transactions for this account
+    // This would query your pending transactions table
+    return [];
+  }
+
+  private hasOverlappingOperations(op1: any, ops2: any[]): boolean {
+    // Check if operations overlap (e.g., same source account)
+    for (const op2 of ops2) {
+      if (
+        (op1.source || op1.source_account) ===
+        (op2.source || op2.source_account)
+      ) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private async getOnChainAccount(accountId: string): Promise<any> {
+    try {
+      // This would use the Stellar SDK to get account info
+      return null; // Placeholder
+    } catch (error) {
+      return null;
+    }
+  }
+
+  private async getOffChainAccount(accountId: string): Promise<any> {
+    try {
+      // This would query your database for account info
+      return null; // Placeholder
+    } catch (error) {
+      return null;
+    }
+  }
+
+  private async updateOffChainAccount(
+    accountId: string,
+    updates: any,
+  ): Promise<void> {
+    // Update account in your database
+    // Implementation depends on your schema
+  }
+
+  private async logConflict(conflict: Conflict): Promise<void> {
+    // Log conflict for monitoring and analysis
+    this.logger.warn(
+      `Conflict detected: ${conflict.type} - ${conflict.description}`,
+    );
+  }
+
+  private async logResolution(resolution: ConflictResolution): Promise<void> {
+    // Log resolution for monitoring and analysis
+    this.logger.log(
+      `Conflict resolved: ${resolution.conflictId} using ${resolution.strategy}`,
+    );
+  }
+
+  private async flagForManualReview(
+    transaction: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    conflict: Conflict,
+  ): Promise<void> {
+    // Flag transaction for manual review
+    // This could create a ticket, send notification, etc.
+  }
+
+  // Public API methods
+  getConflictStatistics() {
+    return {
+      totalConflicts: this.conflictCache.size,
+      resolvedConflicts: this.resolutionHistory.size,
+      conflictsByType: this.getConflictsByType(),
+      resolutionsByStrategy: this.getResolutionsByStrategy(),
+    };
+  }
+
+  private getConflictsByType() {
+    const stats = {};
+    for (const conflict of this.conflictCache.values()) {
+      stats[conflict.type] = (stats[conflict.type] || 0) + 1;
+    }
+    return stats;
+  }
+
+  private getResolutionsByStrategy() {
+    const stats = {};
+    for (const resolution of this.resolutionHistory.values()) {
+      stats[resolution.strategy] = (stats[resolution.strategy] || 0) + 1;
+    }
+    return stats;
+  }
+
+  clearCache() {
+    this.conflictCache.clear();
+    this.logger.log('Conflict cache cleared');
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/resolvers/index.html b/coverage/lcov-report/src/sync/resolvers/index.html new file mode 100644 index 0000000..1049cbd --- /dev/null +++ b/coverage/lcov-report/src/sync/resolvers/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/sync/resolvers + + + + + + + + + +
+
+

All files src/sync/resolvers

+
+ +
+ 0% + Statements + 0/513 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/513 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
conflict.resolver.ts +
+
0%0/5130%0/10%0/10%0/513
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/sync.module.ts.html b/coverage/lcov-report/src/sync/sync.module.ts.html new file mode 100644 index 0000000..88e9720 --- /dev/null +++ b/coverage/lcov-report/src/sync/sync.module.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/sync/sync.module.ts + + + + + + + + + +
+
+

All files / src/sync sync.module.ts

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { ScheduleModule } from '@nestjs/schedule';
+import { SyncState } from './entities/sync-state.entity';
+import { SyncService } from './sync.service';
+import { ConflictResolver } from './resolvers/conflict.resolver';
+import { PartitionHandler } from './handlers/partition.handler';
+import { PerformanceOptimizer } from './optimizers/performance.optimizer';
+import { RecoveryService } from './recovery/recovery.service';
+
+@Module({
+  imports: [TypeOrmModule.forFeature([SyncState]), ScheduleModule.forRoot()],
+  providers: [
+    SyncService,
+    ConflictResolver,
+    PartitionHandler,
+    PerformanceOptimizer,
+    RecoveryService,
+  ],
+  exports: [
+    SyncService,
+    ConflictResolver,
+    PartitionHandler,
+    PerformanceOptimizer,
+    RecoveryService,
+  ],
+  controllers: [],
+})
+export class SyncModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/sync/sync.service.ts.html b/coverage/lcov-report/src/sync/sync.service.ts.html new file mode 100644 index 0000000..53df091 --- /dev/null +++ b/coverage/lcov-report/src/sync/sync.service.ts.html @@ -0,0 +1,1366 @@ + + + + + + Code coverage report for src/sync/sync.service.ts + + + + + + + + + +
+
+

All files / src/sync sync.service.ts

+
+ +
+ 0% + Statements + 0/427 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/427 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, DataSource, LessThan, MoreThan } from 'typeorm';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { StellarSdk, Server, Horizon } from '@stellar/stellar-sdk';
+import { Subject, BehaviorSubject, interval, from, lastValueFrom } from 'rxjs';
+import {
+  switchMap,
+  takeWhile,
+  catchError,
+  retry,
+  debounceTime,
+} from 'rxjs/operators';
+import { SyncState, SyncStatus, SyncType } from '../entities/sync-state.entity';
+import { ConflictResolver } from '../resolvers/conflict.resolver';
+import { PartitionHandler } from '../handlers/partition.handler';
+import { PerformanceOptimizer } from '../optimizers/performance.optimizer';
+import { RecoveryService } from '../recovery/recovery.service';
+
+export interface SyncMetrics {
+  totalTransactions: number;
+  processedTransactions: number;
+  conflicts: number;
+  errors: number;
+  averageLatency: number;
+  throughput: number;
+}
+
+export interface SyncEvent {
+  type: 'transaction' | 'ledger' | 'conflict' | 'error' | 'partition';
+  data: any;
+  timestamp: Date;
+  ledgerSequence?: number;
+}
+
+@Injectable()
+export class SyncService implements OnModuleInit {
+  private readonly logger = new Logger(SyncService.name);
+  private server: Server;
+  private isSyncing = new BehaviorSubject<boolean>(false);
+  private syncEvents = new Subject<SyncEvent>();
+  private metrics = new BehaviorSubject<SyncMetrics>({
+    totalTransactions: 0,
+    processedTransactions: 0,
+    conflicts: 0,
+    errors: 0,
+    averageLatency: 0,
+    throughput: 0,
+  });
+
+  constructor(
+    private configService: ConfigService,
+    @InjectRepository(SyncState)
+    private syncStateRepository: Repository<SyncState>,
+    private dataSource: DataSource,
+    private conflictResolver: ConflictResolver,
+    private partitionHandler: PartitionHandler,
+    private performanceOptimizer: PerformanceOptimizer,
+    private recoveryService: RecoveryService,
+  ) {}
+
+  async onModuleInit() {
+    const stellarConfig = this.configService.get('stellar');
+    this.server = new Server(stellarConfig.horizonUrl);
+
+    await this.initializeSyncStates();
+    await this.startRealTimeSync();
+
+    this.logger.log('Sync service initialized');
+  }
+
+  private async initializeSyncStates() {
+    const entities = [
+      { type: 'asset', id: 'global' },
+      { type: 'contract', id: 'global' },
+      { type: 'transaction', id: 'global' },
+      { type: 'governance', id: 'global' },
+    ];
+
+    for (const entity of entities) {
+      const existingState = await this.syncStateRepository.findOne({
+        where: { entityType: entity.type, entityId: entity.id },
+      });
+
+      if (!existingState) {
+        const syncState = this.syncStateRepository.create({
+          entityType: entity.type,
+          entityId: entity.id,
+          status: SyncStatus.IDLE,
+          lastLedgerSequence: await this.getCurrentLedgerSequence(),
+          targetLedgerSequence: 0,
+        });
+        await this.syncStateRepository.save(syncState);
+      }
+    }
+  }
+
+  private async getCurrentLedgerSequence(): Promise<number> {
+    try {
+      const latestLedger = await this.server
+        .ledgers()
+        .order('desc')
+        .limit(1)
+        .call();
+      return latestLedger.records[0]?.sequence || 0;
+    } catch (error) {
+      this.logger.error('Failed to get current ledger sequence', error);
+      return 0;
+    }
+  }
+
+  async startRealTimeSync() {
+    this.logger.log('Starting real-time synchronization');
+
+    interval(5000) // Poll every 5 seconds for sub-5s latency
+      .pipe(
+        switchMap(() => from(this.syncLedger())),
+        retry(3),
+        catchError((error) => {
+          this.logger.error('Sync error, initiating recovery', error);
+          return from(this.handleSyncError(error));
+        }),
+      )
+      .subscribe();
+
+    // Monitor for network partitions
+    interval(30000) // Check every 30 seconds
+      .pipe(
+        switchMap(() => from(this.detectNetworkPartition())),
+        debounceTime(5000),
+      )
+      .subscribe((isPartitioned) => {
+        if (isPartitioned) {
+          this.handleNetworkPartition();
+        }
+      });
+  }
+
+  private async syncLedger(): Promise<void> {
+    if (this.isSyncing.value) {
+      return;
+    }
+
+    this.isSyncing.next(true);
+    const startTime = Date.now();
+
+    try {
+      const currentLedger = await this.getCurrentLedgerSequence();
+      const syncStates = await this.syncStateRepository.find({
+        where: { status: SyncStatus.IDLE },
+      });
+
+      for (const syncState of syncStates) {
+        if (syncState.lastLedgerSequence < currentLedger) {
+          await this.processLedgerRange(
+            syncState,
+            syncState.lastLedgerSequence + 1,
+            currentLedger,
+          );
+        }
+      }
+
+      const latency = Date.now() - startTime;
+      this.updateMetrics(latency);
+    } catch (error) {
+      this.logger.error('Ledger sync failed', error);
+      throw error;
+    } finally {
+      this.isSyncing.next(false);
+    }
+  }
+
+  private async processLedgerRange(
+    syncState: SyncState,
+    startSequence: number,
+    endSequence: number,
+  ) {
+    syncState.status = SyncStatus.SYNCING;
+    syncState.syncType =
+      startSequence === syncState.lastLedgerSequence + 1
+        ? SyncType.INCREMENTAL
+        : SyncType.FULL;
+    await this.syncStateRepository.save(syncState);
+
+    const batchSize = this.performanceOptimizer.calculateOptimalBatchSize(
+      endSequence - startSequence,
+    );
+    const batches = this.createBatches(startSequence, endSequence, batchSize);
+
+    for (const batch of batches) {
+      try {
+        await this.processBatch(syncState, batch.start, batch.end);
+
+        syncState.lastLedgerSequence = batch.end;
+        syncState.lastSyncAt = new Date();
+        syncState.transactionsProcessed += batch.end - batch.start + 1;
+        await this.syncStateRepository.save(syncState);
+
+        this.syncEvents.next({
+          type: 'ledger',
+          data: { start: batch.start, end: batch.end },
+          timestamp: new Date(),
+          ledgerSequence: batch.end,
+        });
+      } catch (error) {
+        await this.handleBatchError(syncState, error, batch);
+      }
+    }
+
+    syncState.status = SyncStatus.IDLE;
+    syncState.lastSuccessfulSyncAt = new Date();
+    await this.syncStateRepository.save(syncState);
+  }
+
+  private createBatches(start: number, end: number, batchSize: number) {
+    const batches = [];
+    for (let i = start; i <= end; i += batchSize) {
+      batches.push({
+        start: i,
+        end: Math.min(i + batchSize - 1, end),
+      });
+    }
+    return batches;
+  }
+
+  private async processBatch(
+    syncState: SyncState,
+    startSequence: number,
+    endSequence: number,
+  ) {
+    const transactions = [];
+
+    for (let sequence = startSequence; sequence <= endSequence; sequence++) {
+      try {
+        const ledger = await this.server.ledgers().ledger(sequence).call();
+        const txs = await this.server
+          .transactions()
+          .forLedger(sequence)
+          .order('asc')
+          .limit(100)
+          .call();
+
+        for (const tx of txs.records) {
+          const processedTx = await this.processTransaction(tx, syncState);
+          if (processedTx) {
+            transactions.push(processedTx);
+          }
+        }
+      } catch (error) {
+        this.logger.error(`Failed to process ledger ${sequence}`, error);
+        throw error;
+      }
+    }
+
+    // Apply performance optimizations
+    await this.performanceOptimizer.optimizeBatchProcessing(transactions);
+  }
+
+  private async processTransaction(
+    tx: Horizon.BaseResponse<Horizon.TransactionResponse>,
+    syncState: SyncState,
+  ) {
+    try {
+      // Check for conflicts
+      const conflict = await this.conflictResolver.detectConflict(tx);
+      if (conflict) {
+        syncState.conflictCount++;
+        await this.syncStateRepository.save(syncState);
+
+        this.syncEvents.next({
+          type: 'conflict',
+          data: { transaction: tx.id, conflict },
+          timestamp: new Date(),
+        });
+
+        return await this.conflictResolver.resolveConflict(tx, conflict);
+      }
+
+      // Process the transaction based on its type
+      const processedTx = await this.applyTransaction(tx);
+
+      this.syncEvents.next({
+        type: 'transaction',
+        data: processedTx,
+        timestamp: new Date(),
+      });
+
+      return processedTx;
+    } catch (error) {
+      this.logger.error(`Failed to process transaction ${tx.id}`, error);
+      syncState.retryCount++;
+      await this.syncStateRepository.save(syncState);
+      throw error;
+    }
+  }
+
+  private async applyTransaction(
+    tx: Horizon.BaseResponse<Horizon.TransactionResponse>,
+  ) {
+    // Implementation would depend on specific business logic
+    // This is a placeholder for transaction processing
+    return {
+      id: tx.id,
+      ledger: tx.ledger,
+      operationCount: tx.operations.length,
+      processedAt: new Date(),
+    };
+  }
+
+  private async handleBatchError(
+    syncState: SyncState,
+    error: any,
+    batch: { start: number; end: number },
+  ) {
+    syncState.status = SyncStatus.ERROR;
+    syncState.errorMessage = error.message;
+    syncState.retryCount++;
+    await this.syncStateRepository.save(syncState);
+
+    this.syncEvents.next({
+      type: 'error',
+      data: { error: error.message, batch },
+      timestamp: new Date(),
+    });
+
+    // If retry count exceeds threshold, initiate recovery
+    if (syncState.retryCount > 3) {
+      await this.recoveryService.initiateRecovery(syncState);
+    }
+  }
+
+  private async detectNetworkPartition(): Promise<boolean> {
+    try {
+      const currentLedger = await this.getCurrentLedgerSequence();
+      const syncStates = await this.syncStateRepository.find();
+
+      for (const syncState of syncStates) {
+        const ledgerGap = currentLedger - syncState.lastLedgerSequence;
+        if (ledgerGap > 100) {
+          // Consider partitioned if gap > 100 ledgers
+          return true;
+        }
+      }
+
+      return false;
+    } catch (error) {
+      this.logger.error('Failed to detect network partition', error);
+      return true; // Assume partition on error
+    }
+  }
+
+  private async handleNetworkPartition() {
+    this.logger.warn('Network partition detected');
+
+    const syncStates = await this.syncStateRepository.find();
+    for (const syncState of syncStates) {
+      syncState.status = SyncStatus.PARTITIONED;
+      syncState.partitionStartTime = Date.now();
+      await this.syncStateRepository.save(syncState);
+    }
+
+    await this.partitionHandler.handlePartition();
+  }
+
+  private async handleSyncError(error: any) {
+    this.logger.error('Sync error occurred', error);
+    await this.recoveryService.initiateRecovery(null);
+  }
+
+  private updateMetrics(latency: number) {
+    const currentMetrics = this.metrics.value;
+    const newMetrics = {
+      ...currentMetrics,
+      averageLatency: (currentMetrics.averageLatency + latency) / 2,
+      throughput:
+        currentMetrics.processedTransactions > 0
+          ? (currentMetrics.processedTransactions * 1000) / latency
+          : 0,
+    };
+    this.metrics.next(newMetrics);
+  }
+
+  // Public API methods
+  getSyncStatus() {
+    return this.isSyncing.asObservable();
+  }
+
+  getSyncEvents() {
+    return this.syncEvents.asObservable();
+  }
+
+  getMetrics() {
+    return this.metrics.asObservable();
+  }
+
+  async getSyncState(entityType: string, entityId: string) {
+    return this.syncStateRepository.findOne({
+      where: { entityType, entityId },
+    });
+  }
+
+  async triggerFullSync(entityType?: string, entityId?: string) {
+    const whereClause = entityType && entityId ? { entityType, entityId } : {};
+
+    const syncStates = await this.syncStateRepository.find({
+      where: whereClause,
+    });
+
+    for (const syncState of syncStates) {
+      syncState.status = SyncStatus.IDLE;
+      syncState.lastLedgerSequence = 0; // Force full sync
+      await this.syncStateRepository.save(syncState);
+    }
+  }
+
+  @Cron(CronExpression.EVERY_HOUR)
+  async cleanupOldStates() {
+    const cutoffDate = new Date();
+    cutoffDate.setHours(cutoffDate.getHours() - 24);
+
+    await this.syncStateRepository.delete({
+      updatedAt: LessThan(cutoffDate),
+      status: SyncStatus.IDLE,
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/analytics/index.html b/coverage/lcov-report/src/tracing/analytics/index.html new file mode 100644 index 0000000..5f2bb13 --- /dev/null +++ b/coverage/lcov-report/src/tracing/analytics/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/tracing/analytics + + + + + + + + + +
+
+

All files src/tracing/analytics

+
+ +
+ 90.32% + Statements + 56/62 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 90.32% + Lines + 56/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
trace-analytics.service.ts +
+
90.32%56/6260%3/5100%3/390.32%56/62
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/analytics/trace-analytics.service.ts.html b/coverage/lcov-report/src/tracing/analytics/trace-analytics.service.ts.html new file mode 100644 index 0000000..0da9bed --- /dev/null +++ b/coverage/lcov-report/src/tracing/analytics/trace-analytics.service.ts.html @@ -0,0 +1,271 @@ + + + + + + Code coverage report for src/tracing/analytics/trace-analytics.service.ts + + + + + + + + + +
+
+

All files / src/tracing/analytics trace-analytics.service.ts

+
+ +
+ 90.32% + Statements + 56/62 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 90.32% + Lines + 56/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +631x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
import { Injectable, Logger } from '@nestjs/common';
+import { Counter, Histogram, metrics, Meter } from '@opentelemetry/api';
+ 
+@Injectable()
+export class TraceAnalyticsService {
+  private readonly logger = new Logger(TraceAnalyticsService.name);
+  private readonly meter: Meter;
+  private readonly requestCounter: Counter;
+  private readonly requestDuration: Histogram;
+  private readonly errorCounter: Counter;
+ 
+  constructor() {
+    this.meter = metrics.getMeter('currentdao-analytics');
+ 
+    this.requestCounter = this.meter.createCounter('http_requests_total', {
+      description: 'Total HTTP requests',
+    });
+ 
+    this.requestDuration = this.meter.createHistogram(
+      'http_request_duration_seconds',
+      {
+        description: 'HTTP request duration in seconds',
+      },
+    );
+ 
+    this.errorCounter = this.meter.createCounter('http_errors_total', {
+      description: 'Total HTTP errors',
+    });
+  }
+ 
+  /**
+   * Track a request's performance and outcome
+   */
+  trackRequest(
+    labels: { method: string; path: string; status: number },
+    durationMs: number,
+  ) {
+    this.requestCounter.add(1, labels);
+    this.requestDuration.record(durationMs / 1000, labels);
+ 
+    if (labels.status >= 400) {
+      this.errorCounter.add(1, labels);
+    }
+ 
+    if (durationMs > 500) {
+      this.logger.warn(
+        `Performance bottleneck detected: ${labels.method} ${labels.path} took ${durationMs}ms`,
+      );
+    }
+  }
+ 
+  /**
+   * Get metrics for a quick health check
+   */
+  getHealthReport() {
+    this.logger.log('Generating trace analytics health report...');
+    return {
+      status: 'Collecting metrics',
+      active_meter: 'currentdao-analytics',
+    };
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/filters/index.html b/coverage/lcov-report/src/tracing/filters/index.html new file mode 100644 index 0000000..ceea02c --- /dev/null +++ b/coverage/lcov-report/src/tracing/filters/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/tracing/filters + + + + + + + + + +
+
+

All files src/tracing/filters

+
+ +
+ 0% + Statements + 0/43 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
tracing.filter.ts +
+
0%0/430%0/10%0/10%0/43
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/filters/tracing.filter.ts.html b/coverage/lcov-report/src/tracing/filters/tracing.filter.ts.html new file mode 100644 index 0000000..a1b92a5 --- /dev/null +++ b/coverage/lcov-report/src/tracing/filters/tracing.filter.ts.html @@ -0,0 +1,214 @@ + + + + + + Code coverage report for src/tracing/filters/tracing.filter.ts + + + + + + + + + +
+
+

All files / src/tracing/filters tracing.filter.ts

+
+ +
+ 0% + Statements + 0/43 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  ExceptionFilter,
+  Catch,
+  ArgumentsHost,
+  HttpException,
+  HttpStatus,
+  Logger,
+} from '@nestjs/common';
+import { Response, Request } from 'express';
+import { trace, context } from '@opentelemetry/api';
+
+@Catch()
+export class TracingFilter implements ExceptionFilter {
+  private readonly logger = new Logger(TracingFilter.name);
+
+  catch(exception: unknown, host: ArgumentsHost) {
+    const ctx = host.switchToHttp();
+    const response = ctx.getResponse<Response>();
+    const request = ctx.getRequest<Request>();
+
+    const status =
+      exception instanceof HttpException
+        ? exception.getStatus()
+        : HttpStatus.INTERNAL_SERVER_ERROR;
+
+    const message = (exception as any).message || 'Internal server error';
+    const traceId = trace.getSpan(context.active())?.spanContext().traceId;
+
+    this.logger.error(
+      `Error on ${request.method} ${request.url}: ${message}`,
+      (exception as any).stack,
+    );
+    this.logger.debug(`Error correlation traceId: ${traceId}`);
+
+    response.status(status).json({
+      statusCode: status,
+      timestamp: new Date().toISOString(),
+      path: request.url,
+      message,
+      traceId, // Return traceId for easier log correlation
+    });
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/index.html b/coverage/lcov-report/src/tracing/index.html new file mode 100644 index 0000000..34a4238 --- /dev/null +++ b/coverage/lcov-report/src/tracing/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/tracing + + + + + + + + + +
+
+

All files src/tracing

+
+ +
+ 0% + Statements + 0/183 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/183 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
opentelemetry.service.ts +
+
0%0/780%0/10%0/10%0/78
otel-sdk.ts +
+
0%0/790%0/10%0/10%0/79
tracing.module.ts +
+
0%0/260%0/10%0/10%0/26
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/instrumentation/custom-instrumentation.ts.html b/coverage/lcov-report/src/tracing/instrumentation/custom-instrumentation.ts.html new file mode 100644 index 0000000..d6bde6d --- /dev/null +++ b/coverage/lcov-report/src/tracing/instrumentation/custom-instrumentation.ts.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/tracing/instrumentation/custom-instrumentation.ts + + + + + + + + + +
+
+

All files / src/tracing/instrumentation custom-instrumentation.ts

+
+ +
+ 0% + Statements + 0/81 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/81 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { trace, Span, SpanStatusCode, Tracer } from '@opentelemetry/api';
+import { Injectable, Logger } from '@nestjs/common';
+
+@Injectable()
+export class CustomInstrumentation {
+  private readonly logger = new Logger(CustomInstrumentation.name);
+  private readonly tracer: Tracer;
+
+  constructor() {
+    this.tracer = trace.getTracer('currentdao-custom-instrumentation');
+  }
+
+  /**
+   * Instrument a function with a custom span
+   * @param name Name of the span
+   * @param fn Function to execute
+   */
+  async instrument<T>(name: string, fn: () => Promise<T>): Promise<T> {
+    return this.tracer.startActiveSpan(name, async (span: Span) => {
+      try {
+        this.logger.debug(`Starting span: ${name}`);
+        const result = await fn();
+        span.setStatus({ code: SpanStatusCode.OK });
+        return result;
+      } catch (error) {
+        span.setStatus({
+          code: SpanStatusCode.ERROR,
+          message: error.message,
+        });
+        span.recordException(error);
+        throw error;
+      } finally {
+        span.end();
+      }
+    });
+  }
+
+  /**
+   * Get the current tracer
+   */
+  getTracer(): Tracer {
+    return this.tracer;
+  }
+}
+
+/**
+ * Decorator to trace a method
+ * @param spanName (Optional) name for the span
+ */
+export function Trace(spanName?: string) {
+  return function (
+    target: any,
+    propertyKey: string,
+    descriptor: PropertyDescriptor,
+  ) {
+    const originalMethod = descriptor.value;
+    const name = spanName || `${target.constructor.name}.${propertyKey}`;
+
+    descriptor.value = function (...args: any[]) {
+      const tracer = trace.getTracer('currentdao-custom-instrumentation');
+      return tracer.startActiveSpan(name, async (span: Span) => {
+        try {
+          const result = await originalMethod.apply(this, args);
+          span.setStatus({ code: SpanStatusCode.OK });
+          return result;
+        } catch (error) {
+          span.setStatus({
+            code: SpanStatusCode.ERROR,
+            message: error.message,
+          });
+          span.recordException(error);
+          throw error;
+        } finally {
+          span.end();
+        }
+      });
+    };
+
+    return descriptor;
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/instrumentation/index.html b/coverage/lcov-report/src/tracing/instrumentation/index.html new file mode 100644 index 0000000..2128fcb --- /dev/null +++ b/coverage/lcov-report/src/tracing/instrumentation/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/tracing/instrumentation + + + + + + + + + +
+
+

All files src/tracing/instrumentation

+
+ +
+ 0% + Statements + 0/81 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/81 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
custom-instrumentation.ts +
+
0%0/810%0/10%0/10%0/81
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/interceptors/index.html b/coverage/lcov-report/src/tracing/interceptors/index.html new file mode 100644 index 0000000..e333264 --- /dev/null +++ b/coverage/lcov-report/src/tracing/interceptors/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/tracing/interceptors + + + + + + + + + +
+
+

All files src/tracing/interceptors

+
+ +
+ 75% + Statements + 72/96 +
+ + +
+ 85.71% + Branches + 6/7 +
+ + +
+ 80% + Functions + 4/5 +
+ + +
+ 75% + Lines + 72/96 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
tracing.interceptor.ts +
+
75%72/9685.71%6/780%4/575%72/96
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/interceptors/tracing.interceptor.ts.html b/coverage/lcov-report/src/tracing/interceptors/tracing.interceptor.ts.html new file mode 100644 index 0000000..614dc06 --- /dev/null +++ b/coverage/lcov-report/src/tracing/interceptors/tracing.interceptor.ts.html @@ -0,0 +1,373 @@ + + + + + + Code coverage report for src/tracing/interceptors/tracing.interceptor.ts + + + + + + + + + +
+
+

All files / src/tracing/interceptors tracing.interceptor.ts

+
+ +
+ 75% + Statements + 72/96 +
+ + +
+ 85.71% + Branches + 6/7 +
+ + +
+ 80% + Functions + 4/5 +
+ + +
+ 75% + Lines + 72/96 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +971x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x + 
import {
+  CallHandler,
+  ExecutionContext,
+  Injectable,
+  NestInterceptor,
+  Logger,
+} from '@nestjs/common';
+import { Observable, tap } from 'rxjs';
+import { trace, Span, SpanStatusCode } from '@opentelemetry/api';
+import { TraceAnalyticsService } from '../analytics/trace-analytics.service';
+ 
+@Injectable()
+export class TracingInterceptor implements NestInterceptor {
+  private readonly logger = new Logger(TracingInterceptor.name);
+ 
+  constructor(private readonly analytics: TraceAnalyticsService) {}
+ 
+  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
+    const request = context.switchToHttp().getRequest();
+    const { method, url } = request;
+    const startTime = Date.now();
+ 
+    const tracer = trace.getTracer('currentdao-http-interceptor');
+    return new Observable((observer) => {
+      tracer.startActiveSpan(`${method} ${url}`, async (span: Span) => {
+        span.setAttributes({
+          'http.method': method,
+          'http.url': url,
+          'http.client_ip': request.ip,
+          'http.user_agent': request.get('user-agent') || 'Unknown',
+        });
+ 
+        const subscription = next
+          .handle()
+          .pipe(
+            tap({
+              next: (data) => {
+                const response = context.switchToHttp().getResponse();
+                const duration = Date.now() - startTime;
+                const statusCode = response.statusCode;
+ 
+                span.setAttribute('http.status_code', statusCode);
+                span.setStatus({ code: SpanStatusCode.OK });
+ 
+                this.analytics.trackRequest(
+                  {
+                    method,
+                    path: url,
+                    status: statusCode,
+                  },
+                  duration,
+                );
+ 
+                this.logger.debug(
+                  `${method} ${url} completed in ${duration}ms`,
+                );
+              },
+              error: (error) => {
+                const duration = Date.now() - startTime;
+                const statusCode = error.status || 500;
+
+                span.setStatus({
+                  code: SpanStatusCode.ERROR,
+                  message: error.message,
+                });
+                span.setAttribute('http.status_code', statusCode);
+                span.recordException(error);
+
+                this.analytics.trackRequest(
+                  {
+                    method,
+                    path: url,
+                    status: statusCode,
+                  },
+                  duration,
+                );
+
+                this.logger.error(
+                  `${method} ${url} failed with error: ${error.message}`,
+                );
+              },
+              complete: () => {
+                span.end();
+              },
+            }),
+          )
+          .subscribe(observer);
+ 
+        return () => {
+          subscription.unsubscribe();
+          span.end();
+        };
+      });
+    });
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/opentelemetry.service.ts.html b/coverage/lcov-report/src/tracing/opentelemetry.service.ts.html new file mode 100644 index 0000000..9d71768 --- /dev/null +++ b/coverage/lcov-report/src/tracing/opentelemetry.service.ts.html @@ -0,0 +1,319 @@ + + + + + + Code coverage report for src/tracing/opentelemetry.service.ts + + + + + + + + + +
+
+

All files / src/tracing opentelemetry.service.ts

+
+ +
+ 0% + Statements + 0/78 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Injectable,
+  OnModuleInit,
+  OnModuleDestroy,
+  Logger,
+} from '@nestjs/common';
+import {
+  trace,
+  Tracer,
+  Span,
+  SpanOptions,
+  context,
+  propagation,
+} from '@opentelemetry/api';
+import sdk from './otel-sdk';
+
+@Injectable()
+export class OpenTelemetryService implements OnModuleInit, OnModuleDestroy {
+  private readonly logger = new Logger(OpenTelemetryService.name);
+  private readonly tracer: Tracer;
+
+  constructor() {
+    this.tracer = trace.getTracer('currentdao-api');
+    this.logger.log('OpenTelemetry Tracer initialized');
+  }
+
+  onModuleInit() {
+    this.logger.log('OpenTelemetry SDK lifecycle managed by Main bootstrap');
+  }
+
+  async onModuleDestroy() {
+    try {
+      this.logger.log('Shutting down OpenTelemetry SDK...');
+      await sdk.shutdown();
+      this.logger.log('OpenTelemetry SDK shut down');
+    } catch (error) {
+      this.logger.error('Error shutting down OpenTelemetry SDK', error);
+    }
+  }
+
+  /**
+   * Start a manual span
+   */
+  startSpan(name: string, options?: SpanOptions): Span {
+    return this.tracer.startSpan(name, options);
+  }
+
+  /**
+   * Execute a callback in the context of a new active span
+   */
+  async withSpan<T>(
+    name: string,
+    callback: (span: Span) => Promise<T>,
+  ): Promise<T> {
+    return this.tracer.startActiveSpan(name, async (span: Span) => {
+      try {
+        const result = await callback(span);
+        return result;
+      } finally {
+        span.end();
+      }
+    });
+  }
+
+  /**
+   * Inject current context into headers for distributed tracing
+   */
+  injectContext(headers: Record<string, string>) {
+    propagation.inject(context.active(), headers);
+  }
+
+  /**
+   * Extract context from headers
+   */
+  extractContext(headers: Record<string, string>) {
+    return propagation.extract(context.active(), headers);
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/otel-sdk.ts.html b/coverage/lcov-report/src/tracing/otel-sdk.ts.html new file mode 100644 index 0000000..923fa81 --- /dev/null +++ b/coverage/lcov-report/src/tracing/otel-sdk.ts.html @@ -0,0 +1,322 @@ + + + + + + Code coverage report for src/tracing/otel-sdk.ts + + + + + + + + + +
+
+

All files / src/tracing otel-sdk.ts

+
+ +
+ 0% + Statements + 0/79 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/79 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { NodeSDK } from '@opentelemetry/sdk-node';
+import { Resource } from '@opentelemetry/resources';
+import {
+  ATTR_SERVICE_NAME,
+  ATTR_SERVICE_VERSION,
+} from '@opentelemetry/semantic-conventions';
+import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
+import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
+import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
+import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
+import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express';
+import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core';
+import { TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-base';
+import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
+
+/**
+ * Configure OpenTelemetry SDK
+ */
+const otlpUrl =
+  process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces';
+const serviceName = process.env.SERVICE_NAME || 'currentdao-backend';
+const serviceVersion = process.env.SERVICE_VERSION || '1.0.0';
+const samplingRatio = parseFloat(
+  process.env.OTEL_TRACING_SAMPLING_RATIO || '1.0',
+);
+const isTestEnvironment = process.env.NODE_ENV === 'test';
+
+const traceExporter = new OTLPTraceExporter({
+  url: otlpUrl,
+});
+
+const prometheusExporter = new PrometheusExporter({
+  port: 9464, // Default port for prometheus exporter
+});
+
+const sdk = new NodeSDK({
+  resource: new Resource({
+    [ATTR_SERVICE_NAME]: serviceName,
+    [ATTR_SERVICE_VERSION]: serviceVersion,
+  }),
+  traceExporter,
+  metricReader: new PeriodicExportingMetricReader({
+    exporter: new OTLPMetricExporter({
+      url:
+        process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT ||
+        'http://localhost:4318/v1/metrics',
+    }),
+  }),
+  instrumentations: [
+    new HttpInstrumentation(),
+    new ExpressInstrumentation(),
+    new NestInstrumentation(),
+  ],
+  sampler: new TraceIdRatioBasedSampler(samplingRatio), // Sampling strategy
+});
+
+// Since NodeSDK doesn't easily support multiple metric readers yet,
+// let's manually start Prometheus if needed.
+if (!isTestEnvironment) {
+  void prometheusExporter.startServer().then(() => {
+    console.log('Prometheus metrics server started on port 9464');
+  });
+}
+
+/**
+ * Graceful shutdown
+ */
+if (!isTestEnvironment && typeof process.on === 'function') {
+  process.on('SIGTERM', () => {
+    sdk
+      .shutdown()
+      .then(() => console.log('Tracing terminated'))
+      .catch((error) => console.log('Error terminating tracing', error))
+      .finally(() => process.exit(0));
+  });
+}
+
+export default sdk;
+export { prometheusExporter };
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/tracing/tracing.module.ts.html b/coverage/lcov-report/src/tracing/tracing.module.ts.html new file mode 100644 index 0000000..329724a --- /dev/null +++ b/coverage/lcov-report/src/tracing/tracing.module.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/tracing/tracing.module.ts + + + + + + + + + +
+
+

All files / src/tracing tracing.module.ts

+
+ +
+ 0% + Statements + 0/26 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module, Global } from '@nestjs/common';
+import { APP_INTERCEPTOR, APP_FILTER } from '@nestjs/core';
+import { OpenTelemetryService } from './opentelemetry.service';
+import { CustomInstrumentation } from './instrumentation/custom-instrumentation';
+import { TraceAnalyticsService } from './analytics/trace-analytics.service';
+import { TracingInterceptor } from './interceptors/tracing.interceptor';
+import { TracingFilter } from './filters/tracing.filter';
+
+@Global()
+@Module({
+  providers: [
+    OpenTelemetryService,
+    CustomInstrumentation,
+    TraceAnalyticsService,
+    {
+      provide: APP_INTERCEPTOR,
+      useClass: TracingInterceptor,
+    },
+    {
+      provide: APP_FILTER,
+      useClass: TracingFilter,
+    },
+  ],
+  exports: [OpenTelemetryService, CustomInstrumentation, TraceAnalyticsService],
+})
+export class TracingModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/auth/hmac.auth.ts.html b/coverage/lcov-report/src/webhooks/auth/hmac.auth.ts.html new file mode 100644 index 0000000..95b0bd8 --- /dev/null +++ b/coverage/lcov-report/src/webhooks/auth/hmac.auth.ts.html @@ -0,0 +1,217 @@ + + + + + + Code coverage report for src/webhooks/auth/hmac.auth.ts + + + + + + + + + +
+
+

All files / src/webhooks/auth hmac.auth.ts

+
+ +
+ 0% + Statements + 0/44 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+import * as crypto from 'crypto';
+
+@Injectable()
+export class HmacAuthService {
+  generateSignature(payload: string, secret: string): string {
+    return crypto
+      .createHmac('sha256', secret)
+      .update(payload, 'utf8')
+      .digest('hex');
+  }
+
+  verifySignature(payload: string, signature: string, secret: string): boolean {
+    const expectedSignature = this.generateSignature(payload, secret);
+    return crypto.timingSafeEqual(
+      Buffer.from(signature, 'hex'),
+      Buffer.from(expectedSignature, 'hex'),
+    );
+  }
+
+  generateTimestamp(): number {
+    return Math.floor(Date.now() / 1000);
+  }
+
+  verifyTimestamp(timestamp: number, maxAgeSeconds: number = 300): boolean {
+    const now = Math.floor(Date.now() / 1000);
+    return timestamp > now - maxAgeSeconds && timestamp <= now;
+  }
+
+  signWebhook(
+    payload: any,
+    secret: string,
+  ): { signature: string; timestamp: number } {
+    const payloadString = JSON.stringify(payload);
+    const timestamp = this.generateTimestamp();
+    const signedPayload = `${payloadString}.${timestamp}`;
+    const signature = this.generateSignature(signedPayload, secret);
+
+    return {
+      signature,
+      timestamp,
+    };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/auth/index.html b/coverage/lcov-report/src/webhooks/auth/index.html new file mode 100644 index 0000000..ff47cbd --- /dev/null +++ b/coverage/lcov-report/src/webhooks/auth/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/webhooks/auth + + + + + + + + + +
+
+

All files src/webhooks/auth

+
+ +
+ 0% + Statements + 0/44 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
hmac.auth.ts +
+
0%0/440%0/10%0/10%0/44
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/dto/index.html b/coverage/lcov-report/src/webhooks/dto/index.html new file mode 100644 index 0000000..09b6f3b --- /dev/null +++ b/coverage/lcov-report/src/webhooks/dto/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/webhooks/dto + + + + + + + + + +
+
+

All files src/webhooks/dto

+
+ +
+ 0% + Statements + 0/145 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/145 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
webhook.dto.ts +
+
0%0/1450%0/10%0/10%0/145
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/dto/webhook.dto.ts.html b/coverage/lcov-report/src/webhooks/dto/webhook.dto.ts.html new file mode 100644 index 0000000..8c0e4d0 --- /dev/null +++ b/coverage/lcov-report/src/webhooks/dto/webhook.dto.ts.html @@ -0,0 +1,520 @@ + + + + + + Code coverage report for src/webhooks/dto/webhook.dto.ts + + + + + + + + + +
+
+

All files / src/webhooks/dto webhook.dto.ts

+
+ +
+ 0% + Statements + 0/145 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/145 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  IsString,
+  IsArray,
+  IsOptional,
+  IsBoolean,
+  IsNumber,
+  IsObject,
+  IsUrl,
+  Min,
+  Max,
+} from 'class-validator';
+import { Type } from 'class-transformer';
+
+export class CreateWebhookDto {
+  @IsUrl()
+  url: string;
+
+  @IsString()
+  secret: string;
+
+  @IsArray()
+  @IsString({ each: true })
+  events: string[];
+
+  @IsOptional()
+  @IsBoolean()
+  active?: boolean = true;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(10)
+  maxRetries?: number = 3;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(1000)
+  @Max(30000)
+  timeoutMs?: number = 5000;
+
+  @IsOptional()
+  @IsObject()
+  filters?: Record<string, any>;
+}
+
+export class UpdateWebhookDto {
+  @IsOptional()
+  @IsUrl()
+  url?: string;
+
+  @IsOptional()
+  @IsString()
+  secret?: string;
+
+  @IsOptional()
+  @IsArray()
+  @IsString({ each: true })
+  events?: string[];
+
+  @IsOptional()
+  @IsBoolean()
+  active?: boolean;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(1)
+  @Max(10)
+  maxRetries?: number;
+
+  @IsOptional()
+  @IsNumber()
+  @Min(1000)
+  @Max(30000)
+  timeoutMs?: number;
+
+  @IsOptional()
+  @IsObject()
+  filters?: Record<string, any>;
+}
+
+export class WebhookQueryDto {
+  @IsOptional()
+  @IsString()
+  eventType?: string;
+
+  @IsOptional()
+  @IsBoolean()
+  @Type(() => Boolean)
+  active?: boolean;
+
+  @IsOptional()
+  @IsString()
+  url?: string;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  page?: number = 1;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  limit?: number = 10;
+}
+
+export class WebhookDeliveryQueryDto {
+  @IsOptional()
+  @IsString()
+  webhookId?: string;
+
+  @IsOptional()
+  @IsString()
+  status?: string;
+
+  @IsOptional()
+  @IsString()
+  eventType?: string;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  page?: number = 1;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  limit?: number = 10;
+}
+
+export class TriggerWebhookDto {
+  @IsString()
+  eventType: string;
+
+  @IsObject()
+  data: Record<string, any>;
+
+  @IsOptional()
+  @IsString()
+  transactionId?: string;
+
+  @IsOptional()
+  @IsNumber()
+  @Type(() => Number)
+  timestamp?: number = Date.now();
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/entities/index.html b/coverage/lcov-report/src/webhooks/entities/index.html new file mode 100644 index 0000000..c84b746 --- /dev/null +++ b/coverage/lcov-report/src/webhooks/entities/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/webhooks/entities + + + + + + + + + +
+
+

All files src/webhooks/entities

+
+ +
+ 0% + Statements + 0/117 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
webhook-delivery.entity.ts +
+
0%0/660%0/10%0/10%0/66
webhook.entity.ts +
+
0%0/510%0/10%0/10%0/51
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/entities/webhook-delivery.entity.ts.html b/coverage/lcov-report/src/webhooks/entities/webhook-delivery.entity.ts.html new file mode 100644 index 0000000..2a693ae --- /dev/null +++ b/coverage/lcov-report/src/webhooks/entities/webhook-delivery.entity.ts.html @@ -0,0 +1,283 @@ + + + + + + Code coverage report for src/webhooks/entities/webhook-delivery.entity.ts + + + + + + + + + +
+
+

All files / src/webhooks/entities webhook-delivery.entity.ts

+
+ +
+ 0% + Statements + 0/66 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/66 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  ManyToOne,
+  JoinColumn,
+} from 'typeorm';
+import { Webhook } from './webhook.entity';
+
+export enum DeliveryStatus {
+  PENDING = 'pending',
+  SUCCESS = 'success',
+  FAILED = 'failed',
+  RETRYING = 'retrying',
+}
+
+@Entity('webhook_deliveries')
+export class WebhookDelivery {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @ManyToOne(() => Webhook, (webhook) => webhook.deliveries)
+  @JoinColumn({ name: 'webhook_id' })
+  webhook: Webhook;
+
+  @Column({ name: 'webhook_id' })
+  webhookId: string;
+
+  @Column()
+  eventType: string;
+
+  @Column('json')
+  payload: Record<string, any>;
+
+  @Column({
+    type: 'enum',
+    enum: DeliveryStatus,
+    default: DeliveryStatus.PENDING,
+  })
+  status: DeliveryStatus;
+
+  @Column({ nullable: true })
+  responseCode: number;
+
+  @Column({ type: 'text', nullable: true })
+  responseBody: string;
+
+  @Column({ nullable: true })
+  attemptNumber: number;
+
+  @Column({ nullable: true })
+  nextRetryAt: Date;
+
+  @Column({ type: 'text', nullable: true })
+  errorMessage: string;
+
+  @Column({ default: 0 })
+  duration: number;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @Column({ nullable: true })
+  deliveredAt: Date;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/entities/webhook.entity.ts.html b/coverage/lcov-report/src/webhooks/entities/webhook.entity.ts.html new file mode 100644 index 0000000..5c40d1d --- /dev/null +++ b/coverage/lcov-report/src/webhooks/entities/webhook.entity.ts.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for src/webhooks/entities/webhook.entity.ts + + + + + + + + + +
+
+

All files / src/webhooks/entities webhook.entity.ts

+
+ +
+ 0% + Statements + 0/51 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/51 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  CreateDateColumn,
+  UpdateDateColumn,
+  OneToMany,
+} from 'typeorm';
+import { WebhookDelivery } from './webhook-delivery.entity';
+
+@Entity('webhooks')
+export class Webhook {
+  @PrimaryGeneratedColumn('uuid')
+  id: string;
+
+  @Column({ unique: true })
+  url: string;
+
+  @Column()
+  secret: string;
+
+  @Column('simple-array')
+  events: string[];
+
+  @Column({ default: true })
+  active: boolean;
+
+  @Column({ default: 3 })
+  maxRetries: number;
+
+  @Column({ default: 5000 })
+  timeoutMs: number;
+
+  @Column({ type: 'json', nullable: true })
+  filters: Record<string, any>;
+
+  @Column({ default: 0 })
+  deliveryCount: number;
+
+  @Column({ default: 0 })
+  failureCount: number;
+
+  @CreateDateColumn()
+  createdAt: Date;
+
+  @UpdateDateColumn()
+  updatedAt: Date;
+
+  @OneToMany(() => WebhookDelivery, (delivery) => delivery.webhook)
+  deliveries: WebhookDelivery[];
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/filters/event.filter.ts.html b/coverage/lcov-report/src/webhooks/filters/event.filter.ts.html new file mode 100644 index 0000000..50af339 --- /dev/null +++ b/coverage/lcov-report/src/webhooks/filters/event.filter.ts.html @@ -0,0 +1,334 @@ + + + + + + Code coverage report for src/webhooks/filters/event.filter.ts + + + + + + + + + +
+
+

All files / src/webhooks/filters event.filter.ts

+
+ +
+ 0% + Statements + 0/83 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/83 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable } from '@nestjs/common';
+
+@Injectable()
+export class EventFilterService {
+  matchesFilters(event: any, filters: Record<string, any>): boolean {
+    if (!filters || Object.keys(filters).length === 0) {
+      return true;
+    }
+
+    for (const [key, filterValue] of Object.entries(filters)) {
+      if (!this.matchesFilter(event[key], filterValue)) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  private matchesFilter(eventValue: any, filterValue: any): boolean {
+    if (Array.isArray(filterValue)) {
+      return filterValue.includes(eventValue);
+    }
+
+    if (typeof filterValue === 'object' && filterValue !== null) {
+      return this.matchesObjectFilter(eventValue, filterValue);
+    }
+
+    return eventValue === filterValue;
+  }
+
+  private matchesObjectFilter(eventValue: any, filterObject: any): boolean {
+    if (typeof eventValue !== 'object' || eventValue === null) {
+      return false;
+    }
+
+    for (const [key, value] of Object.entries(filterObject)) {
+      if (key === '$gt' && eventValue <= value) return false;
+      if (key === '$gte' && eventValue < value) return false;
+      if (key === '$lt' && eventValue >= value) return false;
+      if (key === '$lte' && eventValue > value) return false;
+      if (key === '$ne' && eventValue === value) return false;
+      if (key === '$in' && !Array.isArray(value)) return false;
+      if (key === '$in' && !value.includes(eventValue)) return false;
+      if (key === '$nin' && !Array.isArray(value)) return false;
+      if (key === '$nin' && value.includes(eventValue)) return false;
+      if (key === '$exists' && (value ? !eventValue : !!eventValue))
+        return false;
+      if (key === '$regex' && typeof eventValue === 'string') {
+        const regex = new RegExp(value);
+        if (!regex.test(eventValue)) return false;
+      }
+    }
+
+    return true;
+  }
+
+  filterByEventType(events: string[], eventTypes: string[]): boolean {
+    return (
+      eventTypes.length === 0 ||
+      events.some((event) => eventTypes.includes(event))
+    );
+  }
+
+  filterByTimeRange(
+    timestamp: number,
+    startTime?: number,
+    endTime?: number,
+  ): boolean {
+    if (startTime && timestamp < startTime) return false;
+    if (endTime && timestamp > endTime) return false;
+    return true;
+  }
+
+  filterByAmount(
+    amount: number,
+    minAmount?: number,
+    maxAmount?: number,
+  ): boolean {
+    if (minAmount !== undefined && amount < minAmount) return false;
+    if (maxAmount !== undefined && amount > maxAmount) return false;
+    return true;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/filters/index.html b/coverage/lcov-report/src/webhooks/filters/index.html new file mode 100644 index 0000000..c52619f --- /dev/null +++ b/coverage/lcov-report/src/webhooks/filters/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/webhooks/filters + + + + + + + + + +
+
+

All files src/webhooks/filters

+
+ +
+ 0% + Statements + 0/83 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/83 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
event.filter.ts +
+
0%0/830%0/10%0/10%0/83
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/index.html b/coverage/lcov-report/src/webhooks/index.html new file mode 100644 index 0000000..4896ad2 --- /dev/null +++ b/coverage/lcov-report/src/webhooks/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/webhooks + + + + + + + + + +
+
+

All files src/webhooks

+
+ +
+ 0% + Statements + 0/475 +
+ + +
+ 0% + Branches + 0/3 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/475 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
webhook.controller.ts +
+
0%0/1630%0/10%0/10%0/163
webhook.service.ts +
+
0%0/2900%0/10%0/10%0/290
webhooks.module.ts +
+
0%0/220%0/10%0/10%0/22
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/webhook.controller.ts.html b/coverage/lcov-report/src/webhooks/webhook.controller.ts.html new file mode 100644 index 0000000..fc7120e --- /dev/null +++ b/coverage/lcov-report/src/webhooks/webhook.controller.ts.html @@ -0,0 +1,574 @@ + + + + + + Code coverage report for src/webhooks/webhook.controller.ts + + + + + + + + + +
+
+

All files / src/webhooks webhook.controller.ts

+
+ +
+ 0% + Statements + 0/163 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/163 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Controller,
+  Get,
+  Post,
+  Body,
+  Patch,
+  Param,
+  Delete,
+  Query,
+  HttpStatus,
+  HttpCode,
+} from '@nestjs/common';
+import {
+  ApiTags,
+  ApiOperation,
+  ApiResponse,
+  ApiParam,
+  ApiQuery,
+} from '@nestjs/swagger';
+import { WebhookService } from './webhook.service';
+import {
+  CreateWebhookDto,
+  UpdateWebhookDto,
+  WebhookQueryDto,
+  WebhookDeliveryQueryDto,
+  TriggerWebhookDto,
+} from './dto/webhook.dto';
+import { Webhook } from './entities/webhook.entity';
+import { WebhookDelivery } from './entities/webhook-delivery.entity';
+
+@ApiTags('webhooks')
+@Controller('webhooks')
+export class WebhookController {
+  constructor(private readonly webhookService: WebhookService) {}
+
+  @Post()
+  @ApiOperation({ summary: 'Create a new webhook' })
+  @ApiResponse({
+    status: 201,
+    description: 'Webhook created successfully',
+    type: Webhook,
+  })
+  @ApiResponse({ status: 400, description: 'Bad request' })
+  async create(@Body() createWebhookDto: CreateWebhookDto): Promise<Webhook> {
+    return this.webhookService.create(createWebhookDto);
+  }
+
+  @Get()
+  @ApiOperation({ summary: 'Get all webhooks' })
+  @ApiResponse({ status: 200, description: 'Webhooks retrieved successfully' })
+  @ApiQuery({ name: 'page', required: false, type: Number })
+  @ApiQuery({ name: 'limit', required: false, type: Number })
+  async findAll(@Query() query: WebhookQueryDto) {
+    return this.webhookService.findAll(query.page, query.limit);
+  }
+
+  @Get(':id')
+  @ApiOperation({ summary: 'Get webhook by ID' })
+  @ApiResponse({
+    status: 200,
+    description: 'Webhook retrieved successfully',
+    type: Webhook,
+  })
+  @ApiResponse({ status: 404, description: 'Webhook not found' })
+  @ApiParam({ name: 'id', description: 'Webhook ID' })
+  async findOne(@Param('id') id: string): Promise<Webhook> {
+    return this.webhookService.findOne(id);
+  }
+
+  @Patch(':id')
+  @ApiOperation({ summary: 'Update webhook' })
+  @ApiResponse({
+    status: 200,
+    description: 'Webhook updated successfully',
+    type: Webhook,
+  })
+  @ApiResponse({ status: 404, description: 'Webhook not found' })
+  @ApiParam({ name: 'id', description: 'Webhook ID' })
+  async update(
+    @Param('id') id: string,
+    @Body() updateWebhookDto: UpdateWebhookDto,
+  ): Promise<Webhook> {
+    return this.webhookService.update(id, updateWebhookDto);
+  }
+
+  @Delete(':id')
+  @HttpCode(HttpStatus.NO_CONTENT)
+  @ApiOperation({ summary: 'Delete webhook' })
+  @ApiResponse({ status: 204, description: 'Webhook deleted successfully' })
+  @ApiResponse({ status: 404, description: 'Webhook not found' })
+  @ApiParam({ name: 'id', description: 'Webhook ID' })
+  async remove(@Param('id') id: string): Promise<void> {
+    return this.webhookService.remove(id);
+  }
+
+  @Post('trigger')
+  @HttpCode(HttpStatus.ACCEPTED)
+  @ApiOperation({ summary: 'Trigger webhook event' })
+  @ApiResponse({
+    status: 202,
+    description: 'Webhook event triggered successfully',
+  })
+  async trigger(@Body() triggerDto: TriggerWebhookDto): Promise<void> {
+    return this.webhookService.triggerWebhook(triggerDto);
+  }
+
+  @Get(':id/deliveries')
+  @ApiOperation({ summary: 'Get webhook delivery history' })
+  @ApiResponse({
+    status: 200,
+    description: 'Delivery history retrieved successfully',
+  })
+  @ApiParam({ name: 'id', description: 'Webhook ID' })
+  @ApiQuery({ name: 'page', required: false, type: Number })
+  @ApiQuery({ name: 'limit', required: false, type: Number })
+  async getDeliveries(
+    @Param('id') id: string,
+    @Query() query: WebhookDeliveryQueryDto,
+  ) {
+    return this.webhookService.getDeliveries(query.page, query.limit, id);
+  }
+
+  @Get('stats/delivery')
+  @ApiOperation({ summary: 'Get delivery statistics' })
+  @ApiResponse({
+    status: 200,
+    description: 'Delivery statistics retrieved successfully',
+  })
+  @ApiQuery({
+    name: 'webhookId',
+    required: false,
+    description: 'Optional webhook ID to filter stats',
+  })
+  async getDeliveryStats(@Query('webhookId') webhookId?: string) {
+    return this.webhookService.getDeliveryStats(webhookId);
+  }
+
+  @Get('deliveries/all')
+  @ApiOperation({ summary: 'Get all webhook deliveries' })
+  @ApiResponse({
+    status: 200,
+    description: 'All deliveries retrieved successfully',
+  })
+  @ApiQuery({ name: 'page', required: false, type: Number })
+  @ApiQuery({ name: 'limit', required: false, type: Number })
+  @ApiQuery({
+    name: 'webhookId',
+    required: false,
+    description: 'Filter by webhook ID',
+  })
+  @ApiQuery({
+    name: 'status',
+    required: false,
+    description: 'Filter by status',
+  })
+  async getAllDeliveries(@Query() query: WebhookDeliveryQueryDto) {
+    return this.webhookService.getDeliveries(
+      query.page,
+      query.limit,
+      query.webhookId,
+    );
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/webhook.service.ts.html b/coverage/lcov-report/src/webhooks/webhook.service.ts.html new file mode 100644 index 0000000..ad52ea2 --- /dev/null +++ b/coverage/lcov-report/src/webhooks/webhook.service.ts.html @@ -0,0 +1,955 @@ + + + + + + Code coverage report for src/webhooks/webhook.service.ts + + + + + + + + + +
+
+

All files / src/webhooks webhook.service.ts

+
+ +
+ 0% + Statements + 0/290 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/290 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Injectable, Logger } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Repository, LessThan } from 'typeorm';
+import { Cron, CronExpression } from '@nestjs/schedule';
+import { HttpService } from '@nestjs/axios';
+import { Webhook } from './entities/webhook.entity';
+import {
+  WebhookDelivery,
+  DeliveryStatus,
+} from './entities/webhook-delivery.entity';
+import { HmacAuthService } from './auth/hmac.auth';
+import { EventFilterService } from './filters/event.filter';
+import {
+  CreateWebhookDto,
+  UpdateWebhookDto,
+  TriggerWebhookDto,
+} from './dto/webhook.dto';
+import { firstValueFrom } from 'rxjs';
+
+@Injectable()
+export class WebhookService {
+  private readonly logger = new Logger(WebhookService.name);
+
+  constructor(
+    @InjectRepository(Webhook)
+    private webhookRepository: Repository<Webhook>,
+    @InjectRepository(WebhookDelivery)
+    private deliveryRepository: Repository<WebhookDelivery>,
+    private hmacAuthService: HmacAuthService,
+    private eventFilterService: EventFilterService,
+    private httpService: HttpService,
+  ) {}
+
+  async create(createWebhookDto: CreateWebhookDto): Promise<Webhook> {
+    const webhook = this.webhookRepository.create(createWebhookDto);
+    return this.webhookRepository.save(webhook);
+  }
+
+  async findAll(
+    page = 1,
+    limit = 10,
+  ): Promise<{ webhooks: Webhook[]; total: number }> {
+    const [webhooks, total] = await this.webhookRepository.findAndCount({
+      skip: (page - 1) * limit,
+      take: limit,
+      order: { createdAt: 'DESC' },
+    });
+    return { webhooks, total };
+  }
+
+  async findOne(id: string): Promise<Webhook> {
+    return this.webhookRepository.findOne({
+      where: { id },
+      relations: ['deliveries'],
+    });
+  }
+
+  async update(
+    id: string,
+    updateWebhookDto: UpdateWebhookDto,
+  ): Promise<Webhook> {
+    await this.webhookRepository.update(id, updateWebhookDto);
+    return this.findOne(id);
+  }
+
+  async remove(id: string): Promise<void> {
+    await this.webhookRepository.delete(id);
+  }
+
+  async triggerWebhook(triggerDto: TriggerWebhookDto): Promise<void> {
+    const activeWebhooks = await this.webhookRepository.find({
+      where: { active: true },
+    });
+
+    for (const webhook of activeWebhooks) {
+      if (this.shouldTriggerWebhook(webhook, triggerDto)) {
+        await this.queueWebhookDelivery(webhook, triggerDto);
+      }
+    }
+  }
+
+  private shouldTriggerWebhook(
+    webhook: Webhook,
+    triggerDto: TriggerWebhookDto,
+  ): boolean {
+    if (!webhook.events.includes(triggerDto.eventType)) {
+      return false;
+    }
+
+    return this.eventFilterService.matchesFilters(
+      triggerDto.data,
+      webhook.filters || {},
+    );
+  }
+
+  private async queueWebhookDelivery(
+    webhook: Webhook,
+    triggerDto: TriggerWebhookDto,
+  ): Promise<void> {
+    const delivery = this.deliveryRepository.create({
+      webhookId: webhook.id,
+      webhook,
+      eventType: triggerDto.eventType,
+      payload: triggerDto.data,
+      status: DeliveryStatus.PENDING,
+      attemptNumber: 0,
+    });
+
+    await this.deliveryRepository.save(delivery);
+
+    setImmediate(() => this.processWebhookDelivery(delivery.id));
+  }
+
+  private async processWebhookDelivery(deliveryId: string): Promise<void> {
+    const delivery = await this.deliveryRepository.findOne({
+      where: { id: deliveryId },
+      relations: ['webhook'],
+    });
+
+    if (!delivery) {
+      this.logger.warn(`Delivery ${deliveryId} not found`);
+      return;
+    }
+
+    const startTime = Date.now();
+
+    try {
+      const { signature, timestamp } = this.hmacAuthService.signWebhook(
+        delivery.payload,
+        delivery.webhook.secret,
+      );
+
+      const payload = {
+        id: delivery.id,
+        eventType: delivery.eventType,
+        timestamp,
+        data: delivery.payload,
+      };
+
+      const response = await firstValueFrom(
+        this.httpService.post(delivery.webhook.url, payload, {
+          headers: {
+            'Content-Type': 'application/json',
+            'X-Webhook-Signature': signature,
+            'X-Webhook-Timestamp': timestamp.toString(),
+            'User-Agent': 'CurrentDao-Webhook/1.0',
+          },
+          timeout: delivery.webhook.timeoutMs,
+        }),
+      );
+
+      const duration = Date.now() - startTime;
+
+      await this.deliveryRepository.update(deliveryId, {
+        status: DeliveryStatus.SUCCESS,
+        responseCode: response.status,
+        responseBody: JSON.stringify(response.data),
+        duration,
+        deliveredAt: new Date(),
+      });
+
+      await this.webhookRepository.increment(
+        { id: delivery.webhookId },
+        'deliveryCount',
+        1,
+      );
+
+      this.logger.log(
+        `Webhook delivered successfully: ${deliveryId} to ${delivery.webhook.url}`,
+      );
+    } catch (error) {
+      const duration = Date.now() - startTime;
+      await this.handleFailedDelivery(delivery, error, duration);
+    }
+  }
+
+  private async handleFailedDelivery(
+    delivery: WebhookDelivery,
+    error: any,
+    duration: number,
+  ): Promise<void> {
+    const attemptNumber = delivery.attemptNumber + 1;
+    const maxRetries = delivery.webhook.maxRetries;
+
+    if (attemptNumber > maxRetries) {
+      await this.deliveryRepository.update(delivery.id, {
+        status: DeliveryStatus.FAILED,
+        attemptNumber,
+        errorMessage: error.message,
+        duration,
+      });
+
+      await this.webhookRepository.increment(
+        { id: delivery.webhookId },
+        'failureCount',
+        1,
+      );
+
+      this.logger.error(
+        `Webhook delivery failed permanently: ${delivery.id}`,
+        error,
+      );
+      return;
+    }
+
+    const nextRetryAt = new Date(
+      Date.now() + this.calculateBackoffDelay(attemptNumber),
+    );
+
+    await this.deliveryRepository.update(delivery.id, {
+      status: DeliveryStatus.RETRYING,
+      attemptNumber,
+      nextRetryAt,
+      errorMessage: error.message,
+      duration,
+    });
+
+    this.logger.warn(
+      `Webhook delivery failed, scheduling retry: ${delivery.id} in ${this.calculateBackoffDelay(attemptNumber)}ms`,
+    );
+  }
+
+  private calculateBackoffDelay(attemptNumber: number): number {
+    const baseDelay = 1000;
+    const maxDelay = 300000;
+    const exponentialDelay = baseDelay * Math.pow(2, attemptNumber - 1);
+    const jitter = Math.random() * 1000;
+    return Math.min(exponentialDelay + jitter, maxDelay);
+  }
+
+  @Cron(CronExpression.EVERY_MINUTE)
+  async retryFailedDeliveries(): Promise<void> {
+    const pendingRetries = await this.deliveryRepository.find({
+      where: {
+        status: DeliveryStatus.RETRYING,
+        nextRetryAt: LessThan(new Date()),
+      },
+      relations: ['webhook'],
+    });
+
+    for (const delivery of pendingRetries) {
+      setImmediate(() => this.processWebhookDelivery(delivery.id));
+    }
+  }
+
+  async getDeliveryStats(webhookId?: string): Promise<{
+    total: number;
+    success: number;
+    failed: number;
+    pending: number;
+    successRate: number;
+  }> {
+    const whereClause = webhookId ? { webhookId } : {};
+
+    const [total, success, failed, pending] = await Promise.all([
+      this.deliveryRepository.count({ where: whereClause }),
+      this.deliveryRepository.count({
+        where: { ...whereClause, status: DeliveryStatus.SUCCESS },
+      }),
+      this.deliveryRepository.count({
+        where: { ...whereClause, status: DeliveryStatus.FAILED },
+      }),
+      this.deliveryRepository.count({
+        where: { ...whereClause, status: DeliveryStatus.PENDING },
+      }),
+    ]);
+
+    const successRate = total > 0 ? (success / total) * 100 : 0;
+
+    return { total, success, failed, pending, successRate };
+  }
+
+  async getDeliveries(
+    page = 1,
+    limit = 10,
+    webhookId?: string,
+  ): Promise<{ deliveries: WebhookDelivery[]; total: number }> {
+    const whereClause = webhookId ? { webhookId } : {};
+
+    const [deliveries, total] = await this.deliveryRepository.findAndCount({
+      where: whereClause,
+      relations: ['webhook'],
+      skip: (page - 1) * limit,
+      take: limit,
+      order: { createdAt: 'DESC' },
+    });
+
+    return { deliveries, total };
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/webhooks/webhooks.module.ts.html b/coverage/lcov-report/src/webhooks/webhooks.module.ts.html new file mode 100644 index 0000000..98fc1fe --- /dev/null +++ b/coverage/lcov-report/src/webhooks/webhooks.module.ts.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/webhooks/webhooks.module.ts + + + + + + + + + +
+
+

All files / src/webhooks webhooks.module.ts

+
+ +
+ 0% + Statements + 0/22 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Module } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { HttpModule } from '@nestjs/axios';
+import { ScheduleModule } from '@nestjs/schedule';
+import { WebhookService } from './webhook.service';
+import { WebhookController } from './webhook.controller';
+import { Webhook } from './entities/webhook.entity';
+import { WebhookDelivery } from './entities/webhook-delivery.entity';
+import { HmacAuthService } from './auth/hmac.auth';
+import { EventFilterService } from './filters/event.filter';
+
+@Module({
+  imports: [
+    TypeOrmModule.forFeature([Webhook, WebhookDelivery]),
+    HttpModule,
+    ScheduleModule.forRoot(),
+  ],
+  controllers: [WebhookController],
+  providers: [WebhookService, HmacAuthService, EventFilterService],
+  exports: [WebhookService, HmacAuthService, EventFilterService],
+})
+export class WebhooksModule {}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..fe6f588 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,65086 @@ +TN: +SF:src/api-health.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +LF:28 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/app.controller.ts +FN:8,AppController +FN:12,getHello +FN:18,getHealth +FNF:3 +FNH:2 +FNDA:1,AppController +FNDA:1,getHello +FNDA:0,getHealth +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,1 +LF:27 +LH:19 +BRDA:8,0,0,1 +BRDA:12,1,0,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/app.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +LF:53 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/app.service.ts +FN:5,getHello +FNF:1 +FNH:1 +FNDA:1,getHello +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +LF:12 +LH:12 +BRDA:5,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/health.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +LF:62 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/main.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +LF:79 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/ab-testing.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +LF:42 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/ai-recommendations.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +LF:84 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/ai-recommendations.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/market-pattern.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +LF:111 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/ml-model.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +LF:126 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/recommendation-engine.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +LF:152 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/user-behavior.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +LF:160 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/dto/recommendation.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +LF:69 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/ai/recommendations/entities/recommendation.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +LF:90 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/analytics/analytics.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +LF:21 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/analytics/analytics.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +LF:367 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/analytics/dto/report-params.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +LF:162 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/analytics/entities/analytics-data.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +LF:88 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/analytics/reports/market-efficiency.report.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +LF:438 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/analytics/reports/price-trends.report.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +LF:418 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/analytics/reports/trading-volume.report.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +LF:321 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/analytics/reports/user-performance.report.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +LF:500 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/apm/apm.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +LF:25 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/apm/alerts/alert-service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +LF:74 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/apm/analytics/performance-analytics.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +LF:106 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/apm/dashboard/dashboard.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +LF:56 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/apm/metrics/metrics-collector.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +LF:101 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/apm/optimization/optimization-service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +LF:77 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/assets/asset.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +LF:25 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/assets/caching/cache.service.ts +FN:4,CacheService +FN:8,set +FN:14,get +FN:28,invalidate +FNF:4 +FNH:3 +FNDA:1,CacheService +FNDA:1,set +FNDA:1,get +FNDA:0,invalidate +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,1 +LF:32 +LH:25 +BRDA:4,0,0,1 +BRDA:8,1,0,1 +BRDA:14,2,0,1 +BRDA:16,3,0,0 +BRDA:18,4,0,0 +BRF:5 +BRH:3 +end_of_record +TN: +SF:src/assets/cdn/cdn.service.ts +FN:4,CdnService +FN:7,getAssetUrl +FNF:2 +FNH:2 +FNDA:1,CdnService +FNDA:1,getAssetUrl +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +LF:12 +LH:12 +BRDA:4,0,0,1 +BRDA:7,1,0,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/assets/optimization/compression.service.ts +FN:9,CompressionService +FN:12,compressAsset +FNF:2 +FNH:2 +FNDA:1,CompressionService +FNDA:1,compressAsset +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,0 +DA:20,0 +DA:21,1 +DA:22,1 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,1 +DA:27,1 +LF:27 +LH:22 +BRDA:9,0,0,1 +BRDA:12,1,0,1 +BRDA:18,2,0,0 +BRDA:22,3,0,0 +BRF:4 +BRH:2 +end_of_record +TN: +SF:src/assets/optimization/image-optimizer.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +LF:16 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/assets/versioning/asset-version.service.ts +FN:5,AssetVersionService +FN:8,generateVersionHash +FN:17,appendVersionToFilename +FNF:3 +FNH:2 +FNDA:1,AssetVersionService +FNDA:1,generateVersionHash +FNDA:0,appendVersionToFilename +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,1 +LF:25 +LH:18 +BRDA:5,0,0,1 +BRDA:8,1,0,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/audit/audit.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +LF:13 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/audit/audit.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:765,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:769,0 +DA:770,0 +DA:771,0 +DA:772,0 +DA:773,0 +DA:774,0 +DA:775,0 +DA:776,0 +DA:777,0 +DA:778,0 +DA:779,0 +DA:780,0 +DA:781,0 +DA:782,0 +DA:783,0 +DA:784,0 +DA:785,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:795,0 +DA:796,0 +DA:797,0 +DA:798,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:803,0 +DA:804,0 +DA:805,0 +DA:806,0 +DA:807,0 +DA:808,0 +DA:809,0 +DA:810,0 +DA:811,0 +DA:812,0 +DA:813,0 +DA:814,0 +DA:815,0 +DA:816,0 +DA:817,0 +DA:818,0 +DA:819,0 +DA:820,0 +DA:821,0 +DA:822,0 +DA:823,0 +DA:824,0 +DA:825,0 +DA:826,0 +DA:827,0 +DA:828,0 +DA:829,0 +DA:830,0 +DA:831,0 +DA:832,0 +DA:833,0 +DA:834,0 +DA:835,0 +DA:836,0 +DA:837,0 +DA:838,0 +DA:839,0 +DA:840,0 +DA:841,0 +DA:842,0 +DA:843,0 +DA:844,0 +DA:845,0 +DA:846,0 +DA:847,0 +DA:848,0 +DA:849,0 +DA:850,0 +DA:851,0 +DA:852,0 +DA:853,0 +DA:854,0 +DA:855,0 +DA:856,0 +DA:857,0 +DA:858,0 +DA:859,0 +DA:860,0 +DA:861,0 +DA:862,0 +DA:863,0 +DA:864,0 +DA:865,0 +DA:866,0 +DA:867,0 +DA:868,0 +DA:869,0 +DA:870,0 +DA:871,0 +DA:872,0 +DA:873,0 +DA:874,0 +DA:875,0 +DA:876,0 +DA:877,0 +DA:878,0 +DA:879,0 +DA:880,0 +DA:881,0 +DA:882,0 +DA:883,0 +DA:884,0 +DA:885,0 +DA:886,0 +DA:887,0 +DA:888,0 +DA:889,0 +DA:890,0 +DA:891,0 +DA:892,0 +DA:893,0 +DA:894,0 +DA:895,0 +DA:896,0 +DA:897,0 +DA:898,0 +DA:899,0 +DA:900,0 +DA:901,0 +DA:902,0 +DA:903,0 +DA:904,0 +DA:905,0 +DA:906,0 +DA:907,0 +DA:908,0 +DA:909,0 +DA:910,0 +DA:911,0 +DA:912,0 +DA:913,0 +DA:914,0 +DA:915,0 +DA:916,0 +DA:917,0 +DA:918,0 +DA:919,0 +DA:920,0 +DA:921,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:925,0 +DA:926,0 +DA:927,0 +DA:928,0 +DA:929,0 +DA:930,0 +DA:931,0 +DA:932,0 +DA:933,0 +DA:934,0 +DA:935,0 +DA:936,0 +DA:937,0 +DA:938,0 +DA:939,0 +DA:940,0 +DA:941,0 +DA:942,0 +DA:943,0 +DA:944,0 +DA:945,0 +DA:946,0 +DA:947,0 +DA:948,0 +DA:949,0 +DA:950,0 +DA:951,0 +DA:952,0 +DA:953,0 +DA:954,0 +DA:955,0 +DA:956,0 +DA:957,0 +DA:958,0 +DA:959,0 +DA:960,0 +DA:961,0 +DA:962,0 +DA:963,0 +DA:964,0 +DA:965,0 +DA:966,0 +DA:967,0 +DA:968,0 +DA:969,0 +DA:970,0 +DA:971,0 +DA:972,0 +DA:973,0 +DA:974,0 +DA:975,0 +DA:976,0 +DA:977,0 +DA:978,0 +DA:979,0 +DA:980,0 +DA:981,0 +DA:982,0 +DA:983,0 +DA:984,0 +DA:985,0 +DA:986,0 +DA:987,0 +DA:988,0 +DA:989,0 +DA:990,0 +DA:991,0 +DA:992,0 +DA:993,0 +DA:994,0 +DA:995,0 +DA:996,0 +DA:997,0 +DA:998,0 +DA:999,0 +DA:1000,0 +DA:1001,0 +DA:1002,0 +DA:1003,0 +DA:1004,0 +DA:1005,0 +DA:1006,0 +DA:1007,0 +DA:1008,0 +DA:1009,0 +DA:1010,0 +DA:1011,0 +DA:1012,0 +DA:1013,0 +DA:1014,0 +DA:1015,0 +DA:1016,0 +DA:1017,0 +DA:1018,0 +DA:1019,0 +DA:1020,0 +DA:1021,0 +DA:1022,0 +DA:1023,0 +DA:1024,0 +DA:1025,0 +DA:1026,0 +DA:1027,0 +DA:1028,0 +DA:1029,0 +DA:1030,0 +DA:1031,0 +DA:1032,0 +DA:1033,0 +DA:1034,0 +DA:1035,0 +DA:1036,0 +DA:1037,0 +DA:1038,0 +DA:1039,0 +DA:1040,0 +DA:1041,0 +DA:1042,0 +DA:1043,0 +DA:1044,0 +DA:1045,0 +DA:1046,0 +DA:1047,0 +DA:1048,0 +DA:1049,0 +DA:1050,0 +DA:1051,0 +DA:1052,0 +DA:1053,0 +DA:1054,0 +DA:1055,0 +DA:1056,0 +DA:1057,0 +DA:1058,0 +DA:1059,0 +DA:1060,0 +DA:1061,0 +DA:1062,0 +DA:1063,0 +DA:1064,0 +DA:1065,0 +DA:1066,0 +DA:1067,0 +DA:1068,0 +DA:1069,0 +DA:1070,0 +DA:1071,0 +DA:1072,0 +DA:1073,0 +DA:1074,0 +DA:1075,0 +DA:1076,0 +DA:1077,0 +DA:1078,0 +DA:1079,0 +DA:1080,0 +DA:1081,0 +DA:1082,0 +DA:1083,0 +DA:1084,0 +DA:1085,0 +DA:1086,0 +DA:1087,0 +DA:1088,0 +DA:1089,0 +DA:1090,0 +DA:1091,0 +DA:1092,0 +DA:1093,0 +DA:1094,0 +DA:1095,0 +DA:1096,0 +DA:1097,0 +DA:1098,0 +DA:1099,0 +DA:1100,0 +DA:1101,0 +DA:1102,0 +DA:1103,0 +DA:1104,0 +DA:1105,0 +DA:1106,0 +DA:1107,0 +DA:1108,0 +DA:1109,0 +DA:1110,0 +DA:1111,0 +DA:1112,0 +DA:1113,0 +DA:1114,0 +DA:1115,0 +DA:1116,0 +DA:1117,0 +DA:1118,0 +DA:1119,0 +DA:1120,0 +DA:1121,0 +DA:1122,0 +DA:1123,0 +DA:1124,0 +DA:1125,0 +DA:1126,0 +DA:1127,0 +DA:1128,0 +DA:1129,0 +DA:1130,0 +DA:1131,0 +DA:1132,0 +DA:1133,0 +DA:1134,0 +DA:1135,0 +DA:1136,0 +DA:1137,0 +DA:1138,0 +DA:1139,0 +DA:1140,0 +DA:1141,0 +DA:1142,0 +DA:1143,0 +DA:1144,0 +DA:1145,0 +DA:1146,0 +DA:1147,0 +DA:1148,0 +DA:1149,0 +DA:1150,0 +DA:1151,0 +DA:1152,0 +DA:1153,0 +DA:1154,0 +DA:1155,0 +DA:1156,0 +DA:1157,0 +DA:1158,0 +DA:1159,0 +DA:1160,0 +DA:1161,0 +DA:1162,0 +DA:1163,0 +DA:1164,0 +DA:1165,0 +DA:1166,0 +DA:1167,0 +DA:1168,0 +DA:1169,0 +DA:1170,0 +DA:1171,0 +DA:1172,0 +DA:1173,0 +DA:1174,0 +DA:1175,0 +DA:1176,0 +DA:1177,0 +DA:1178,0 +DA:1179,0 +DA:1180,0 +DA:1181,0 +DA:1182,0 +DA:1183,0 +DA:1184,0 +DA:1185,0 +DA:1186,0 +DA:1187,0 +DA:1188,0 +DA:1189,0 +DA:1190,0 +DA:1191,0 +DA:1192,0 +DA:1193,0 +DA:1194,0 +DA:1195,0 +DA:1196,0 +DA:1197,0 +DA:1198,0 +DA:1199,0 +DA:1200,0 +DA:1201,0 +DA:1202,0 +DA:1203,0 +DA:1204,0 +DA:1205,0 +DA:1206,0 +DA:1207,0 +DA:1208,0 +DA:1209,0 +DA:1210,0 +DA:1211,0 +DA:1212,0 +DA:1213,0 +DA:1214,0 +DA:1215,0 +DA:1216,0 +DA:1217,0 +DA:1218,0 +DA:1219,0 +DA:1220,0 +DA:1221,0 +DA:1222,0 +DA:1223,0 +DA:1224,0 +DA:1225,0 +DA:1226,0 +DA:1227,0 +DA:1228,0 +DA:1229,0 +DA:1230,0 +DA:1231,0 +DA:1232,0 +DA:1233,0 +DA:1234,0 +DA:1235,0 +DA:1236,0 +DA:1237,0 +DA:1238,0 +DA:1239,0 +DA:1240,0 +DA:1241,0 +DA:1242,0 +DA:1243,0 +DA:1244,0 +DA:1245,0 +DA:1246,0 +DA:1247,0 +DA:1248,0 +DA:1249,0 +DA:1250,0 +DA:1251,0 +DA:1252,0 +DA:1253,0 +DA:1254,0 +DA:1255,0 +DA:1256,0 +DA:1257,0 +DA:1258,0 +DA:1259,0 +DA:1260,0 +DA:1261,0 +DA:1262,0 +DA:1263,0 +DA:1264,0 +DA:1265,0 +DA:1266,0 +DA:1267,0 +DA:1268,0 +DA:1269,0 +DA:1270,0 +DA:1271,0 +DA:1272,0 +DA:1273,0 +DA:1274,0 +DA:1275,0 +DA:1276,0 +DA:1277,0 +DA:1278,0 +DA:1279,0 +DA:1280,0 +DA:1281,0 +DA:1282,0 +DA:1283,0 +DA:1284,0 +DA:1285,0 +DA:1286,0 +DA:1287,0 +DA:1288,0 +DA:1289,0 +DA:1290,0 +DA:1291,0 +DA:1292,0 +DA:1293,0 +DA:1294,0 +DA:1295,0 +DA:1296,0 +DA:1297,0 +DA:1298,0 +DA:1299,0 +DA:1300,0 +DA:1301,0 +DA:1302,0 +DA:1303,0 +DA:1304,0 +DA:1305,0 +DA:1306,0 +DA:1307,0 +DA:1308,0 +DA:1309,0 +DA:1310,0 +DA:1311,0 +DA:1312,0 +DA:1313,0 +DA:1314,0 +DA:1315,0 +DA:1316,0 +DA:1317,0 +DA:1318,0 +DA:1319,0 +DA:1320,0 +DA:1321,0 +DA:1322,0 +DA:1323,0 +DA:1324,0 +DA:1325,0 +DA:1326,0 +DA:1327,0 +DA:1328,0 +DA:1329,0 +DA:1330,0 +DA:1331,0 +DA:1332,0 +DA:1333,0 +DA:1334,0 +DA:1335,0 +DA:1336,0 +DA:1337,0 +DA:1338,0 +DA:1339,0 +DA:1340,0 +DA:1341,0 +DA:1342,0 +DA:1343,0 +DA:1344,0 +DA:1345,0 +DA:1346,0 +DA:1347,0 +DA:1348,0 +DA:1349,0 +DA:1350,0 +DA:1351,0 +DA:1352,0 +DA:1353,0 +DA:1354,0 +DA:1355,0 +DA:1356,0 +DA:1357,0 +DA:1358,0 +DA:1359,0 +DA:1360,0 +DA:1361,0 +DA:1362,0 +DA:1363,0 +DA:1364,0 +DA:1365,0 +DA:1366,0 +DA:1367,0 +DA:1368,0 +DA:1369,0 +DA:1370,0 +DA:1371,0 +DA:1372,0 +DA:1373,0 +DA:1374,0 +DA:1375,0 +DA:1376,0 +DA:1377,0 +DA:1378,0 +DA:1379,0 +DA:1380,0 +DA:1381,0 +DA:1382,0 +DA:1383,0 +DA:1384,0 +DA:1385,0 +DA:1386,0 +DA:1387,0 +DA:1388,0 +DA:1389,0 +DA:1390,0 +DA:1391,0 +DA:1392,0 +DA:1393,0 +DA:1394,0 +DA:1395,0 +DA:1396,0 +DA:1397,0 +DA:1398,0 +DA:1399,0 +DA:1400,0 +DA:1401,0 +DA:1402,0 +DA:1403,0 +DA:1404,0 +DA:1405,0 +DA:1406,0 +DA:1407,0 +DA:1408,0 +DA:1409,0 +DA:1410,0 +DA:1411,0 +DA:1412,0 +DA:1413,0 +DA:1414,0 +DA:1415,0 +DA:1416,0 +DA:1417,0 +DA:1418,0 +DA:1419,0 +DA:1420,0 +DA:1421,0 +DA:1422,0 +DA:1423,0 +DA:1424,0 +DA:1425,0 +DA:1426,0 +DA:1427,0 +DA:1428,0 +DA:1429,0 +DA:1430,0 +DA:1431,0 +DA:1432,0 +DA:1433,0 +DA:1434,0 +DA:1435,0 +DA:1436,0 +DA:1437,0 +DA:1438,0 +DA:1439,0 +DA:1440,0 +DA:1441,0 +DA:1442,0 +DA:1443,0 +DA:1444,0 +DA:1445,0 +DA:1446,0 +DA:1447,0 +DA:1448,0 +DA:1449,0 +DA:1450,0 +DA:1451,0 +DA:1452,0 +DA:1453,0 +DA:1454,0 +DA:1455,0 +DA:1456,0 +DA:1457,0 +DA:1458,0 +DA:1459,0 +DA:1460,0 +DA:1461,0 +DA:1462,0 +DA:1463,0 +DA:1464,0 +DA:1465,0 +DA:1466,0 +DA:1467,0 +DA:1468,0 +DA:1469,0 +DA:1470,0 +DA:1471,0 +DA:1472,0 +DA:1473,0 +DA:1474,0 +DA:1475,0 +DA:1476,0 +DA:1477,0 +DA:1478,0 +DA:1479,0 +DA:1480,0 +DA:1481,0 +DA:1482,0 +DA:1483,0 +DA:1484,0 +DA:1485,0 +DA:1486,0 +DA:1487,0 +DA:1488,0 +DA:1489,0 +DA:1490,0 +DA:1491,0 +DA:1492,0 +DA:1493,0 +DA:1494,0 +DA:1495,0 +DA:1496,0 +DA:1497,0 +DA:1498,0 +DA:1499,0 +DA:1500,0 +DA:1501,0 +DA:1502,0 +DA:1503,0 +DA:1504,0 +DA:1505,0 +DA:1506,0 +DA:1507,0 +DA:1508,0 +DA:1509,0 +DA:1510,0 +DA:1511,0 +DA:1512,0 +DA:1513,0 +DA:1514,0 +DA:1515,0 +DA:1516,0 +DA:1517,0 +DA:1518,0 +DA:1519,0 +DA:1520,0 +DA:1521,0 +DA:1522,0 +DA:1523,0 +LF:1523 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/audit/decorators/audit.decorator.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +LF:366 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/audit/entities/audit-log.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +LF:331 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/audit/entities/transaction-log.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +LF:541 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/audit/interceptors/audit.interceptor.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +LF:618 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/audit/reports/compliance.report.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:765,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:769,0 +DA:770,0 +DA:771,0 +DA:772,0 +DA:773,0 +DA:774,0 +DA:775,0 +DA:776,0 +DA:777,0 +DA:778,0 +DA:779,0 +DA:780,0 +DA:781,0 +DA:782,0 +DA:783,0 +DA:784,0 +DA:785,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:795,0 +DA:796,0 +DA:797,0 +DA:798,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:803,0 +DA:804,0 +DA:805,0 +DA:806,0 +DA:807,0 +DA:808,0 +DA:809,0 +DA:810,0 +DA:811,0 +DA:812,0 +DA:813,0 +DA:814,0 +DA:815,0 +DA:816,0 +DA:817,0 +DA:818,0 +DA:819,0 +DA:820,0 +DA:821,0 +DA:822,0 +DA:823,0 +DA:824,0 +DA:825,0 +DA:826,0 +DA:827,0 +DA:828,0 +DA:829,0 +DA:830,0 +DA:831,0 +DA:832,0 +DA:833,0 +DA:834,0 +DA:835,0 +DA:836,0 +DA:837,0 +DA:838,0 +DA:839,0 +DA:840,0 +DA:841,0 +DA:842,0 +DA:843,0 +DA:844,0 +DA:845,0 +DA:846,0 +DA:847,0 +DA:848,0 +DA:849,0 +DA:850,0 +DA:851,0 +DA:852,0 +DA:853,0 +DA:854,0 +DA:855,0 +DA:856,0 +DA:857,0 +DA:858,0 +DA:859,0 +DA:860,0 +DA:861,0 +DA:862,0 +DA:863,0 +DA:864,0 +DA:865,0 +DA:866,0 +DA:867,0 +DA:868,0 +DA:869,0 +DA:870,0 +DA:871,0 +DA:872,0 +DA:873,0 +DA:874,0 +DA:875,0 +DA:876,0 +DA:877,0 +DA:878,0 +DA:879,0 +DA:880,0 +DA:881,0 +DA:882,0 +DA:883,0 +DA:884,0 +DA:885,0 +DA:886,0 +DA:887,0 +DA:888,0 +DA:889,0 +DA:890,0 +DA:891,0 +DA:892,0 +DA:893,0 +DA:894,0 +DA:895,0 +DA:896,0 +DA:897,0 +DA:898,0 +DA:899,0 +DA:900,0 +DA:901,0 +DA:902,0 +DA:903,0 +DA:904,0 +DA:905,0 +DA:906,0 +DA:907,0 +DA:908,0 +DA:909,0 +DA:910,0 +DA:911,0 +DA:912,0 +DA:913,0 +DA:914,0 +DA:915,0 +DA:916,0 +DA:917,0 +DA:918,0 +DA:919,0 +DA:920,0 +DA:921,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:925,0 +DA:926,0 +DA:927,0 +DA:928,0 +DA:929,0 +DA:930,0 +DA:931,0 +DA:932,0 +DA:933,0 +DA:934,0 +DA:935,0 +DA:936,0 +DA:937,0 +DA:938,0 +DA:939,0 +DA:940,0 +DA:941,0 +DA:942,0 +DA:943,0 +DA:944,0 +DA:945,0 +DA:946,0 +DA:947,0 +DA:948,0 +DA:949,0 +DA:950,0 +DA:951,0 +DA:952,0 +DA:953,0 +DA:954,0 +DA:955,0 +DA:956,0 +DA:957,0 +DA:958,0 +DA:959,0 +DA:960,0 +DA:961,0 +DA:962,0 +DA:963,0 +DA:964,0 +DA:965,0 +DA:966,0 +DA:967,0 +DA:968,0 +DA:969,0 +DA:970,0 +DA:971,0 +DA:972,0 +DA:973,0 +DA:974,0 +DA:975,0 +DA:976,0 +DA:977,0 +DA:978,0 +DA:979,0 +DA:980,0 +DA:981,0 +DA:982,0 +DA:983,0 +DA:984,0 +DA:985,0 +DA:986,0 +DA:987,0 +DA:988,0 +DA:989,0 +DA:990,0 +DA:991,0 +DA:992,0 +DA:993,0 +DA:994,0 +DA:995,0 +DA:996,0 +DA:997,0 +DA:998,0 +DA:999,0 +DA:1000,0 +DA:1001,0 +DA:1002,0 +DA:1003,0 +DA:1004,0 +DA:1005,0 +DA:1006,0 +DA:1007,0 +DA:1008,0 +DA:1009,0 +DA:1010,0 +DA:1011,0 +DA:1012,0 +DA:1013,0 +DA:1014,0 +DA:1015,0 +DA:1016,0 +DA:1017,0 +DA:1018,0 +DA:1019,0 +DA:1020,0 +DA:1021,0 +DA:1022,0 +DA:1023,0 +DA:1024,0 +DA:1025,0 +DA:1026,0 +DA:1027,0 +DA:1028,0 +DA:1029,0 +DA:1030,0 +DA:1031,0 +DA:1032,0 +DA:1033,0 +DA:1034,0 +DA:1035,0 +DA:1036,0 +DA:1037,0 +DA:1038,0 +DA:1039,0 +DA:1040,0 +DA:1041,0 +DA:1042,0 +DA:1043,0 +DA:1044,0 +DA:1045,0 +DA:1046,0 +DA:1047,0 +DA:1048,0 +DA:1049,0 +DA:1050,0 +DA:1051,0 +DA:1052,0 +DA:1053,0 +DA:1054,0 +DA:1055,0 +DA:1056,0 +DA:1057,0 +DA:1058,0 +DA:1059,0 +DA:1060,0 +DA:1061,0 +DA:1062,0 +DA:1063,0 +DA:1064,0 +DA:1065,0 +DA:1066,0 +DA:1067,0 +DA:1068,0 +DA:1069,0 +DA:1070,0 +DA:1071,0 +DA:1072,0 +DA:1073,0 +DA:1074,0 +DA:1075,0 +DA:1076,0 +DA:1077,0 +DA:1078,0 +DA:1079,0 +DA:1080,0 +DA:1081,0 +DA:1082,0 +DA:1083,0 +DA:1084,0 +DA:1085,0 +DA:1086,0 +DA:1087,0 +DA:1088,0 +DA:1089,0 +DA:1090,0 +DA:1091,0 +DA:1092,0 +DA:1093,0 +DA:1094,0 +DA:1095,0 +DA:1096,0 +DA:1097,0 +DA:1098,0 +DA:1099,0 +DA:1100,0 +DA:1101,0 +DA:1102,0 +DA:1103,0 +DA:1104,0 +DA:1105,0 +DA:1106,0 +DA:1107,0 +DA:1108,0 +DA:1109,0 +DA:1110,0 +DA:1111,0 +DA:1112,0 +DA:1113,0 +DA:1114,0 +DA:1115,0 +DA:1116,0 +DA:1117,0 +DA:1118,0 +DA:1119,0 +DA:1120,0 +DA:1121,0 +DA:1122,0 +DA:1123,0 +DA:1124,0 +DA:1125,0 +DA:1126,0 +DA:1127,0 +DA:1128,0 +DA:1129,0 +DA:1130,0 +DA:1131,0 +DA:1132,0 +DA:1133,0 +DA:1134,0 +DA:1135,0 +DA:1136,0 +DA:1137,0 +DA:1138,0 +DA:1139,0 +DA:1140,0 +DA:1141,0 +DA:1142,0 +DA:1143,0 +DA:1144,0 +DA:1145,0 +DA:1146,0 +DA:1147,0 +DA:1148,0 +DA:1149,0 +DA:1150,0 +DA:1151,0 +DA:1152,0 +DA:1153,0 +DA:1154,0 +DA:1155,0 +DA:1156,0 +DA:1157,0 +DA:1158,0 +DA:1159,0 +DA:1160,0 +DA:1161,0 +DA:1162,0 +DA:1163,0 +DA:1164,0 +DA:1165,0 +DA:1166,0 +DA:1167,0 +DA:1168,0 +DA:1169,0 +DA:1170,0 +DA:1171,0 +DA:1172,0 +DA:1173,0 +DA:1174,0 +DA:1175,0 +DA:1176,0 +DA:1177,0 +DA:1178,0 +DA:1179,0 +LF:1179 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/carbon-tracking.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/carbon.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +LF:72 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/analytics/reduction-analytics.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +LF:34 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/calculations/emission-calculator.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +LF:70 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/dto/carbon-calculation.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +LF:69 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/entities/carbon-data.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +LF:78 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/offsets/carbon-offset.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +LF:51 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/reporting/sustainability-report.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +LF:34 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/carbon/tracking/real-time-tracker.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/classification/classification.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +LF:21 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/classification/classification.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +LF:672 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/classification/dto/category.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +LF:290 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/classification/dto/quality-rating.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +LF:531 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/classification/entities/certification.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +LF:275 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/classification/entities/energy-category.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +LF:248 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/classification/entities/energy-quality.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +LF:217 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/decorators/api-version.decorator.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +LF:100 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/decorators/scope.decorator.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +LF:323 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/filters/http-exception.filter.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +LF:370 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/interceptors/response.interceptor.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +LF:292 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/interfaces/response.interface.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +LF:209 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/pipes/transform.pipe.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +LF:261 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/providers/config.provider.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +LF:378 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/providers/database.provider.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +LF:208 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/providers/logger.provider.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +LF:283 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/common/utils/pagination.util.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +LF:236 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/config/database.config.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/config/stellar.config.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +LF:81 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/contract.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +LF:387 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/contracts.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +LF:30 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/soroban-client.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +LF:378 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/contracts/contract.types.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +LF:113 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/contracts/escrow.contract.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +LF:90 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/contracts/governance.contract.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +LF:90 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/contracts/token.contract.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +LF:91 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/deployer/deployer.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +LF:161 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/dto/contract-call.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +LF:133 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/contracts/entities/contract.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +LF:99 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/cross-border/cross-border.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +LF:30 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/cross-border/compliance/regulation-service.ts +FN:38,RegulationService +FN:42,initializeRegulations +FN:254,checkCompliance +FN:303,getApplicableRegulations +FN:328,performComplianceCheck +FN:380,determineOverallStatus +FN:395,calculateNextReviewDate +FN:417,calculateDeadline +FN:431,getRegulationByCode +FN:435,getAllRegulations +FN:439,getRegulationsByCountry +FNF:11 +FNH:11 +FNDA:18,RegulationService +FNDA:18,initializeRegulations +FNDA:14,checkCompliance +FNDA:14,getApplicableRegulations +FNDA:78,performComplianceCheck +FNDA:14,determineOverallStatus +FNDA:14,calculateNextReviewDate +FNDA:78,calculateDeadline +FNDA:2,getRegulationByCode +FNDA:1,getAllRegulations +FNDA:3,getRegulationsByCountry +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,18 +DA:40,18 +DA:41,1 +DA:42,1 +DA:43,18 +DA:44,18 +DA:45,18 +DA:46,18 +DA:47,18 +DA:48,18 +DA:49,18 +DA:50,18 +DA:51,18 +DA:52,18 +DA:53,18 +DA:54,18 +DA:55,18 +DA:56,18 +DA:57,18 +DA:58,18 +DA:59,18 +DA:60,18 +DA:61,18 +DA:62,18 +DA:63,18 +DA:64,18 +DA:65,18 +DA:66,18 +DA:67,18 +DA:68,18 +DA:69,18 +DA:70,18 +DA:71,18 +DA:72,18 +DA:73,18 +DA:74,18 +DA:75,18 +DA:76,18 +DA:77,18 +DA:78,18 +DA:79,18 +DA:80,18 +DA:81,18 +DA:82,18 +DA:83,18 +DA:84,18 +DA:85,18 +DA:86,18 +DA:87,18 +DA:88,18 +DA:89,18 +DA:90,18 +DA:91,18 +DA:92,18 +DA:93,18 +DA:94,18 +DA:95,18 +DA:96,18 +DA:97,18 +DA:98,18 +DA:99,18 +DA:100,18 +DA:101,18 +DA:102,18 +DA:103,18 +DA:104,18 +DA:105,18 +DA:106,18 +DA:107,18 +DA:108,18 +DA:109,18 +DA:110,18 +DA:111,18 +DA:112,18 +DA:113,18 +DA:114,18 +DA:115,18 +DA:116,18 +DA:117,18 +DA:118,18 +DA:119,18 +DA:120,18 +DA:121,18 +DA:122,18 +DA:123,18 +DA:124,18 +DA:125,18 +DA:126,18 +DA:127,18 +DA:128,18 +DA:129,18 +DA:130,18 +DA:131,18 +DA:132,18 +DA:133,18 +DA:134,18 +DA:135,18 +DA:136,18 +DA:137,18 +DA:138,18 +DA:139,18 +DA:140,18 +DA:141,18 +DA:142,18 +DA:143,18 +DA:144,18 +DA:145,18 +DA:146,18 +DA:147,18 +DA:148,18 +DA:149,18 +DA:150,18 +DA:151,18 +DA:152,18 +DA:153,18 +DA:154,18 +DA:155,18 +DA:156,18 +DA:157,18 +DA:158,18 +DA:159,18 +DA:160,18 +DA:161,18 +DA:162,18 +DA:163,18 +DA:164,18 +DA:165,18 +DA:166,18 +DA:167,18 +DA:168,18 +DA:169,18 +DA:170,18 +DA:171,18 +DA:172,18 +DA:173,18 +DA:174,18 +DA:175,18 +DA:176,18 +DA:177,18 +DA:178,18 +DA:179,18 +DA:180,18 +DA:181,18 +DA:182,18 +DA:183,18 +DA:184,18 +DA:185,18 +DA:186,18 +DA:187,18 +DA:188,18 +DA:189,18 +DA:190,18 +DA:191,18 +DA:192,18 +DA:193,18 +DA:194,18 +DA:195,18 +DA:196,18 +DA:197,18 +DA:198,18 +DA:199,18 +DA:200,18 +DA:201,18 +DA:202,18 +DA:203,18 +DA:204,18 +DA:205,18 +DA:206,18 +DA:207,18 +DA:208,18 +DA:209,18 +DA:210,18 +DA:211,18 +DA:212,18 +DA:213,18 +DA:214,18 +DA:215,18 +DA:216,18 +DA:217,18 +DA:218,18 +DA:219,18 +DA:220,18 +DA:221,18 +DA:222,18 +DA:223,18 +DA:224,18 +DA:225,18 +DA:226,18 +DA:227,18 +DA:228,18 +DA:229,18 +DA:230,18 +DA:231,18 +DA:232,18 +DA:233,18 +DA:234,18 +DA:235,18 +DA:236,18 +DA:237,18 +DA:238,18 +DA:239,18 +DA:240,18 +DA:241,18 +DA:242,18 +DA:243,18 +DA:244,18 +DA:245,18 +DA:246,180 +DA:247,18 +DA:248,18 +DA:249,18 +DA:250,18 +DA:251,18 +DA:252,18 +DA:253,1 +DA:254,1 +DA:255,14 +DA:256,14 +DA:257,14 +DA:258,14 +DA:259,14 +DA:260,14 +DA:261,14 +DA:262,14 +DA:263,14 +DA:264,14 +DA:265,14 +DA:266,14 +DA:267,14 +DA:268,14 +DA:269,14 +DA:270,14 +DA:271,14 +DA:272,14 +DA:273,14 +DA:274,14 +DA:275,78 +DA:276,78 +DA:277,78 +DA:278,78 +DA:279,78 +DA:280,78 +DA:281,78 +DA:282,78 +DA:283,78 +DA:284,78 +DA:285,78 +DA:286,78 +DA:287,13 +DA:288,13 +DA:289,78 +DA:290,14 +DA:291,14 +DA:292,14 +DA:293,14 +DA:294,14 +DA:295,14 +DA:296,14 +DA:297,14 +DA:298,14 +DA:299,14 +DA:300,14 +DA:301,14 +DA:302,1 +DA:303,1 +DA:304,14 +DA:305,14 +DA:306,14 +DA:307,14 +DA:308,14 +DA:309,14 +DA:310,14 +DA:311,140 +DA:312,140 +DA:313,140 +DA:314,140 +DA:315,140 +DA:316,140 +DA:317,140 +DA:318,140 +DA:319,140 +DA:320,140 +DA:321,78 +DA:322,78 +DA:323,140 +DA:324,14 +DA:325,14 +DA:326,14 +DA:327,1 +DA:328,1 +DA:329,78 +DA:330,78 +DA:331,78 +DA:332,78 +DA:333,78 +DA:334,78 +DA:335,6 +DA:336,6 +DA:337,6 +DA:338,6 +DA:339,6 +DA:340,6 +DA:341,6 +DA:342,72 +DA:343,78 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,72 +DA:351,78 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,72 +DA:360,72 +DA:361,72 +DA:362,72 +DA:363,72 +DA:364,78 +DA:365,8 +DA:366,8 +DA:367,78 +DA:368,7 +DA:369,7 +DA:370,7 +DA:371,72 +DA:372,72 +DA:373,72 +DA:374,72 +DA:375,72 +DA:376,72 +DA:377,72 +DA:378,72 +DA:379,1 +DA:380,1 +DA:381,14 +DA:382,14 +DA:383,14 +DA:384,14 +DA:385,14 +DA:386,14 +DA:387,7 +DA:388,7 +DA:389,5 +DA:390,7 +DA:391,2 +DA:392,2 +DA:393,14 +DA:394,1 +DA:395,1 +DA:396,14 +DA:397,14 +DA:398,78 +DA:399,78 +DA:400,30 +DA:401,78 +DA:402,3 +DA:403,78 +DA:404,29 +DA:405,78 +DA:406,14 +DA:407,78 +DA:408,2 +DA:409,78 +DA:410,0 +DA:411,78 +DA:412,14 +DA:413,14 +DA:414,14 +DA:415,14 +DA:416,1 +DA:417,1 +DA:418,78 +DA:419,78 +DA:420,78 +DA:421,30 +DA:422,78 +DA:423,3 +DA:424,78 +DA:425,29 +DA:426,78 +DA:427,16 +DA:428,78 +DA:429,78 +DA:430,1 +DA:431,1 +DA:432,2 +DA:433,2 +DA:434,1 +DA:435,1 +DA:436,1 +DA:437,1 +DA:438,1 +DA:439,1 +DA:440,3 +DA:441,3 +DA:442,30 +DA:443,3 +DA:444,3 +DA:445,3 +DA:446,1 +LF:446 +LH:432 +BRDA:38,0,0,18 +BRDA:42,1,0,18 +BRDA:245,2,0,180 +BRDA:254,3,0,14 +BRDA:274,4,0,78 +BRDA:286,5,0,13 +BRDA:303,6,0,14 +BRDA:310,7,0,140 +BRDA:312,8,0,70 +BRDA:313,9,0,42 +BRDA:317,10,0,70 +BRDA:320,11,0,119 +BRDA:320,12,0,78 +BRDA:328,13,0,78 +BRDA:334,14,0,6 +BRDA:342,15,0,72 +BRDA:343,16,0,0 +BRDA:343,17,0,0 +BRDA:350,18,0,72 +BRDA:351,19,0,0 +BRDA:351,20,0,0 +BRDA:359,21,0,72 +BRDA:364,22,0,8 +BRDA:367,23,0,64 +BRDA:367,24,0,7 +BRDA:371,25,0,72 +BRDA:380,26,0,14 +BRDA:386,27,0,7 +BRDA:388,28,0,5 +BRDA:390,29,0,2 +BRDA:383,30,0,58 +BRDA:384,31,0,59 +BRDA:395,32,0,14 +BRDA:397,33,0,78 +BRDA:399,34,0,30 +BRDA:401,35,0,3 +BRDA:403,36,0,29 +BRDA:405,37,0,14 +BRDA:407,38,0,2 +BRDA:409,39,0,0 +BRDA:414,40,0,78 +BRDA:417,41,0,78 +BRDA:420,42,0,30 +BRDA:422,43,0,3 +BRDA:424,44,0,29 +BRDA:426,45,0,16 +BRDA:431,46,0,2 +BRDA:435,47,0,1 +BRDA:439,48,0,3 +BRDA:441,49,0,30 +BRDA:442,50,0,15 +BRF:51 +BRH:46 +end_of_record +TN: +SF:src/cross-border/controller/cross-border.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +LF:346 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/cross-border/currency/currency-service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +LF:442 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/cross-border/dto/international-trade.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +LF:242 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/cross-border/entities/cross-border-transaction.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +LF:117 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/cross-border/reporting/regulatory-report.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +LF:720 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/cross-border/tariffs/customs-service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +LF:596 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/cross-border/transactions/transaction-processor.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +LF:381 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/database/sharding/partitioning.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +LF:58 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/database/sharding/rebalancing.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +LF:60 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/database/sharding/shard-router.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +LF:82 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/database/sharding/sharding.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +LF:25 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/database/sharding/entities/shard-metadata.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +LF:34 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/database/sharding/monitoring/shard-health.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +LF:67 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/energy.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +LF:608 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/energy.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +LF:23 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/energy.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:765,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:769,0 +DA:770,0 +DA:771,0 +DA:772,0 +DA:773,0 +DA:774,0 +DA:775,0 +DA:776,0 +DA:777,0 +DA:778,0 +DA:779,0 +DA:780,0 +DA:781,0 +DA:782,0 +DA:783,0 +DA:784,0 +DA:785,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:795,0 +DA:796,0 +DA:797,0 +DA:798,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:803,0 +DA:804,0 +DA:805,0 +DA:806,0 +DA:807,0 +DA:808,0 +DA:809,0 +DA:810,0 +DA:811,0 +DA:812,0 +DA:813,0 +DA:814,0 +DA:815,0 +DA:816,0 +DA:817,0 +DA:818,0 +DA:819,0 +DA:820,0 +DA:821,0 +DA:822,0 +DA:823,0 +DA:824,0 +DA:825,0 +DA:826,0 +DA:827,0 +DA:828,0 +DA:829,0 +DA:830,0 +DA:831,0 +DA:832,0 +DA:833,0 +DA:834,0 +DA:835,0 +DA:836,0 +DA:837,0 +DA:838,0 +DA:839,0 +DA:840,0 +DA:841,0 +DA:842,0 +DA:843,0 +DA:844,0 +DA:845,0 +DA:846,0 +DA:847,0 +DA:848,0 +DA:849,0 +DA:850,0 +DA:851,0 +DA:852,0 +DA:853,0 +DA:854,0 +DA:855,0 +DA:856,0 +DA:857,0 +DA:858,0 +DA:859,0 +DA:860,0 +DA:861,0 +DA:862,0 +DA:863,0 +DA:864,0 +DA:865,0 +DA:866,0 +DA:867,0 +DA:868,0 +DA:869,0 +DA:870,0 +DA:871,0 +DA:872,0 +DA:873,0 +DA:874,0 +DA:875,0 +DA:876,0 +DA:877,0 +DA:878,0 +DA:879,0 +DA:880,0 +DA:881,0 +DA:882,0 +DA:883,0 +DA:884,0 +DA:885,0 +DA:886,0 +DA:887,0 +DA:888,0 +DA:889,0 +DA:890,0 +DA:891,0 +DA:892,0 +DA:893,0 +DA:894,0 +DA:895,0 +DA:896,0 +DA:897,0 +DA:898,0 +DA:899,0 +DA:900,0 +DA:901,0 +DA:902,0 +DA:903,0 +DA:904,0 +DA:905,0 +DA:906,0 +DA:907,0 +DA:908,0 +DA:909,0 +DA:910,0 +DA:911,0 +DA:912,0 +DA:913,0 +DA:914,0 +DA:915,0 +DA:916,0 +DA:917,0 +DA:918,0 +DA:919,0 +DA:920,0 +DA:921,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:925,0 +DA:926,0 +DA:927,0 +DA:928,0 +DA:929,0 +DA:930,0 +DA:931,0 +DA:932,0 +DA:933,0 +DA:934,0 +DA:935,0 +DA:936,0 +DA:937,0 +DA:938,0 +DA:939,0 +DA:940,0 +DA:941,0 +DA:942,0 +DA:943,0 +DA:944,0 +DA:945,0 +DA:946,0 +DA:947,0 +DA:948,0 +DA:949,0 +DA:950,0 +DA:951,0 +DA:952,0 +DA:953,0 +DA:954,0 +DA:955,0 +DA:956,0 +DA:957,0 +LF:957 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/config/swagger.config.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +LF:380 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/dto/create-listing.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +LF:358 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/dto/execute-trade.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +LF:345 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/dto/place-bid.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +LF:241 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/dto/update-listing.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +LF:4 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/entities/bid.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +LF:220 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/entities/energy-listing.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +LF:241 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/entities/trade.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +LF:349 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/filters/http-exception.filter.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +LF:104 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/energy/guards/auth.guard.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +LF:37 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/forecasting/market-forecasting.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +LF:592 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/forecasting/market-forecasting.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +LF:36 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/forecasting/analysis/economic-indicator.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +LF:617 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/forecasting/dto/forecast-query.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +LF:120 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/forecasting/ensemble/ensemble-methods.service.ts +FN:49,EnsembleMethodsService +FN:51,createEnsembleForecast +FN:118,optimizeEnsemble +FN:159,baggingEnsemble +FN:207,boostingEnsemble +FN:268,stackingEnsemble +FN:349,evaluateEnsemblePerformance +FN:406,generateIndividualForecasts +FN:468,enhanceForecastWithExternalData +FN:502,calculateOptimalWeights +FN:526,applyEnsembleMethod +FN:543,weightedAverage +FN:608,majorityVoting +FN:643,rankedVoting +FN:689,calculateDiversity +FN:700,calculateErrorReduction +FN:723,calculateEnsembleConfidence +FN:736,calculateAgreement +FN:747,calculateForecastVariance +FN:752,calculateVariance +FN:763,evaluateModels +FN:815,selectBestModels +FN:825,calculateWeightsFromPerformance +FN:832,createBootstrapSample +FN:843,aggregateBootstrapForecasts +FN:868,calculateBootstrapWeights +FN:878,calculateBootstrapErrorReduction +FN:892,calculateBootstrapConfidence +FN:896,calculateResiduals +FN:903,updateDataWeights +FN:915,createBoostedForecast +FN:943,createWeightMap +FN:954,calculateBoostingErrorReduction +FN:963,calculateBoostingConfidence +FN:975,createCrossValidationFolds +FN:996,trainMetaModel +FN:1013,trainLinearRegression +FN:1040,trainRidgeRegression +FN:1050,trainLassoRegression +FN:1060,applyMetaModel +FN:1087,calculateStackingErrorReduction +FN:1100,calculateStackingConfidence +FN:1113,calculateReliability +FN:1124,calculateCorrelation +FNF:44 +FNH:27 +FNDA:18,EnsembleMethodsService +FNDA:14,createEnsembleForecast +FNDA:2,optimizeEnsemble +FNDA:2,baggingEnsemble +FNDA:0,boostingEnsemble +FNDA:0,stackingEnsemble +FNDA:2,evaluateEnsemblePerformance +FNDA:24,generateIndividualForecasts +FNDA:0,enhanceForecastWithExternalData +FNDA:13,calculateOptimalWeights +FNDA:13,applyEnsembleMethod +FNDA:11,weightedAverage +FNDA:1,majorityVoting +FNDA:1,rankedVoting +FNDA:17,calculateDiversity +FNDA:13,calculateErrorReduction +FNDA:13,calculateEnsembleConfidence +FNDA:16,calculateAgreement +FNDA:15,calculateForecastVariance +FNDA:47,calculateVariance +FNDA:2,evaluateModels +FNDA:2,selectBestModels +FNDA:2,calculateWeightsFromPerformance +FNDA:8,createBootstrapSample +FNDA:2,aggregateBootstrapForecasts +FNDA:2,calculateBootstrapWeights +FNDA:2,calculateBootstrapErrorReduction +FNDA:2,calculateBootstrapConfidence +FNDA:0,calculateResiduals +FNDA:0,updateDataWeights +FNDA:0,createBoostedForecast +FNDA:0,createWeightMap +FNDA:0,calculateBoostingErrorReduction +FNDA:0,calculateBoostingConfidence +FNDA:0,createCrossValidationFolds +FNDA:0,trainMetaModel +FNDA:0,trainLinearRegression +FNDA:0,trainRidgeRegression +FNDA:0,trainLassoRegression +FNDA:0,applyMetaModel +FNDA:0,calculateStackingErrorReduction +FNDA:0,calculateStackingConfidence +FNDA:1,calculateReliability +FNDA:1,calculateCorrelation +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,14 +DA:53,14 +DA:54,14 +DA:55,14 +DA:56,14 +DA:57,14 +DA:58,14 +DA:59,14 +DA:60,14 +DA:61,14 +DA:62,14 +DA:63,14 +DA:64,14 +DA:65,14 +DA:66,14 +DA:67,14 +DA:68,14 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,13 +DA:74,13 +DA:75,13 +DA:76,13 +DA:77,13 +DA:78,13 +DA:79,13 +DA:80,13 +DA:81,13 +DA:82,13 +DA:83,13 +DA:84,14 +DA:85,14 +DA:86,14 +DA:87,14 +DA:88,14 +DA:89,14 +DA:90,14 +DA:91,14 +DA:92,14 +DA:93,14 +DA:94,14 +DA:95,14 +DA:96,14 +DA:97,14 +DA:98,14 +DA:99,14 +DA:100,14 +DA:101,14 +DA:102,14 +DA:103,14 +DA:104,14 +DA:105,14 +DA:106,14 +DA:107,14 +DA:108,14 +DA:109,14 +DA:110,14 +DA:111,14 +DA:112,14 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,14 +DA:117,1 +DA:118,1 +DA:119,2 +DA:120,2 +DA:121,2 +DA:122,2 +DA:123,2 +DA:124,2 +DA:125,2 +DA:126,2 +DA:127,2 +DA:128,2 +DA:129,2 +DA:130,2 +DA:131,2 +DA:132,2 +DA:133,2 +DA:134,2 +DA:135,2 +DA:136,2 +DA:137,2 +DA:138,2 +DA:139,2 +DA:140,2 +DA:141,2 +DA:142,2 +DA:143,2 +DA:144,2 +DA:145,2 +DA:146,2 +DA:147,2 +DA:148,2 +DA:149,2 +DA:150,2 +DA:151,2 +DA:152,2 +DA:153,2 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,2 +DA:158,1 +DA:159,1 +DA:160,2 +DA:161,2 +DA:162,2 +DA:163,2 +DA:164,2 +DA:165,2 +DA:166,2 +DA:167,2 +DA:168,2 +DA:169,8 +DA:170,8 +DA:171,8 +DA:172,8 +DA:173,8 +DA:174,8 +DA:175,8 +DA:176,8 +DA:177,8 +DA:178,8 +DA:179,8 +DA:180,8 +DA:181,2 +DA:182,2 +DA:183,2 +DA:184,2 +DA:185,2 +DA:186,2 +DA:187,2 +DA:188,2 +DA:189,2 +DA:190,2 +DA:191,2 +DA:192,2 +DA:193,2 +DA:194,2 +DA:195,2 +DA:196,2 +DA:197,2 +DA:198,2 +DA:199,2 +DA:200,2 +DA:201,2 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,2 +DA:206,1 +DA:207,1 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,1 +DA:268,1 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,1 +DA:349,1 +DA:350,2 +DA:351,2 +DA:352,2 +DA:353,2 +DA:354,2 +DA:355,2 +DA:356,2 +DA:357,2 +DA:358,2 +DA:359,2 +DA:360,1 +DA:361,1 +DA:362,1 +DA:363,1 +DA:364,1 +DA:365,1 +DA:366,1 +DA:367,1 +DA:368,1 +DA:369,1 +DA:370,1 +DA:371,1 +DA:372,1 +DA:373,1 +DA:374,1 +DA:375,1 +DA:376,1 +DA:377,1 +DA:378,1 +DA:379,1 +DA:380,1 +DA:381,1 +DA:382,1 +DA:383,1 +DA:384,1 +DA:385,1 +DA:386,1 +DA:387,1 +DA:388,1 +DA:389,1 +DA:390,1 +DA:391,1 +DA:392,1 +DA:393,1 +DA:394,1 +DA:395,1 +DA:396,1 +DA:397,1 +DA:398,1 +DA:399,1 +DA:400,2 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,2 +DA:405,1 +DA:406,1 +DA:407,24 +DA:408,24 +DA:409,24 +DA:410,24 +DA:411,24 +DA:412,24 +DA:413,24 +DA:414,24 +DA:415,24 +DA:416,36 +DA:417,36 +DA:418,36 +DA:419,36 +DA:420,36 +DA:421,16 +DA:422,16 +DA:423,16 +DA:424,16 +DA:425,12 +DA:426,36 +DA:427,8 +DA:428,8 +DA:429,8 +DA:430,8 +DA:431,8 +DA:432,5 +DA:433,36 +DA:434,8 +DA:435,5 +DA:436,36 +DA:437,2 +DA:438,2 +DA:439,2 +DA:440,2 +DA:441,2 +DA:442,36 +DA:443,2 +DA:444,2 +DA:445,36 +DA:446,24 +DA:447,24 +DA:448,36 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,24 +DA:456,24 +DA:457,36 +DA:458,10 +DA:459,10 +DA:460,10 +DA:461,10 +DA:462,10 +DA:463,36 +DA:464,24 +DA:465,24 +DA:466,24 +DA:467,1 +DA:468,1 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,1 +DA:502,1 +DA:503,13 +DA:504,13 +DA:505,13 +DA:506,13 +DA:507,1 +DA:508,1 +DA:509,1 +DA:510,3 +DA:511,1 +DA:512,1 +DA:513,1 +DA:514,12 +DA:515,12 +DA:516,12 +DA:517,12 +DA:518,12 +DA:519,12 +DA:520,19 +DA:521,12 +DA:522,12 +DA:523,12 +DA:524,12 +DA:525,1 +DA:526,1 +DA:527,13 +DA:528,13 +DA:529,13 +DA:530,13 +DA:531,13 +DA:532,13 +DA:533,11 +DA:534,13 +DA:535,1 +DA:536,13 +DA:537,1 +DA:538,13 +DA:539,0 +DA:540,13 +DA:541,13 +DA:542,1 +DA:543,1 +DA:544,11 +DA:545,11 +DA:546,11 +DA:547,11 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,11 +DA:562,11 +DA:563,11 +DA:564,11 +DA:565,11 +DA:566,11 +DA:567,16 +DA:568,16 +DA:569,16 +DA:570,16 +DA:571,11 +DA:572,11 +DA:573,11 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,11 +DA:583,11 +DA:584,11 +DA:585,11 +DA:586,11 +DA:587,11 +DA:588,11 +DA:589,11 +DA:590,11 +DA:591,11 +DA:592,11 +DA:593,11 +DA:594,11 +DA:595,11 +DA:596,11 +DA:597,11 +DA:598,11 +DA:599,11 +DA:600,11 +DA:601,11 +DA:602,11 +DA:603,11 +DA:604,11 +DA:605,11 +DA:606,11 +DA:607,1 +DA:608,1 +DA:609,1 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,1 +DA:619,1 +DA:620,1 +DA:621,1 +DA:622,1 +DA:623,1 +DA:624,1 +DA:625,1 +DA:626,1 +DA:627,1 +DA:628,1 +DA:629,1 +DA:630,1 +DA:631,1 +DA:632,1 +DA:633,1 +DA:634,1 +DA:635,1 +DA:636,1 +DA:637,1 +DA:638,1 +DA:639,1 +DA:640,1 +DA:641,1 +DA:642,1 +DA:643,1 +DA:644,1 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,1 +DA:654,1 +DA:655,1 +DA:656,1 +DA:657,1 +DA:658,1 +DA:659,1 +DA:660,1 +DA:661,1 +DA:662,1 +DA:663,1 +DA:664,3 +DA:665,3 +DA:666,3 +DA:667,1 +DA:668,1 +DA:669,1 +DA:670,1 +DA:671,1 +DA:672,1 +DA:673,1 +DA:674,1 +DA:675,1 +DA:676,1 +DA:677,1 +DA:678,1 +DA:679,1 +DA:680,1 +DA:681,1 +DA:682,1 +DA:683,1 +DA:684,1 +DA:685,1 +DA:686,1 +DA:687,1 +DA:688,1 +DA:689,1 +DA:690,17 +DA:691,8 +DA:692,8 +DA:693,8 +DA:694,8 +DA:695,8 +DA:696,8 +DA:697,8 +DA:698,8 +DA:699,1 +DA:700,1 +DA:701,13 +DA:702,13 +DA:703,13 +DA:704,13 +DA:705,0 +DA:706,0 +DA:707,13 +DA:708,13 +DA:709,13 +DA:710,13 +DA:711,13 +DA:712,13 +DA:713,13 +DA:714,0 +DA:715,0 +DA:716,13 +DA:717,13 +DA:718,13 +DA:719,13 +DA:720,13 +DA:721,13 +DA:722,1 +DA:723,1 +DA:724,13 +DA:725,13 +DA:726,13 +DA:727,13 +DA:728,13 +DA:729,13 +DA:730,13 +DA:731,13 +DA:732,13 +DA:733,13 +DA:734,13 +DA:735,1 +DA:736,1 +DA:737,16 +DA:738,8 +DA:739,8 +DA:740,8 +DA:741,8 +DA:742,8 +DA:743,8 +DA:744,8 +DA:745,8 +DA:746,1 +DA:747,1 +DA:748,15 +DA:749,15 +DA:750,15 +DA:751,1 +DA:752,1 +DA:753,47 +DA:754,46 +DA:755,46 +DA:756,46 +DA:757,46 +DA:758,46 +DA:759,46 +DA:760,46 +DA:761,46 +DA:762,1 +DA:763,1 +DA:764,2 +DA:765,2 +DA:766,2 +DA:767,2 +DA:768,2 +DA:769,2 +DA:770,2 +DA:771,2 +DA:772,10 +DA:773,10 +DA:774,10 +DA:775,10 +DA:776,10 +DA:777,10 +DA:778,10 +DA:779,10 +DA:780,10 +DA:781,2 +DA:782,2 +DA:783,2 +DA:784,10 +DA:785,10 +DA:786,10 +DA:787,10 +DA:788,10 +DA:789,10 +DA:790,10 +DA:791,10 +DA:792,10 +DA:793,10 +DA:794,10 +DA:795,10 +DA:796,10 +DA:797,10 +DA:798,10 +DA:799,10 +DA:800,10 +DA:801,10 +DA:802,10 +DA:803,10 +DA:804,10 +DA:805,10 +DA:806,10 +DA:807,10 +DA:808,2 +DA:809,2 +DA:810,10 +DA:811,2 +DA:812,2 +DA:813,2 +DA:814,1 +DA:815,1 +DA:816,2 +DA:817,2 +DA:818,2 +DA:819,2 +DA:820,2 +DA:821,2 +DA:822,2 +DA:823,2 +DA:824,1 +DA:825,1 +DA:826,2 +DA:827,2 +DA:828,2 +DA:829,2 +DA:830,2 +DA:831,1 +DA:832,1 +DA:833,8 +DA:834,8 +DA:835,40 +DA:836,40 +DA:837,40 +DA:838,8 +DA:839,8 +DA:840,8 +DA:841,8 +DA:842,1 +DA:843,1 +DA:844,2 +DA:845,2 +DA:846,2 +DA:847,2 +DA:848,2 +DA:849,2 +DA:850,2 +DA:851,2 +DA:852,2 +DA:853,2 +DA:854,2 +DA:855,2 +DA:856,2 +DA:857,2 +DA:858,2 +DA:859,2 +DA:860,2 +DA:861,2 +DA:862,2 +DA:863,2 +DA:864,2 +DA:865,2 +DA:866,2 +DA:867,1 +DA:868,1 +DA:869,2 +DA:870,2 +DA:871,2 +DA:872,2 +DA:873,8 +DA:874,2 +DA:875,2 +DA:876,2 +DA:877,1 +DA:878,1 +DA:879,2 +DA:880,2 +DA:881,2 +DA:882,2 +DA:883,2 +DA:884,2 +DA:885,2 +DA:886,2 +DA:887,2 +DA:888,2 +DA:889,2 +DA:890,2 +DA:891,1 +DA:892,1 +DA:893,2 +DA:894,2 +DA:895,1 +DA:896,1 +DA:897,0 +DA:898,0 +DA:899,0 +DA:900,0 +DA:901,0 +DA:902,1 +DA:903,1 +DA:904,0 +DA:905,0 +DA:906,0 +DA:907,0 +DA:908,0 +DA:909,0 +DA:910,0 +DA:911,0 +DA:912,0 +DA:913,0 +DA:914,1 +DA:915,1 +DA:916,0 +DA:917,0 +DA:918,0 +DA:919,0 +DA:920,0 +DA:921,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:925,0 +DA:926,0 +DA:927,0 +DA:928,0 +DA:929,0 +DA:930,0 +DA:931,0 +DA:932,0 +DA:933,0 +DA:934,0 +DA:935,0 +DA:936,0 +DA:937,0 +DA:938,0 +DA:939,0 +DA:940,0 +DA:941,0 +DA:942,1 +DA:943,1 +DA:944,0 +DA:945,0 +DA:946,0 +DA:947,0 +DA:948,0 +DA:949,0 +DA:950,0 +DA:951,0 +DA:952,0 +DA:953,1 +DA:954,1 +DA:955,0 +DA:956,0 +DA:957,0 +DA:958,0 +DA:959,0 +DA:960,0 +DA:961,0 +DA:962,1 +DA:963,1 +DA:964,0 +DA:965,0 +DA:966,0 +DA:967,0 +DA:968,0 +DA:969,0 +DA:970,0 +DA:971,0 +DA:972,0 +DA:973,0 +DA:974,1 +DA:975,1 +DA:976,0 +DA:977,0 +DA:978,0 +DA:979,0 +DA:980,0 +DA:981,0 +DA:982,0 +DA:983,0 +DA:984,0 +DA:985,0 +DA:986,0 +DA:987,0 +DA:988,0 +DA:989,0 +DA:990,0 +DA:991,0 +DA:992,0 +DA:993,0 +DA:994,0 +DA:995,1 +DA:996,1 +DA:997,0 +DA:998,0 +DA:999,0 +DA:1000,0 +DA:1001,0 +DA:1002,0 +DA:1003,0 +DA:1004,0 +DA:1005,0 +DA:1006,0 +DA:1007,0 +DA:1008,0 +DA:1009,0 +DA:1010,0 +DA:1011,0 +DA:1012,1 +DA:1013,1 +DA:1014,0 +DA:1015,0 +DA:1016,0 +DA:1017,0 +DA:1018,0 +DA:1019,0 +DA:1020,0 +DA:1021,0 +DA:1022,0 +DA:1023,0 +DA:1024,0 +DA:1025,0 +DA:1026,0 +DA:1027,0 +DA:1028,0 +DA:1029,0 +DA:1030,0 +DA:1031,0 +DA:1032,0 +DA:1033,0 +DA:1034,0 +DA:1035,0 +DA:1036,0 +DA:1037,0 +DA:1038,0 +DA:1039,1 +DA:1040,1 +DA:1041,0 +DA:1042,0 +DA:1043,0 +DA:1044,0 +DA:1045,0 +DA:1046,0 +DA:1047,0 +DA:1048,0 +DA:1049,1 +DA:1050,1 +DA:1051,0 +DA:1052,0 +DA:1053,0 +DA:1054,0 +DA:1055,0 +DA:1056,0 +DA:1057,0 +DA:1058,0 +DA:1059,1 +DA:1060,1 +DA:1061,0 +DA:1062,0 +DA:1063,0 +DA:1064,0 +DA:1065,0 +DA:1066,0 +DA:1067,0 +DA:1068,0 +DA:1069,0 +DA:1070,0 +DA:1071,0 +DA:1072,0 +DA:1073,0 +DA:1074,0 +DA:1075,0 +DA:1076,0 +DA:1077,0 +DA:1078,0 +DA:1079,0 +DA:1080,0 +DA:1081,0 +DA:1082,0 +DA:1083,0 +DA:1084,0 +DA:1085,0 +DA:1086,1 +DA:1087,1 +DA:1088,0 +DA:1089,0 +DA:1090,0 +DA:1091,0 +DA:1092,0 +DA:1093,0 +DA:1094,0 +DA:1095,0 +DA:1096,0 +DA:1097,0 +DA:1098,0 +DA:1099,1 +DA:1100,1 +DA:1101,0 +DA:1102,0 +DA:1103,0 +DA:1104,0 +DA:1105,0 +DA:1106,0 +DA:1107,0 +DA:1108,0 +DA:1109,0 +DA:1110,0 +DA:1111,0 +DA:1112,1 +DA:1113,1 +DA:1114,1 +DA:1115,1 +DA:1116,1 +DA:1117,1 +DA:1118,1 +DA:1119,1 +DA:1120,1 +DA:1121,1 +DA:1122,1 +DA:1123,1 +DA:1124,1 +DA:1125,1 +DA:1126,1 +DA:1127,1 +DA:1128,1 +DA:1129,1 +DA:1130,1 +DA:1131,1 +DA:1132,1 +DA:1133,1 +DA:1134,1 +DA:1135,1 +DA:1136,1 +DA:1137,1 +DA:1138,1 +DA:1139,1 +DA:1140,1 +DA:1141,1 +LF:1141 +LH:725 +BRDA:49,0,0,18 +BRDA:51,1,0,14 +BRDA:68,2,0,1 +BRDA:73,3,0,13 +BRDA:84,4,0,0 +BRDA:106,5,0,0 +BRDA:112,6,0,1 +BRDA:118,7,0,2 +BRDA:153,8,0,0 +BRDA:159,9,0,2 +BRDA:168,10,0,8 +BRDA:201,11,0,0 +BRDA:349,12,0,2 +BRDA:359,13,0,1 +BRDA:400,14,0,0 +BRDA:369,15,0,2 +BRDA:372,16,0,2 +BRDA:374,17,0,2 +BRDA:377,18,0,2 +BRDA:379,19,0,2 +BRDA:382,20,0,2 +BRDA:406,21,0,24 +BRDA:415,22,0,36 +BRDA:420,23,0,16 +BRDA:425,24,0,12 +BRDA:426,25,0,8 +BRDA:432,26,0,5 +BRDA:433,27,0,8 +BRDA:435,28,0,5 +BRDA:436,29,0,2 +BRDA:442,30,0,2 +BRDA:446,31,0,24 +BRDA:448,32,0,0 +BRDA:455,33,0,24 +BRDA:457,34,0,10 +BRDA:502,35,0,13 +BRDA:506,36,0,1 +BRDA:506,37,0,1 +BRDA:514,38,0,12 +BRDA:509,39,0,3 +BRDA:516,40,0,19 +BRDA:519,41,0,19 +BRDA:526,42,0,13 +BRDA:532,43,0,11 +BRDA:534,44,0,1 +BRDA:536,45,0,1 +BRDA:538,46,0,0 +BRDA:543,47,0,11 +BRDA:547,48,0,0 +BRDA:573,49,0,0 +BRDA:566,50,0,16 +BRDA:567,51,0,0 +BRDA:587,52,0,16 +BRDA:608,53,0,1 +BRDA:609,54,0,0 +BRDA:621,55,0,3 +BRDA:630,56,0,3 +BRDA:643,57,0,1 +BRDA:644,58,0,0 +BRDA:656,59,0,4 +BRDA:663,60,0,3 +BRDA:671,61,0,3 +BRDA:689,62,0,17 +BRDA:690,63,0,9 +BRDA:691,64,0,8 +BRDA:692,65,0,25 +BRDA:694,66,0,25 +BRDA:700,67,0,13 +BRDA:704,68,0,0 +BRDA:713,69,0,0 +BRDA:709,70,0,22 +BRDA:723,71,0,13 +BRDA:733,72,0,0 +BRDA:728,73,0,22 +BRDA:728,74,0,0 +BRDA:731,75,0,22 +BRDA:736,76,0,16 +BRDA:737,77,0,8 +BRDA:739,78,0,25 +BRDA:740,79,0,25 +BRDA:747,80,0,15 +BRDA:748,81,0,30 +BRDA:752,82,0,47 +BRDA:753,83,0,1 +BRDA:754,84,0,46 +BRDA:755,85,0,111 +BRDA:757,86,0,111 +BRDA:763,87,0,2 +BRDA:771,88,0,10 +BRDA:780,89,0,8 +BRDA:781,90,0,2 +BRDA:784,91,0,0 +BRDA:784,92,0,0 +BRDA:790,93,0,0 +BRDA:790,94,0,0 +BRDA:807,95,0,2 +BRDA:815,96,0,2 +BRDA:825,97,0,2 +BRDA:832,98,0,8 +BRDA:834,99,0,40 +BRDA:839,100,0,64 +BRDA:843,101,0,2 +BRDA:846,102,0,8 +BRDA:847,103,0,8 +BRDA:850,104,0,8 +BRDA:868,105,0,2 +BRDA:872,106,0,8 +BRDA:878,107,0,2 +BRDA:882,108,0,8 +BRDA:884,109,0,8 +BRDA:892,110,0,2 +BRDA:893,111,0,8 +BRDA:1113,112,0,1 +BRDA:1118,113,0,2 +BRDA:1119,114,0,2 +BRDA:1124,115,0,1 +BRDA:1125,116,0,0 +BRDA:1139,117,0,0 +BRDA:1128,118,0,2 +BRDA:1129,119,0,2 +BRDA:1130,120,0,2 +BRDA:1131,121,0,2 +BRDA:1132,122,0,2 +BRF:123 +BRH:101 +end_of_record +TN: +SF:src/forecasting/entities/forecast-data.entity.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,2 +DA:11,2 +DA:12,2 +DA:13,2 +DA:14,2 +DA:15,2 +DA:16,2 +DA:17,2 +DA:18,2 +DA:19,2 +DA:20,1 +DA:21,2 +DA:22,2 +DA:23,2 +DA:24,2 +DA:25,2 +DA:26,2 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +LF:76 +LH:76 +BRDA:10,0,0,2 +BRDA:21,1,0,2 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/forecasting/integrations/weather-data.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +LF:402 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/forecasting/models/time-series.service.ts +FN:31,TimeSeriesService +FN:34,arimaForecast +FN:62,exponentialSmoothingForecast +FN:97,lstmForecast +FN:128,prophetForecast +FN:159,evaluateModel +FN:190,runModel +FN:209,optimizeARIMAParams +FN:220,fitARIMA +FN:239,optimizeExponentialSmoothingParams +FN:249,fitExponentialSmoothing +FN:265,fitLSTM +FN:280,fitProphet +FN:298,calculateTrend +FN:310,getHorizonPeriods +FN:333,calculateAccuracy +FN:341,calculateMetrics +FN:368,preprocessData +FN:384,outlierDetection +FN:396,percentile +FN:406,ensureSufficientData +FNF:21 +FNH:21 +FNDA:17,TimeSeriesService +FNDA:4,arimaForecast +FNDA:1,exponentialSmoothingForecast +FNDA:1,lstmForecast +FNDA:1,prophetForecast +FNDA:2,evaluateModel +FNDA:2,runModel +FNDA:3,optimizeARIMAParams +FNDA:3,fitARIMA +FNDA:1,optimizeExponentialSmoothingParams +FNDA:1,fitExponentialSmoothing +FNDA:1,fitLSTM +FNDA:1,fitProphet +FNDA:8,calculateTrend +FNDA:11,getHorizonPeriods +FNDA:6,calculateAccuracy +FNDA:1,calculateMetrics +FNDA:2,preprocessData +FNDA:6,outlierDetection +FNDA:16,percentile +FNDA:9,ensureSufficientData +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,17 +DA:33,17 +DA:34,17 +DA:35,4 +DA:36,4 +DA:37,4 +DA:38,4 +DA:39,4 +DA:40,4 +DA:41,4 +DA:42,4 +DA:43,4 +DA:44,4 +DA:45,4 +DA:46,4 +DA:47,4 +DA:48,4 +DA:49,4 +DA:50,4 +DA:51,4 +DA:52,4 +DA:53,4 +DA:54,4 +DA:55,4 +DA:56,4 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,4 +DA:61,17 +DA:62,17 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,1 +DA:96,17 +DA:97,17 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,1 +DA:127,17 +DA:128,17 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,1 +DA:158,17 +DA:159,17 +DA:160,2 +DA:161,2 +DA:162,2 +DA:163,2 +DA:164,2 +DA:165,2 +DA:166,2 +DA:167,2 +DA:168,2 +DA:169,2 +DA:170,0 +DA:171,0 +DA:172,1 +DA:173,1 +DA:174,1 +DA:175,1 +DA:176,2 +DA:177,2 +DA:178,2 +DA:179,2 +DA:180,2 +DA:181,2 +DA:182,2 +DA:183,2 +DA:184,2 +DA:185,2 +DA:186,1 +DA:187,1 +DA:188,1 +DA:189,17 +DA:190,17 +DA:191,2 +DA:192,2 +DA:193,2 +DA:194,2 +DA:195,2 +DA:196,2 +DA:197,2 +DA:198,2 +DA:199,0 +DA:200,2 +DA:201,0 +DA:202,2 +DA:203,0 +DA:204,2 +DA:205,0 +DA:206,2 +DA:207,2 +DA:208,17 +DA:209,17 +DA:210,3 +DA:211,3 +DA:212,3 +DA:213,3 +DA:214,3 +DA:215,3 +DA:216,3 +DA:217,3 +DA:218,3 +DA:219,17 +DA:220,17 +DA:221,3 +DA:222,3 +DA:223,3 +DA:224,3 +DA:225,3 +DA:226,3 +DA:227,3 +DA:228,3 +DA:229,3 +DA:230,3 +DA:231,3 +DA:232,3 +DA:233,3 +DA:234,3 +DA:235,3 +DA:236,3 +DA:237,3 +DA:238,17 +DA:239,17 +DA:240,1 +DA:241,1 +DA:242,1 +DA:243,1 +DA:244,1 +DA:245,1 +DA:246,1 +DA:247,1 +DA:248,17 +DA:249,17 +DA:250,1 +DA:251,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:255,1 +DA:256,1 +DA:257,1 +DA:258,1 +DA:259,1 +DA:260,1 +DA:261,1 +DA:262,1 +DA:263,1 +DA:264,17 +DA:265,17 +DA:266,1 +DA:267,1 +DA:268,1 +DA:269,1 +DA:270,1 +DA:271,1 +DA:272,1 +DA:273,1 +DA:274,1 +DA:275,1 +DA:276,1 +DA:277,1 +DA:278,1 +DA:279,17 +DA:280,17 +DA:281,1 +DA:282,1 +DA:283,1 +DA:284,1 +DA:285,1 +DA:286,1 +DA:287,1 +DA:288,1 +DA:289,1 +DA:290,1 +DA:291,1 +DA:292,1 +DA:293,1 +DA:294,1 +DA:295,1 +DA:296,1 +DA:297,17 +DA:298,17 +DA:299,8 +DA:300,7 +DA:301,7 +DA:302,7 +DA:303,7 +DA:304,7 +DA:305,7 +DA:306,7 +DA:307,7 +DA:308,7 +DA:309,17 +DA:310,17 +DA:311,11 +DA:312,11 +DA:313,7 +DA:314,11 +DA:315,1 +DA:316,11 +DA:317,1 +DA:318,11 +DA:319,1 +DA:320,11 +DA:321,0 +DA:322,11 +DA:323,0 +DA:324,11 +DA:325,0 +DA:326,11 +DA:327,1 +DA:328,11 +DA:329,0 +DA:330,11 +DA:331,11 +DA:332,17 +DA:333,17 +DA:334,6 +DA:335,6 +DA:336,6 +DA:337,6 +DA:338,6 +DA:339,6 +DA:340,17 +DA:341,17 +DA:342,1 +DA:343,1 +DA:344,1 +DA:345,1 +DA:346,1 +DA:347,1 +DA:348,1 +DA:349,1 +DA:350,1 +DA:351,1 +DA:352,1 +DA:353,1 +DA:354,1 +DA:355,1 +DA:356,1 +DA:357,1 +DA:358,1 +DA:359,1 +DA:360,1 +DA:361,1 +DA:362,1 +DA:363,1 +DA:364,1 +DA:365,1 +DA:366,1 +DA:367,17 +DA:368,17 +DA:369,2 +DA:370,2 +DA:371,2 +DA:372,2 +DA:373,2 +DA:374,2 +DA:375,2 +DA:376,4 +DA:377,4 +DA:378,4 +DA:379,4 +DA:380,4 +DA:381,2 +DA:382,2 +DA:383,17 +DA:384,17 +DA:385,6 +DA:386,6 +DA:387,6 +DA:388,6 +DA:389,6 +DA:390,6 +DA:391,6 +DA:392,6 +DA:393,5 +DA:394,5 +DA:395,17 +DA:396,17 +DA:397,16 +DA:398,16 +DA:399,16 +DA:400,16 +DA:401,16 +DA:402,16 +DA:403,16 +DA:404,16 +DA:405,17 +DA:406,17 +DA:407,9 +DA:408,9 +DA:409,9 +DA:410,9 +DA:411,9 +DA:412,2 +DA:413,2 +DA:414,2 +DA:415,2 +DA:416,9 +DA:417,17 +LF:417 +LH:398 +BRDA:31,0,0,17 +BRDA:34,1,0,4 +BRDA:56,2,0,1 +BRDA:62,3,0,1 +BRDA:91,4,0,0 +BRDA:97,5,0,1 +BRDA:122,6,0,0 +BRDA:128,7,0,1 +BRDA:153,8,0,0 +BRDA:159,9,0,2 +BRDA:169,10,0,0 +BRDA:172,11,0,1 +BRDA:186,12,0,1 +BRDA:190,13,0,2 +BRDA:198,14,0,0 +BRDA:200,15,0,0 +BRDA:202,16,0,0 +BRDA:204,17,0,0 +BRDA:209,18,0,3 +BRDA:220,19,0,3 +BRDA:239,20,0,1 +BRDA:249,21,0,1 +BRDA:265,22,0,1 +BRDA:280,23,0,1 +BRDA:298,24,0,8 +BRDA:299,25,0,1 +BRDA:300,26,0,7 +BRDA:310,27,0,11 +BRDA:312,28,0,7 +BRDA:314,29,0,1 +BRDA:316,30,0,1 +BRDA:318,31,0,1 +BRDA:320,32,0,0 +BRDA:322,33,0,0 +BRDA:324,34,0,0 +BRDA:326,35,0,1 +BRDA:328,36,0,0 +BRDA:333,37,0,6 +BRDA:341,38,0,1 +BRDA:363,39,0,0 +BRDA:346,40,0,2 +BRDA:348,41,0,2 +BRDA:350,42,0,2 +BRDA:354,43,0,2 +BRDA:360,44,0,2 +BRDA:361,45,0,2 +BRDA:362,46,0,2 +BRDA:368,47,0,2 +BRDA:372,48,0,5 +BRDA:372,49,0,4 +BRDA:372,50,0,4 +BRDA:374,51,0,5 +BRDA:375,52,0,4 +BRDA:379,53,0,20 +BRDA:384,54,0,6 +BRDA:391,55,0,0 +BRDA:392,56,0,1 +BRDA:393,57,0,5 +BRDA:396,58,0,16 +BRDA:397,59,0,135 +BRDA:406,60,0,9 +BRDA:411,61,0,2 +BRF:62 +BRH:48 +end_of_record +TN: +SF:src/forecasting/prediction/trend-prediction.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:765,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:769,0 +DA:770,0 +DA:771,0 +DA:772,0 +DA:773,0 +DA:774,0 +DA:775,0 +DA:776,0 +DA:777,0 +DA:778,0 +DA:779,0 +DA:780,0 +DA:781,0 +DA:782,0 +DA:783,0 +DA:784,0 +DA:785,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:795,0 +DA:796,0 +DA:797,0 +DA:798,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:803,0 +DA:804,0 +DA:805,0 +DA:806,0 +DA:807,0 +DA:808,0 +DA:809,0 +DA:810,0 +DA:811,0 +DA:812,0 +DA:813,0 +DA:814,0 +DA:815,0 +DA:816,0 +DA:817,0 +DA:818,0 +DA:819,0 +DA:820,0 +DA:821,0 +DA:822,0 +DA:823,0 +DA:824,0 +DA:825,0 +DA:826,0 +DA:827,0 +DA:828,0 +DA:829,0 +DA:830,0 +DA:831,0 +DA:832,0 +DA:833,0 +DA:834,0 +DA:835,0 +DA:836,0 +DA:837,0 +DA:838,0 +DA:839,0 +DA:840,0 +DA:841,0 +DA:842,0 +DA:843,0 +DA:844,0 +DA:845,0 +DA:846,0 +DA:847,0 +DA:848,0 +DA:849,0 +DA:850,0 +DA:851,0 +DA:852,0 +DA:853,0 +DA:854,0 +DA:855,0 +DA:856,0 +DA:857,0 +DA:858,0 +DA:859,0 +DA:860,0 +DA:861,0 +DA:862,0 +DA:863,0 +DA:864,0 +DA:865,0 +DA:866,0 +DA:867,0 +DA:868,0 +DA:869,0 +DA:870,0 +DA:871,0 +DA:872,0 +DA:873,0 +DA:874,0 +DA:875,0 +DA:876,0 +DA:877,0 +DA:878,0 +DA:879,0 +DA:880,0 +DA:881,0 +DA:882,0 +DA:883,0 +DA:884,0 +DA:885,0 +DA:886,0 +DA:887,0 +DA:888,0 +DA:889,0 +DA:890,0 +DA:891,0 +DA:892,0 +DA:893,0 +DA:894,0 +DA:895,0 +DA:896,0 +DA:897,0 +DA:898,0 +DA:899,0 +DA:900,0 +DA:901,0 +DA:902,0 +DA:903,0 +DA:904,0 +DA:905,0 +DA:906,0 +DA:907,0 +DA:908,0 +DA:909,0 +DA:910,0 +DA:911,0 +DA:912,0 +DA:913,0 +DA:914,0 +DA:915,0 +DA:916,0 +DA:917,0 +DA:918,0 +DA:919,0 +DA:920,0 +DA:921,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:925,0 +DA:926,0 +DA:927,0 +DA:928,0 +DA:929,0 +DA:930,0 +DA:931,0 +DA:932,0 +DA:933,0 +DA:934,0 +DA:935,0 +DA:936,0 +DA:937,0 +DA:938,0 +DA:939,0 +DA:940,0 +DA:941,0 +DA:942,0 +DA:943,0 +DA:944,0 +DA:945,0 +DA:946,0 +DA:947,0 +DA:948,0 +DA:949,0 +DA:950,0 +DA:951,0 +DA:952,0 +DA:953,0 +DA:954,0 +DA:955,0 +DA:956,0 +DA:957,0 +DA:958,0 +DA:959,0 +DA:960,0 +DA:961,0 +LF:961 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/fraud/fraud-detection.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +LF:267 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/fraud/fraud-detection.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/fraud/dto/fraud-alert.dto.ts +FN:24,get +FN:24,get +FN:24,get +FNF:3 +FNH:2 +FNDA:44,get +FNDA:125,get +FNDA:0,get +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:154,1 +DA:155,1 +DA:156,1 +DA:157,1 +DA:158,1 +DA:159,1 +DA:160,1 +DA:161,1 +DA:162,1 +DA:163,1 +DA:164,1 +DA:165,1 +DA:166,1 +DA:167,1 +DA:168,1 +DA:169,1 +DA:170,1 +DA:171,1 +DA:172,1 +DA:173,1 +DA:174,1 +DA:175,1 +DA:176,1 +DA:177,1 +DA:178,1 +DA:179,1 +DA:180,1 +DA:181,1 +DA:182,1 +DA:183,1 +DA:184,1 +DA:185,1 +DA:186,1 +DA:187,1 +DA:188,1 +DA:189,1 +DA:190,1 +DA:191,1 +DA:192,1 +DA:193,1 +DA:194,1 +DA:195,1 +DA:196,1 +DA:197,1 +DA:198,1 +DA:199,1 +DA:200,1 +DA:201,1 +DA:202,1 +DA:203,1 +DA:204,1 +DA:205,1 +DA:206,1 +DA:207,1 +DA:208,1 +DA:209,1 +DA:210,1 +DA:211,1 +DA:212,1 +DA:213,1 +DA:214,1 +DA:215,1 +DA:216,1 +DA:217,1 +DA:218,1 +DA:219,1 +DA:220,1 +DA:221,1 +DA:222,1 +DA:223,1 +DA:224,1 +DA:225,1 +DA:226,1 +DA:227,1 +DA:228,1 +DA:229,1 +DA:230,1 +DA:231,1 +DA:232,1 +DA:233,1 +DA:234,1 +DA:235,1 +DA:236,1 +DA:237,1 +DA:238,1 +DA:239,1 +DA:240,1 +DA:241,1 +DA:242,1 +DA:243,1 +DA:244,1 +DA:245,1 +DA:246,1 +DA:247,1 +DA:248,1 +DA:249,1 +DA:250,1 +DA:251,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:255,1 +DA:256,1 +DA:257,1 +DA:258,1 +DA:259,1 +DA:260,1 +DA:261,1 +DA:262,1 +DA:263,1 +DA:264,1 +DA:265,1 +DA:266,1 +DA:267,1 +DA:268,1 +LF:268 +LH:268 +BRDA:24,0,0,44 +BRDA:24,1,0,125 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/fraud/entities/fraud-case.entity.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,5 +DA:11,5 +DA:12,5 +DA:13,5 +DA:14,5 +DA:15,5 +DA:16,5 +DA:17,5 +DA:18,5 +DA:19,5 +DA:20,5 +DA:21,5 +DA:22,5 +DA:23,5 +DA:24,5 +DA:25,5 +DA:26,5 +DA:27,5 +DA:28,1 +DA:29,5 +DA:30,5 +DA:31,5 +DA:32,5 +DA:33,5 +DA:34,5 +DA:35,1 +DA:36,5 +DA:37,5 +DA:38,5 +DA:39,5 +DA:40,5 +DA:41,5 +DA:42,5 +DA:43,5 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:154,1 +DA:155,1 +DA:156,1 +DA:157,1 +DA:158,1 +DA:159,1 +DA:160,1 +DA:161,1 +DA:162,1 +DA:163,1 +DA:164,1 +DA:165,1 +DA:166,1 +DA:167,1 +DA:168,1 +DA:169,1 +DA:170,1 +DA:171,1 +LF:171 +LH:171 +BRDA:10,0,0,5 +BRDA:29,1,0,5 +BRDA:36,2,0,5 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/fraud/ml/fraud-ml.service.ts +FN:63,FraudMlService +FN:72,analyzeTrade +FN:118,extractFeatures +FN:140,computeVolumeAnomaly +FN:154,computeFrequencyAnomaly +FN:165,computePriceImpact +FN:174,computeOrderToTradeRatio +FN:179,computeRoundTripScore +FN:192,computeVelocityScore +FN:201,computeCounterpartyConcentration +FN:207,computeTimePatternAnomaly +FN:216,computeMarketImpact +FN:231,computeAnomalyScore +FN:256,scoreToSeverity +FN:263,getTopContributors +FN:272,buildEvidence +FN:335,getOrCreateBaseline +FN:362,updateBaseline +FN:383,recordFeedback +FN:393,getModelMetrics +FNF:20 +FNH:20 +FNDA:13,FraudMlService +FNDA:125,analyzeTrade +FNDA:125,extractFeatures +FNDA:125,computeVolumeAnomaly +FNDA:125,computeFrequencyAnomaly +FNDA:125,computePriceImpact +FNDA:125,computeOrderToTradeRatio +FNDA:125,computeRoundTripScore +FNDA:125,computeVelocityScore +FNDA:125,computeCounterpartyConcentration +FNDA:125,computeTimePatternAnomaly +FNDA:125,computeMarketImpact +FNDA:125,computeAnomalyScore +FNDA:125,scoreToSeverity +FNDA:125,getTopContributors +FNDA:125,buildEvidence +FNDA:125,getOrCreateBaseline +FNDA:125,updateBaseline +FNDA:2,recordFeedback +FNDA:1,getModelMetrics +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,13 +DA:65,13 +DA:66,13 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,125 +DA:74,125 +DA:75,125 +DA:76,125 +DA:77,125 +DA:78,125 +DA:79,125 +DA:80,125 +DA:81,125 +DA:82,125 +DA:83,125 +DA:84,125 +DA:85,125 +DA:86,125 +DA:87,125 +DA:88,125 +DA:89,125 +DA:90,125 +DA:91,125 +DA:92,125 +DA:93,125 +DA:94,125 +DA:95,125 +DA:96,125 +DA:97,125 +DA:98,125 +DA:99,125 +DA:100,125 +DA:101,125 +DA:102,125 +DA:103,0 +DA:104,0 +DA:105,125 +DA:106,125 +DA:107,125 +DA:108,125 +DA:109,125 +DA:110,125 +DA:111,125 +DA:112,125 +DA:113,125 +DA:114,125 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,125 +DA:120,125 +DA:121,125 +DA:122,125 +DA:123,125 +DA:124,125 +DA:125,125 +DA:126,125 +DA:127,125 +DA:128,125 +DA:129,125 +DA:130,125 +DA:131,125 +DA:132,125 +DA:133,125 +DA:134,125 +DA:135,125 +DA:136,125 +DA:137,125 +DA:138,125 +DA:139,1 +DA:140,1 +DA:141,125 +DA:142,125 +DA:143,125 +DA:144,125 +DA:145,125 +DA:146,9 +DA:147,9 +DA:148,9 +DA:149,9 +DA:150,9 +DA:151,9 +DA:152,9 +DA:153,1 +DA:154,1 +DA:155,125 +DA:156,9 +DA:157,9 +DA:158,125 +DA:159,125 +DA:160,125 +DA:161,125 +DA:162,9 +DA:163,9 +DA:164,1 +DA:165,1 +DA:166,125 +DA:167,125 +DA:168,125 +DA:169,125 +DA:170,125 +DA:171,123 +DA:172,123 +DA:173,1 +DA:174,1 +DA:175,125 +DA:176,125 +DA:177,125 +DA:178,1 +DA:179,1 +DA:180,125 +DA:181,125 +DA:182,125 +DA:183,125 +DA:184,1 +DA:185,125 +DA:186,1 +DA:187,1 +DA:188,124 +DA:189,124 +DA:190,124 +DA:191,1 +DA:192,1 +DA:193,125 +DA:194,125 +DA:195,125 +DA:196,125 +DA:197,125 +DA:198,125 +DA:199,125 +DA:200,1 +DA:201,1 +DA:202,125 +DA:203,125 +DA:204,125 +DA:205,125 +DA:206,1 +DA:207,1 +DA:208,125 +DA:209,125 +DA:210,0 +DA:211,0 +DA:212,125 +DA:213,0 +DA:214,0 +DA:215,1 +DA:216,1 +DA:217,125 +DA:218,125 +DA:219,125 +DA:220,125 +DA:221,125 +DA:222,125 +DA:223,125 +DA:224,1 +DA:225,1 +DA:226,1 +DA:227,1 +DA:228,1 +DA:229,1 +DA:230,1 +DA:231,1 +DA:232,125 +DA:233,125 +DA:234,125 +DA:235,125 +DA:236,125 +DA:237,125 +DA:238,125 +DA:239,125 +DA:240,125 +DA:241,125 +DA:242,125 +DA:243,125 +DA:244,125 +DA:245,125 +DA:246,125 +DA:247,1250 +DA:248,1250 +DA:249,125 +DA:250,125 +DA:251,125 +DA:252,125 +DA:253,125 +DA:254,125 +DA:255,1 +DA:256,1 +DA:257,125 +DA:258,125 +DA:259,125 +DA:260,125 +DA:261,125 +DA:262,1 +DA:263,1 +DA:264,125 +DA:265,125 +DA:266,125 +DA:267,125 +DA:268,125 +DA:269,1 +DA:270,1 +DA:271,1 +DA:272,1 +DA:273,125 +DA:274,125 +DA:275,125 +DA:276,125 +DA:277,125 +DA:278,125 +DA:279,125 +DA:280,125 +DA:281,1 +DA:282,1 +DA:283,1 +DA:284,1 +DA:285,1 +DA:286,1 +DA:287,1 +DA:288,1 +DA:289,125 +DA:290,125 +DA:291,2 +DA:292,2 +DA:293,2 +DA:294,2 +DA:295,2 +DA:296,2 +DA:297,2 +DA:298,2 +DA:299,2 +DA:300,2 +DA:301,125 +DA:302,125 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,125 +DA:312,125 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,125 +DA:321,125 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,125 +DA:330,125 +DA:331,125 +DA:332,1 +DA:333,1 +DA:334,1 +DA:335,1 +DA:336,125 +DA:337,17 +DA:338,17 +DA:339,108 +DA:340,108 +DA:341,108 +DA:342,108 +DA:343,108 +DA:344,108 +DA:345,108 +DA:346,108 +DA:347,108 +DA:348,108 +DA:349,125 +DA:350,125 +DA:351,125 +DA:352,125 +DA:353,125 +DA:354,125 +DA:355,125 +DA:356,125 +DA:357,125 +DA:358,125 +DA:359,125 +DA:360,1 +DA:361,1 +DA:362,1 +DA:363,125 +DA:364,125 +DA:365,125 +DA:366,125 +DA:367,125 +DA:368,125 +DA:369,125 +DA:370,125 +DA:371,125 +DA:372,125 +DA:373,125 +DA:374,125 +DA:375,125 +DA:376,125 +DA:377,125 +DA:378,125 +DA:379,1 +DA:380,1 +DA:381,1 +DA:382,1 +DA:383,1 +DA:384,2 +DA:385,1 +DA:386,1 +DA:387,1 +DA:388,1 +DA:389,1 +DA:390,1 +DA:391,2 +DA:392,1 +DA:393,1 +DA:394,1 +DA:395,1 +DA:396,1 +DA:397,1 +DA:398,1 +DA:399,1 +DA:400,1 +DA:401,1 +DA:402,1 +DA:403,1 +DA:404,1 +LF:404 +LH:376 +BRDA:63,0,0,13 +BRDA:72,1,0,125 +BRDA:102,2,0,0 +BRDA:118,3,0,125 +BRDA:136,4,0,0 +BRDA:140,5,0,125 +BRDA:144,6,0,116 +BRDA:145,7,0,9 +BRDA:145,8,0,0 +BRDA:146,9,0,9 +BRDA:154,10,0,125 +BRDA:155,11,0,116 +BRDA:156,12,0,9 +BRDA:158,13,0,0 +BRDA:159,14,0,9 +BRDA:159,15,0,0 +BRDA:160,16,0,9 +BRDA:160,17,0,0 +BRDA:161,18,0,9 +BRDA:161,19,0,0 +BRDA:162,20,0,9 +BRDA:165,21,0,125 +BRDA:168,22,0,0 +BRDA:169,23,0,0 +BRDA:170,24,0,2 +BRDA:171,25,0,123 +BRDA:174,26,0,125 +BRDA:179,27,0,125 +BRDA:183,28,0,1 +BRDA:185,29,0,1 +BRDA:188,30,0,124 +BRDA:192,31,0,125 +BRDA:201,32,0,125 +BRDA:204,33,0,1 +BRDA:204,34,0,124 +BRDA:207,35,0,125 +BRDA:210,36,0,0 +BRDA:212,37,0,0 +BRDA:212,38,0,0 +BRDA:216,39,0,125 +BRDA:231,40,0,125 +BRDA:246,41,0,1250 +BRDA:247,42,0,0 +BRDA:251,43,0,0 +BRDA:256,44,0,125 +BRDA:257,45,0,0 +BRDA:258,46,0,0 +BRDA:259,47,0,0 +BRDA:263,48,0,125 +BRDA:265,49,0,2756 +BRDA:267,50,0,375 +BRDA:272,51,0,125 +BRDA:280,52,0,1 +BRDA:290,53,0,2 +BRDA:302,54,0,0 +BRDA:312,55,0,0 +BRDA:321,56,0,0 +BRDA:335,57,0,125 +BRDA:336,58,0,17 +BRDA:339,59,0,108 +BRDA:349,60,0,0 +BRDA:349,61,0,108 +BRDA:362,62,0,125 +BRDA:383,63,0,2 +BRDA:384,64,0,1 +BRDA:393,65,0,1 +BRDA:395,66,0,0 +BRF:67 +BRH:45 +end_of_record +TN: +SF:src/fraud/monitoring/real-time-monitor.service.ts +FN:46,RealTimeMonitorService +FN:61,analyzeIncomingTrade +FN:135,startTraderMonitoring +FN:154,stopTraderMonitoring +FN:161,startGlobalMonitoring +FN:174,stopGlobalMonitoring +FN:182,getMonitoringStatus +FN:197,processMonitoringCycle +FN:222,generateMonitoringReport +FN:236,hourlyEscalation +FN:255,sweepTrader +FN:280,updateTraderContext +FN:295,enqueuePendingTrade +FN:300,getTraderContext +FN:312,combineScores +FN:331,scoreToSeverity +FN:338,getRecommendedAction +FN:351,generateCaseId +FN:356,createFraudCase +FN:411,onModuleDestroy +FNF:20 +FNH:15 +FNDA:14,RealTimeMonitorService +FNDA:6,analyzeIncomingTrade +FNDA:10,startTraderMonitoring +FNDA:1,stopTraderMonitoring +FNDA:4,startGlobalMonitoring +FNDA:16,stopGlobalMonitoring +FNDA:7,getMonitoringStatus +FNDA:0,processMonitoringCycle +FNDA:0,generateMonitoringReport +FNDA:0,hourlyEscalation +FNDA:0,sweepTrader +FNDA:6,updateTraderContext +FNDA:0,enqueuePendingTrade +FNDA:6,getTraderContext +FNDA:6,combineScores +FNDA:6,scoreToSeverity +FNDA:6,getRecommendedAction +FNDA:1,generateCaseId +FNDA:1,createFraudCase +FNDA:15,onModuleDestroy +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,14 +DA:48,14 +DA:49,14 +DA:50,14 +DA:51,14 +DA:52,14 +DA:53,14 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,6 +DA:63,6 +DA:64,6 +DA:65,6 +DA:66,6 +DA:67,6 +DA:68,6 +DA:69,6 +DA:70,6 +DA:71,6 +DA:72,6 +DA:73,6 +DA:74,6 +DA:75,6 +DA:76,6 +DA:77,6 +DA:78,6 +DA:79,6 +DA:80,6 +DA:81,6 +DA:82,6 +DA:83,6 +DA:84,6 +DA:85,6 +DA:86,6 +DA:87,6 +DA:88,6 +DA:89,6 +DA:90,6 +DA:91,6 +DA:92,6 +DA:93,6 +DA:94,6 +DA:95,6 +DA:96,6 +DA:97,6 +DA:98,6 +DA:99,6 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,6 +DA:111,6 +DA:112,6 +DA:113,6 +DA:114,6 +DA:115,6 +DA:116,6 +DA:117,6 +DA:118,6 +DA:119,6 +DA:120,6 +DA:121,6 +DA:122,6 +DA:123,6 +DA:124,6 +DA:125,6 +DA:126,6 +DA:127,6 +DA:128,0 +DA:129,0 +DA:130,6 +DA:131,6 +DA:132,6 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,10 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,9 +DA:141,9 +DA:142,9 +DA:143,9 +DA:144,9 +DA:145,9 +DA:146,9 +DA:147,9 +DA:148,9 +DA:149,9 +DA:150,9 +DA:151,9 +DA:152,1 +DA:153,1 +DA:154,1 +DA:155,1 +DA:156,1 +DA:157,1 +DA:158,1 +DA:159,1 +DA:160,1 +DA:161,1 +DA:162,4 +DA:163,3 +DA:164,3 +DA:165,0 +DA:166,3 +DA:167,3 +DA:168,3 +DA:169,3 +DA:170,3 +DA:171,3 +DA:172,1 +DA:173,1 +DA:174,1 +DA:175,16 +DA:176,3 +DA:177,3 +DA:178,3 +DA:179,3 +DA:180,16 +DA:181,1 +DA:182,1 +DA:183,7 +DA:184,7 +DA:185,7 +DA:186,7 +DA:187,7 +DA:188,7 +DA:189,7 +DA:190,7 +DA:191,7 +DA:192,1 +DA:193,1 +DA:194,1 +DA:195,1 +DA:196,1 +DA:197,1 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,1 +DA:221,1 +DA:222,1 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,1 +DA:235,1 +DA:236,1 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,1 +DA:253,1 +DA:254,1 +DA:255,1 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,1 +DA:279,1 +DA:280,1 +DA:281,6 +DA:282,6 +DA:283,6 +DA:284,6 +DA:285,6 +DA:286,6 +DA:287,6 +DA:288,6 +DA:289,6 +DA:290,0 +DA:291,0 +DA:292,6 +DA:293,1 +DA:294,1 +DA:295,1 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,1 +DA:300,1 +DA:301,6 +DA:302,6 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,6 +DA:310,6 +DA:311,1 +DA:312,1 +DA:313,6 +DA:314,6 +DA:315,6 +DA:316,6 +DA:317,1 +DA:318,1 +DA:319,1 +DA:320,1 +DA:321,1 +DA:322,1 +DA:323,1 +DA:324,1 +DA:325,1 +DA:326,6 +DA:327,6 +DA:328,6 +DA:329,6 +DA:330,1 +DA:331,1 +DA:332,6 +DA:333,6 +DA:334,6 +DA:335,5 +DA:336,5 +DA:337,1 +DA:338,1 +DA:339,6 +DA:340,1 +DA:341,1 +DA:342,6 +DA:343,0 +DA:344,0 +DA:345,6 +DA:346,0 +DA:347,0 +DA:348,5 +DA:349,5 +DA:350,1 +DA:351,1 +DA:352,1 +DA:353,1 +DA:354,1 +DA:355,1 +DA:356,1 +DA:357,1 +DA:358,1 +DA:359,1 +DA:360,1 +DA:361,1 +DA:362,1 +DA:363,1 +DA:364,1 +DA:365,1 +DA:366,1 +DA:367,1 +DA:368,1 +DA:369,1 +DA:370,1 +DA:371,1 +DA:372,1 +DA:373,1 +DA:374,1 +DA:375,1 +DA:376,1 +DA:377,1 +DA:378,1 +DA:379,1 +DA:380,1 +DA:381,1 +DA:382,1 +DA:383,1 +DA:384,1 +DA:385,1 +DA:386,1 +DA:387,1 +DA:388,1 +DA:389,1 +DA:390,1 +DA:391,1 +DA:392,1 +DA:393,1 +DA:394,1 +DA:395,1 +DA:396,1 +DA:397,1 +DA:398,1 +DA:399,1 +DA:400,1 +DA:401,1 +DA:402,1 +DA:403,1 +DA:404,1 +DA:405,1 +DA:406,1 +DA:407,1 +DA:408,1 +DA:409,1 +DA:410,1 +DA:411,1 +DA:412,15 +DA:413,15 +DA:414,15 +DA:415,1 +LF:415 +LH:327 +BRDA:46,0,0,14 +BRDA:61,1,0,6 +BRDA:99,2,0,1 +BRDA:127,3,0,0 +BRDA:80,4,0,6 +BRDA:83,5,0,1 +BRDA:135,6,0,10 +BRDA:136,7,0,1 +BRDA:140,8,0,9 +BRDA:154,9,0,1 +BRDA:161,10,0,4 +BRDA:162,11,0,1 +BRDA:163,12,0,3 +BRDA:174,13,0,16 +BRDA:175,14,0,3 +BRDA:182,15,0,7 +BRDA:280,16,0,6 +BRDA:289,17,0,0 +BRDA:300,18,0,6 +BRDA:302,19,0,0 +BRDA:312,20,0,6 +BRDA:316,21,0,5 +BRDA:317,22,0,1 +BRDA:326,23,0,1 +BRDA:326,24,0,0 +BRDA:319,25,0,1 +BRDA:331,26,0,6 +BRDA:332,27,0,1 +BRDA:333,28,0,5 +BRDA:333,29,0,0 +BRDA:334,30,0,5 +BRDA:334,31,0,0 +BRDA:335,32,0,5 +BRDA:338,33,0,6 +BRDA:339,34,0,5 +BRDA:339,35,0,1 +BRDA:342,36,0,5 +BRDA:342,37,0,0 +BRDA:345,38,0,5 +BRDA:345,39,0,0 +BRDA:348,40,0,5 +BRDA:351,41,0,1 +BRDA:356,42,0,1 +BRDA:371,43,0,0 +BRDA:375,44,0,0 +BRDA:391,45,0,0 +BRDA:376,46,0,1 +BRDA:411,47,0,15 +BRF:48 +BRH:37 +end_of_record +TN: +SF:src/fraud/patterns/pattern-recognition.service.ts +FN:29,PatternRecognitionService +FN:40,analyzePatterns +FN:64,getMatchedPatterns +FN:72,getAllPatternDefinitions +FN:83,registerPatterns +FN:91,detector +FN:105,detector +FN:131,detector +FN:150,detector +FN:169,detector +FN:195,detector +FN:215,detector +FN:233,detector +FN:255,detector +FN:275,detector +FN:296,detector +FN:323,detector +FN:345,detector +FN:366,detector +FN:386,detector +FN:408,detector +FN:430,detector +FN:452,detector +FN:475,detector +FN:496,detector +FN:519,detector +FN:538,detector +FN:559,detector +FN:579,detector +FN:600,detector +FN:621,detector +FN:648,detector +FN:668,detector +FN:694,detector +FN:715,detector +FN:734,detector +FN:754,detector +FN:775,detector +FN:801,detector +FN:822,detector +FN:843,detector +FN:865,detector +FN:883,detector +FN:905,detector +FN:928,inferFraudTypes +FNF:45 +FNH:45 +FNDA:22,PatternRecognitionService +FNDA:14,analyzePatterns +FNDA:1,getMatchedPatterns +FNDA:3,getAllPatternDefinitions +FNDA:22,registerPatterns +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:14,detector +FNDA:4,inferFraudTypes +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,22 +DA:31,22 +DA:32,22 +DA:33,22 +DA:34,22 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,14 +DA:42,14 +DA:43,14 +DA:44,14 +DA:45,546 +DA:46,546 +DA:47,546 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,14 +DA:59,14 +DA:60,14 +DA:61,14 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,3 +DA:74,117 +DA:75,117 +DA:76,117 +DA:77,117 +DA:78,3 +DA:79,3 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,22 +DA:85,22 +DA:86,22 +DA:87,22 +DA:88,22 +DA:89,22 +DA:90,22 +DA:91,22 +DA:92,14 +DA:93,14 +DA:94,14 +DA:95,14 +DA:96,14 +DA:97,14 +DA:98,22 +DA:99,22 +DA:100,22 +DA:101,22 +DA:102,22 +DA:103,22 +DA:104,22 +DA:105,22 +DA:106,14 +DA:107,14 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,14 +DA:112,14 +DA:113,14 +DA:114,14 +DA:115,14 +DA:116,14 +DA:117,14 +DA:118,14 +DA:119,14 +DA:120,14 +DA:121,14 +DA:122,14 +DA:123,14 +DA:124,22 +DA:125,22 +DA:126,22 +DA:127,22 +DA:128,22 +DA:129,22 +DA:130,22 +DA:131,22 +DA:132,14 +DA:133,14 +DA:134,14 +DA:135,14 +DA:136,14 +DA:137,14 +DA:138,14 +DA:139,14 +DA:140,14 +DA:141,14 +DA:142,22 +DA:143,22 +DA:144,22 +DA:145,22 +DA:146,22 +DA:147,22 +DA:148,22 +DA:149,22 +DA:150,22 +DA:151,14 +DA:152,14 +DA:153,14 +DA:154,14 +DA:155,14 +DA:156,14 +DA:157,14 +DA:158,14 +DA:159,14 +DA:160,14 +DA:161,22 +DA:162,22 +DA:163,22 +DA:164,22 +DA:165,22 +DA:166,22 +DA:167,22 +DA:168,22 +DA:169,22 +DA:170,14 +DA:171,14 +DA:172,14 +DA:173,14 +DA:174,14 +DA:175,14 +DA:176,14 +DA:177,14 +DA:178,14 +DA:179,14 +DA:180,14 +DA:181,14 +DA:182,14 +DA:183,14 +DA:184,14 +DA:185,22 +DA:186,22 +DA:187,22 +DA:188,22 +DA:189,22 +DA:190,22 +DA:191,22 +DA:192,22 +DA:193,22 +DA:194,22 +DA:195,22 +DA:196,14 +DA:197,14 +DA:198,14 +DA:199,14 +DA:200,14 +DA:201,14 +DA:202,14 +DA:203,14 +DA:204,14 +DA:205,14 +DA:206,14 +DA:207,22 +DA:208,22 +DA:209,22 +DA:210,22 +DA:211,22 +DA:212,22 +DA:213,22 +DA:214,22 +DA:215,22 +DA:216,14 +DA:217,14 +DA:218,14 +DA:219,14 +DA:220,14 +DA:221,14 +DA:222,14 +DA:223,14 +DA:224,14 +DA:225,14 +DA:226,22 +DA:227,22 +DA:228,22 +DA:229,22 +DA:230,22 +DA:231,22 +DA:232,22 +DA:233,22 +DA:234,14 +DA:235,14 +DA:236,14 +DA:237,14 +DA:238,14 +DA:239,14 +DA:240,14 +DA:241,14 +DA:242,14 +DA:243,14 +DA:244,14 +DA:245,14 +DA:246,14 +DA:247,22 +DA:248,22 +DA:249,22 +DA:250,22 +DA:251,22 +DA:252,22 +DA:253,22 +DA:254,22 +DA:255,22 +DA:256,14 +DA:257,14 +DA:258,14 +DA:259,14 +DA:260,14 +DA:261,14 +DA:262,14 +DA:263,14 +DA:264,14 +DA:265,14 +DA:266,14 +DA:267,14 +DA:268,22 +DA:269,22 +DA:270,22 +DA:271,22 +DA:272,22 +DA:273,22 +DA:274,22 +DA:275,22 +DA:276,14 +DA:277,14 +DA:278,14 +DA:279,14 +DA:280,14 +DA:281,14 +DA:282,14 +DA:283,14 +DA:284,14 +DA:285,14 +DA:286,22 +DA:287,22 +DA:288,22 +DA:289,22 +DA:290,22 +DA:291,22 +DA:292,22 +DA:293,22 +DA:294,22 +DA:295,22 +DA:296,22 +DA:297,14 +DA:298,14 +DA:299,14 +DA:300,1 +DA:301,1 +DA:302,14 +DA:303,14 +DA:304,14 +DA:305,14 +DA:306,14 +DA:307,14 +DA:308,14 +DA:309,14 +DA:310,14 +DA:311,14 +DA:312,14 +DA:313,14 +DA:314,14 +DA:315,22 +DA:316,22 +DA:317,22 +DA:318,22 +DA:319,22 +DA:320,22 +DA:321,22 +DA:322,22 +DA:323,22 +DA:324,14 +DA:325,14 +DA:326,14 +DA:327,14 +DA:328,14 +DA:329,14 +DA:330,14 +DA:331,14 +DA:332,14 +DA:333,14 +DA:334,14 +DA:335,14 +DA:336,14 +DA:337,22 +DA:338,22 +DA:339,22 +DA:340,22 +DA:341,22 +DA:342,22 +DA:343,22 +DA:344,22 +DA:345,22 +DA:346,14 +DA:347,14 +DA:348,14 +DA:349,14 +DA:350,14 +DA:351,14 +DA:352,14 +DA:353,14 +DA:354,14 +DA:355,14 +DA:356,22 +DA:357,22 +DA:358,22 +DA:359,22 +DA:360,22 +DA:361,22 +DA:362,22 +DA:363,22 +DA:364,22 +DA:365,22 +DA:366,22 +DA:367,14 +DA:368,14 +DA:369,14 +DA:370,14 +DA:371,14 +DA:372,14 +DA:373,14 +DA:374,14 +DA:375,14 +DA:376,14 +DA:377,14 +DA:378,14 +DA:379,22 +DA:380,22 +DA:381,22 +DA:382,22 +DA:383,22 +DA:384,22 +DA:385,22 +DA:386,22 +DA:387,14 +DA:388,14 +DA:389,14 +DA:390,14 +DA:391,14 +DA:392,14 +DA:393,14 +DA:394,14 +DA:395,14 +DA:396,14 +DA:397,14 +DA:398,14 +DA:399,14 +DA:400,14 +DA:401,22 +DA:402,22 +DA:403,22 +DA:404,22 +DA:405,22 +DA:406,22 +DA:407,22 +DA:408,22 +DA:409,14 +DA:410,14 +DA:411,14 +DA:412,14 +DA:413,14 +DA:414,14 +DA:415,14 +DA:416,14 +DA:417,14 +DA:418,14 +DA:419,14 +DA:420,14 +DA:421,14 +DA:422,14 +DA:423,22 +DA:424,22 +DA:425,22 +DA:426,22 +DA:427,22 +DA:428,22 +DA:429,22 +DA:430,22 +DA:431,14 +DA:432,14 +DA:433,14 +DA:434,14 +DA:435,14 +DA:436,14 +DA:437,14 +DA:438,14 +DA:439,14 +DA:440,14 +DA:441,14 +DA:442,14 +DA:443,14 +DA:444,22 +DA:445,22 +DA:446,22 +DA:447,22 +DA:448,22 +DA:449,22 +DA:450,22 +DA:451,22 +DA:452,22 +DA:453,14 +DA:454,14 +DA:455,14 +DA:456,14 +DA:457,14 +DA:458,14 +DA:459,14 +DA:460,14 +DA:461,14 +DA:462,14 +DA:463,14 +DA:464,14 +DA:465,14 +DA:466,22 +DA:467,22 +DA:468,22 +DA:469,22 +DA:470,22 +DA:471,22 +DA:472,22 +DA:473,22 +DA:474,22 +DA:475,22 +DA:476,14 +DA:477,14 +DA:478,14 +DA:479,14 +DA:480,14 +DA:481,14 +DA:482,14 +DA:483,14 +DA:484,14 +DA:485,14 +DA:486,14 +DA:487,14 +DA:488,22 +DA:489,22 +DA:490,22 +DA:491,22 +DA:492,22 +DA:493,22 +DA:494,22 +DA:495,22 +DA:496,22 +DA:497,14 +DA:498,14 +DA:499,14 +DA:500,14 +DA:501,14 +DA:502,14 +DA:503,14 +DA:504,14 +DA:505,14 +DA:506,14 +DA:507,14 +DA:508,14 +DA:509,22 +DA:510,22 +DA:511,22 +DA:512,22 +DA:513,22 +DA:514,22 +DA:515,22 +DA:516,22 +DA:517,22 +DA:518,22 +DA:519,22 +DA:520,14 +DA:521,14 +DA:522,14 +DA:523,14 +DA:524,14 +DA:525,14 +DA:526,14 +DA:527,14 +DA:528,14 +DA:529,14 +DA:530,14 +DA:531,22 +DA:532,22 +DA:533,22 +DA:534,22 +DA:535,22 +DA:536,22 +DA:537,22 +DA:538,22 +DA:539,14 +DA:540,14 +DA:541,14 +DA:542,14 +DA:543,14 +DA:544,14 +DA:545,14 +DA:546,14 +DA:547,14 +DA:548,14 +DA:549,14 +DA:550,14 +DA:551,22 +DA:552,22 +DA:553,22 +DA:554,22 +DA:555,22 +DA:556,22 +DA:557,22 +DA:558,22 +DA:559,22 +DA:560,14 +DA:561,14 +DA:562,14 +DA:563,14 +DA:564,14 +DA:565,14 +DA:566,14 +DA:567,14 +DA:568,14 +DA:569,22 +DA:570,22 +DA:571,22 +DA:572,22 +DA:573,22 +DA:574,22 +DA:575,22 +DA:576,22 +DA:577,22 +DA:578,22 +DA:579,22 +DA:580,14 +DA:581,14 +DA:582,14 +DA:583,14 +DA:584,14 +DA:585,14 +DA:586,14 +DA:587,14 +DA:588,14 +DA:589,14 +DA:590,14 +DA:591,14 +DA:592,22 +DA:593,22 +DA:594,22 +DA:595,22 +DA:596,22 +DA:597,22 +DA:598,22 +DA:599,22 +DA:600,22 +DA:601,14 +DA:602,14 +DA:603,14 +DA:604,14 +DA:605,14 +DA:606,14 +DA:607,14 +DA:608,14 +DA:609,14 +DA:610,14 +DA:611,14 +DA:612,14 +DA:613,14 +DA:614,22 +DA:615,22 +DA:616,22 +DA:617,22 +DA:618,22 +DA:619,22 +DA:620,22 +DA:621,22 +DA:622,14 +DA:623,14 +DA:624,14 +DA:625,1 +DA:626,1 +DA:627,14 +DA:628,14 +DA:629,14 +DA:630,14 +DA:631,14 +DA:632,14 +DA:633,14 +DA:634,14 +DA:635,14 +DA:636,14 +DA:637,14 +DA:638,22 +DA:639,22 +DA:640,22 +DA:641,22 +DA:642,22 +DA:643,22 +DA:644,22 +DA:645,22 +DA:646,22 +DA:647,22 +DA:648,22 +DA:649,14 +DA:650,14 +DA:651,14 +DA:652,14 +DA:653,14 +DA:654,14 +DA:655,14 +DA:656,14 +DA:657,14 +DA:658,14 +DA:659,14 +DA:660,22 +DA:661,22 +DA:662,22 +DA:663,22 +DA:664,22 +DA:665,22 +DA:666,22 +DA:667,22 +DA:668,22 +DA:669,14 +DA:670,14 +DA:671,14 +DA:672,14 +DA:673,14 +DA:674,14 +DA:675,14 +DA:676,14 +DA:677,14 +DA:678,14 +DA:679,14 +DA:680,14 +DA:681,14 +DA:682,14 +DA:683,14 +DA:684,22 +DA:685,22 +DA:686,22 +DA:687,22 +DA:688,22 +DA:689,22 +DA:690,22 +DA:691,22 +DA:692,22 +DA:693,22 +DA:694,22 +DA:695,14 +DA:696,14 +DA:697,14 +DA:698,14 +DA:699,14 +DA:700,14 +DA:701,14 +DA:702,14 +DA:703,14 +DA:704,14 +DA:705,14 +DA:706,14 +DA:707,14 +DA:708,22 +DA:709,22 +DA:710,22 +DA:711,22 +DA:712,22 +DA:713,22 +DA:714,22 +DA:715,22 +DA:716,14 +DA:717,14 +DA:718,14 +DA:719,14 +DA:720,14 +DA:721,14 +DA:722,14 +DA:723,14 +DA:724,14 +DA:725,14 +DA:726,14 +DA:727,22 +DA:728,22 +DA:729,22 +DA:730,22 +DA:731,22 +DA:732,22 +DA:733,22 +DA:734,22 +DA:735,14 +DA:736,14 +DA:737,14 +DA:738,14 +DA:739,14 +DA:740,14 +DA:741,14 +DA:742,14 +DA:743,14 +DA:744,14 +DA:745,14 +DA:746,14 +DA:747,22 +DA:748,22 +DA:749,22 +DA:750,22 +DA:751,22 +DA:752,22 +DA:753,22 +DA:754,22 +DA:755,14 +DA:756,14 +DA:757,14 +DA:758,14 +DA:759,14 +DA:760,14 +DA:761,14 +DA:762,14 +DA:763,14 +DA:764,14 +DA:765,14 +DA:766,14 +DA:767,22 +DA:768,22 +DA:769,22 +DA:770,22 +DA:771,22 +DA:772,22 +DA:773,22 +DA:774,22 +DA:775,22 +DA:776,14 +DA:777,14 +DA:778,14 +DA:779,14 +DA:780,14 +DA:781,14 +DA:782,14 +DA:783,14 +DA:784,14 +DA:785,14 +DA:786,14 +DA:787,14 +DA:788,14 +DA:789,14 +DA:790,14 +DA:791,22 +DA:792,22 +DA:793,22 +DA:794,22 +DA:795,22 +DA:796,22 +DA:797,22 +DA:798,22 +DA:799,22 +DA:800,22 +DA:801,22 +DA:802,14 +DA:803,14 +DA:804,14 +DA:805,14 +DA:806,14 +DA:807,14 +DA:808,14 +DA:809,14 +DA:810,14 +DA:811,14 +DA:812,14 +DA:813,14 +DA:814,22 +DA:815,22 +DA:816,22 +DA:817,22 +DA:818,22 +DA:819,22 +DA:820,22 +DA:821,22 +DA:822,22 +DA:823,14 +DA:824,14 +DA:825,14 +DA:826,14 +DA:827,14 +DA:828,14 +DA:829,14 +DA:830,14 +DA:831,14 +DA:832,14 +DA:833,14 +DA:834,14 +DA:835,14 +DA:836,22 +DA:837,22 +DA:838,22 +DA:839,22 +DA:840,22 +DA:841,22 +DA:842,22 +DA:843,22 +DA:844,14 +DA:845,14 +DA:846,14 +DA:847,14 +DA:848,14 +DA:849,14 +DA:850,14 +DA:851,14 +DA:852,14 +DA:853,14 +DA:854,14 +DA:855,22 +DA:856,22 +DA:857,22 +DA:858,22 +DA:859,22 +DA:860,22 +DA:861,22 +DA:862,22 +DA:863,22 +DA:864,22 +DA:865,22 +DA:866,14 +DA:867,14 +DA:868,14 +DA:869,14 +DA:870,14 +DA:871,14 +DA:872,14 +DA:873,14 +DA:874,14 +DA:875,22 +DA:876,22 +DA:877,22 +DA:878,22 +DA:879,22 +DA:880,22 +DA:881,22 +DA:882,22 +DA:883,22 +DA:884,14 +DA:885,14 +DA:886,14 +DA:887,14 +DA:888,14 +DA:889,14 +DA:890,14 +DA:891,14 +DA:892,14 +DA:893,14 +DA:894,14 +DA:895,14 +DA:896,14 +DA:897,14 +DA:898,22 +DA:899,22 +DA:900,22 +DA:901,22 +DA:902,22 +DA:903,22 +DA:904,22 +DA:905,22 +DA:906,14 +DA:907,14 +DA:908,14 +DA:909,1 +DA:910,1 +DA:911,14 +DA:912,14 +DA:913,14 +DA:914,14 +DA:915,14 +DA:916,14 +DA:917,14 +DA:918,14 +DA:919,14 +DA:920,14 +DA:921,14 +DA:922,22 +DA:923,22 +DA:924,22 +DA:925,22 +DA:926,1 +DA:927,1 +DA:928,1 +DA:929,4 +DA:930,4 +DA:931,4 +DA:932,4 +DA:933,4 +DA:934,4 +DA:935,4 +DA:936,4 +DA:937,4 +DA:938,4 +DA:939,4 +DA:940,4 +DA:941,4 +DA:942,4 +DA:943,4 +DA:944,4 +DA:945,4 +DA:946,4 +DA:947,4 +DA:948,4 +DA:949,1 +LF:949 +LH:939 +BRDA:29,0,0,22 +BRDA:40,1,0,14 +BRDA:44,2,0,546 +BRDA:47,3,0,0 +BRDA:60,4,0,1244 +BRDA:64,5,0,1 +BRDA:68,6,0,39 +BRDA:72,7,0,3 +BRDA:73,8,0,117 +BRDA:83,9,0,22 +BRDA:91,10,0,14 +BRDA:95,11,0,3 +BRDA:96,12,0,2 +BRDA:96,13,0,12 +BRDA:105,14,0,14 +BRDA:106,15,0,1 +BRDA:119,16,0,1 +BRDA:119,17,0,13 +BRDA:121,18,0,1 +BRDA:122,19,0,13 +BRDA:107,20,0,1 +BRDA:131,21,0,14 +BRDA:138,22,0,0 +BRDA:139,23,0,0 +BRDA:150,24,0,14 +BRDA:158,25,0,1 +BRDA:158,26,0,13 +BRDA:169,27,0,14 +BRDA:171,28,0,1 +BRDA:173,29,0,13 +BRDA:181,30,0,0 +BRDA:172,31,0,1 +BRDA:195,32,0,14 +BRDA:198,33,0,4 +BRDA:204,34,0,1 +BRDA:204,35,0,13 +BRDA:215,36,0,14 +BRDA:217,37,0,13 +BRDA:223,38,0,6 +BRDA:223,39,0,8 +BRDA:233,40,0,14 +BRDA:235,41,0,1 +BRDA:237,42,0,13 +BRDA:244,43,0,0 +BRDA:236,44,0,1 +BRDA:255,45,0,14 +BRDA:257,46,0,1 +BRDA:258,47,0,13 +BRDA:265,48,0,0 +BRDA:257,49,0,1 +BRDA:275,50,0,14 +BRDA:277,51,0,4 +BRDA:283,52,0,0 +BRDA:296,53,0,14 +BRDA:298,54,0,1 +BRDA:303,55,0,13 +BRDA:311,56,0,0 +BRDA:299,57,0,1 +BRDA:301,58,0,0 +BRDA:323,59,0,14 +BRDA:325,60,0,1 +BRDA:327,61,0,13 +BRDA:328,62,0,0 +BRDA:334,63,0,0 +BRDA:326,64,0,1 +BRDA:345,65,0,14 +BRDA:353,66,0,4 +BRDA:353,67,0,10 +BRDA:366,68,0,14 +BRDA:368,69,0,1 +BRDA:369,70,0,13 +BRDA:370,71,0,0 +BRDA:376,72,0,0 +BRDA:368,73,0,1 +BRDA:386,74,0,14 +BRDA:388,75,0,0 +BRDA:391,76,0,0 +BRDA:392,77,0,0 +BRDA:398,78,0,0 +BRDA:408,79,0,14 +BRDA:410,80,0,1 +BRDA:412,81,0,13 +BRDA:413,82,0,0 +BRDA:414,83,0,0 +BRDA:420,84,0,0 +BRDA:411,85,0,1 +BRDA:430,86,0,14 +BRDA:432,87,0,1 +BRDA:434,88,0,13 +BRDA:441,89,0,0 +BRDA:433,90,0,1 +BRDA:452,91,0,14 +BRDA:454,92,0,0 +BRDA:457,93,0,0 +BRDA:463,94,0,0 +BRDA:475,95,0,14 +BRDA:477,96,0,1 +BRDA:479,97,0,13 +BRDA:485,98,0,0 +BRDA:478,99,0,1 +BRDA:478,100,0,0 +BRDA:496,101,0,14 +BRDA:499,102,0,2 +BRDA:499,103,0,0 +BRDA:505,104,0,0 +BRDA:519,105,0,14 +BRDA:522,106,0,0 +BRDA:528,107,0,0 +BRDA:538,108,0,14 +BRDA:540,109,0,1 +BRDA:542,110,0,0 +BRDA:548,111,0,0 +BRDA:540,112,0,1 +BRDA:559,113,0,14 +BRDA:560,114,0,13 +BRDA:566,115,0,1 +BRDA:566,116,0,13 +BRDA:579,117,0,14 +BRDA:581,118,0,1 +BRDA:582,119,0,13 +BRDA:589,120,0,0 +BRDA:581,121,0,1 +BRDA:600,122,0,14 +BRDA:602,123,0,1 +BRDA:604,124,0,13 +BRDA:611,125,0,0 +BRDA:603,126,0,1 +BRDA:621,127,0,14 +BRDA:623,128,0,1 +BRDA:628,129,0,13 +BRDA:629,130,0,0 +BRDA:635,131,0,0 +BRDA:624,132,0,1 +BRDA:648,133,0,14 +BRDA:651,134,0,0 +BRDA:657,135,0,0 +BRDA:668,136,0,14 +BRDA:670,137,0,1 +BRDA:672,138,0,13 +BRDA:674,139,0,0 +BRDA:680,140,0,0 +BRDA:671,141,0,1 +BRDA:694,142,0,14 +BRDA:696,143,0,13 +BRDA:699,144,0,1 +BRDA:705,145,0,1 +BRDA:705,146,0,13 +BRDA:715,147,0,14 +BRDA:718,148,0,1 +BRDA:724,149,0,1 +BRDA:724,150,0,13 +BRDA:724,151,0,0 +BRDA:734,152,0,14 +BRDA:737,153,0,13 +BRDA:738,154,0,13 +BRDA:744,155,0,3 +BRDA:744,156,0,11 +BRDA:754,157,0,14 +BRDA:764,158,0,0 +BRDA:775,159,0,14 +BRDA:777,160,0,1 +BRDA:779,161,0,13 +BRDA:781,162,0,13 +BRDA:781,163,0,13 +BRDA:787,164,0,0 +BRDA:778,165,0,1 +BRDA:801,166,0,14 +BRDA:804,167,0,13 +BRDA:811,168,0,1 +BRDA:811,169,0,13 +BRDA:822,170,0,14 +BRDA:824,171,0,1 +BRDA:826,172,0,13 +BRDA:833,173,0,0 +BRDA:825,174,0,1 +BRDA:843,175,0,14 +BRDA:844,176,0,13 +BRDA:846,177,0,4 +BRDA:852,178,0,3 +BRDA:852,179,0,11 +BRDA:865,180,0,14 +BRDA:866,181,0,1 +BRDA:872,182,0,1 +BRDA:872,183,0,13 +BRDA:883,184,0,14 +BRDA:885,185,0,1 +BRDA:888,186,0,1 +BRDA:888,187,0,13 +BRDA:889,188,0,0 +BRDA:895,189,0,0 +BRDA:885,190,0,1 +BRDA:888,191,0,1 +BRDA:905,192,0,14 +BRDA:907,193,0,1 +BRDA:912,194,0,13 +BRDA:918,195,0,0 +BRDA:908,196,0,1 +BRDA:928,197,0,4 +BRDA:929,198,0,4 +BRDA:945,199,0,4 +BRDA:945,200,0,0 +BRF:201 +BRH:153 +end_of_record +TN: +SF:src/fraud/prevention/fraud-prevention.service.ts +FN:54,FraudPreventionService +FN:65,preTradeCheck +FN:198,blockTrader +FN:221,unblockTrader +FN:229,isTraderBlocked +FN:239,getBlockedTraders +FN:245,addToWhitelist +FN:250,removeFromWhitelist +FN:255,getWhitelist +FN:261,getPreventionStats +FN:286,applyPreventionForCase +FN:306,checkRateLimit +FN:318,updateRateCount +FN:324,recordPrevention +FNF:14 +FNH:14 +FNDA:22,FraudPreventionService +FNDA:14,preTradeCheck +FNDA:7,blockTrader +FNDA:2,unblockTrader +FNDA:6,isTraderBlocked +FNDA:1,getBlockedTraders +FNDA:3,addToWhitelist +FNDA:1,removeFromWhitelist +FNDA:2,getWhitelist +FNDA:2,getPreventionStats +FNDA:3,applyPreventionForCase +FNDA:12,checkRateLimit +FNDA:7,updateRateCount +FNDA:4,recordPrevention +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,22 +DA:56,22 +DA:57,22 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,14 +DA:67,14 +DA:68,14 +DA:69,14 +DA:70,14 +DA:71,14 +DA:72,14 +DA:73,14 +DA:74,14 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,13 +DA:84,13 +DA:85,13 +DA:86,14 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,1 +DA:103,12 +DA:104,12 +DA:105,12 +DA:106,14 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,11 +DA:119,11 +DA:120,11 +DA:121,11 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,10 +DA:134,11 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,11 +DA:146,9 +DA:147,9 +DA:148,14 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,9 +DA:160,9 +DA:161,14 +DA:162,1 +DA:163,1 +DA:164,1 +DA:165,1 +DA:166,1 +DA:167,1 +DA:168,1 +DA:169,1 +DA:170,1 +DA:171,8 +DA:172,8 +DA:173,8 +DA:174,8 +DA:175,8 +DA:176,8 +DA:177,14 +DA:178,1 +DA:179,1 +DA:180,1 +DA:181,1 +DA:182,1 +DA:183,1 +DA:184,1 +DA:185,1 +DA:186,7 +DA:187,7 +DA:188,7 +DA:189,7 +DA:190,14 +DA:191,14 +DA:192,14 +DA:193,14 +DA:194,14 +DA:195,1 +DA:196,1 +DA:197,1 +DA:198,1 +DA:199,7 +DA:200,7 +DA:201,7 +DA:202,7 +DA:203,7 +DA:204,7 +DA:205,7 +DA:206,7 +DA:207,7 +DA:208,7 +DA:209,7 +DA:210,7 +DA:211,7 +DA:212,7 +DA:213,7 +DA:214,7 +DA:215,7 +DA:216,7 +DA:217,7 +DA:218,7 +DA:219,7 +DA:220,1 +DA:221,1 +DA:222,2 +DA:223,2 +DA:224,1 +DA:225,1 +DA:226,2 +DA:227,2 +DA:228,1 +DA:229,1 +DA:230,6 +DA:231,6 +DA:232,6 +DA:233,1 +DA:234,1 +DA:235,1 +DA:236,3 +DA:237,3 +DA:238,1 +DA:239,1 +DA:240,1 +DA:241,1 +DA:242,1 +DA:243,1 +DA:244,1 +DA:245,1 +DA:246,3 +DA:247,3 +DA:248,3 +DA:249,1 +DA:250,1 +DA:251,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:255,1 +DA:256,2 +DA:257,2 +DA:258,1 +DA:259,1 +DA:260,1 +DA:261,1 +DA:262,2 +DA:263,2 +DA:264,2 +DA:265,1 +DA:266,2 +DA:267,2 +DA:268,2 +DA:269,2 +DA:270,2 +DA:271,2 +DA:272,2 +DA:273,2 +DA:274,2 +DA:275,2 +DA:276,2 +DA:277,2 +DA:278,2 +DA:279,1 +DA:280,1 +DA:281,1 +DA:282,1 +DA:283,1 +DA:284,1 +DA:285,1 +DA:286,1 +DA:287,3 +DA:288,1 +DA:289,1 +DA:290,1 +DA:291,1 +DA:292,1 +DA:293,1 +DA:294,3 +DA:295,1 +DA:296,1 +DA:297,1 +DA:298,1 +DA:299,1 +DA:300,1 +DA:301,1 +DA:302,3 +DA:303,1 +DA:304,1 +DA:305,1 +DA:306,1 +DA:307,12 +DA:308,12 +DA:309,12 +DA:310,12 +DA:311,12 +DA:312,12 +DA:313,12 +DA:314,12 +DA:315,12 +DA:316,12 +DA:317,1 +DA:318,1 +DA:319,7 +DA:320,7 +DA:321,7 +DA:322,7 +DA:323,1 +DA:324,1 +DA:325,4 +DA:326,4 +DA:327,4 +DA:328,4 +DA:329,4 +DA:330,4 +DA:331,4 +DA:332,4 +DA:333,4 +DA:334,4 +DA:335,1 +LF:335 +LH:322 +BRDA:54,0,0,22 +BRDA:65,1,0,14 +BRDA:74,2,0,1 +BRDA:83,3,0,13 +BRDA:86,4,0,1 +BRDA:88,5,0,0 +BRDA:91,6,0,0 +BRDA:98,7,0,0 +BRDA:103,8,0,12 +BRDA:106,9,0,1 +BRDA:110,10,0,0 +BRDA:118,11,0,11 +BRDA:121,12,0,1 +BRDA:125,13,0,0 +BRDA:133,14,0,10 +BRDA:134,15,0,1 +BRDA:146,16,0,9 +BRDA:148,17,0,0 +BRDA:159,18,0,9 +BRDA:161,19,0,1 +BRDA:161,20,0,1 +BRDA:163,21,0,0 +BRDA:171,22,0,8 +BRDA:177,23,0,1 +BRDA:186,24,0,7 +BRDA:190,25,0,0 +BRDA:191,26,0,0 +BRDA:191,27,0,7 +BRDA:198,28,0,7 +BRDA:205,29,0,2 +BRDA:206,30,0,5 +BRDA:217,31,0,2 +BRDA:217,32,0,5 +BRDA:221,33,0,2 +BRDA:223,34,0,1 +BRDA:229,35,0,6 +BRDA:231,36,0,2 +BRDA:232,37,0,4 +BRDA:232,38,0,3 +BRDA:232,39,0,1 +BRDA:236,40,0,3 +BRDA:239,41,0,1 +BRDA:245,42,0,3 +BRDA:250,43,0,1 +BRDA:255,44,0,2 +BRDA:261,45,0,2 +BRDA:264,46,0,1 +BRDA:267,47,0,1 +BRDA:286,48,0,3 +BRDA:287,49,0,1 +BRDA:294,50,0,2 +BRDA:294,51,0,1 +BRDA:306,52,0,12 +BRDA:309,53,0,11 +BRDA:312,54,0,60 +BRDA:318,55,0,7 +BRDA:319,56,0,0 +BRDA:324,57,0,4 +BRDA:330,58,0,0 +BRF:59 +BRH:48 +end_of_record +TN: +SF:src/fraud/reporting/suspicious-activity.service.ts +FN:45,SuspiciousActivityService +FN:53,generateSAR +FN:95,generateSARById +FN:106,queryCases +FN:155,getCaseById +FN:160,getCaseByCaseId +FN:165,updateCase +FN:195,getCasesByTrader +FN:212,getMetrics +FN:289,dailySarSweep +FN:311,weeklyComplianceReport +FN:320,buildSarSummary +FN:332,determineReportingObligation +FN:345,getApplicableRegulators +FNF:14 +FNH:11 +FNDA:20,SuspiciousActivityService +FNDA:7,generateSAR +FNDA:2,generateSARById +FNDA:3,queryCases +FNDA:2,getCaseById +FNDA:0,getCaseByCaseId +FNDA:3,updateCase +FNDA:1,getCasesByTrader +FNDA:2,getMetrics +FNDA:0,dailySarSweep +FNDA:0,weeklyComplianceReport +FNDA:7,buildSarSummary +FNDA:7,determineReportingObligation +FNDA:7,getApplicableRegulators +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,20 +DA:47,20 +DA:48,20 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,7 +DA:55,7 +DA:56,7 +DA:57,7 +DA:58,7 +DA:59,7 +DA:60,7 +DA:61,7 +DA:62,7 +DA:63,7 +DA:64,7 +DA:65,7 +DA:66,7 +DA:67,7 +DA:68,7 +DA:69,7 +DA:70,7 +DA:71,7 +DA:72,7 +DA:73,7 +DA:74,7 +DA:75,7 +DA:76,7 +DA:77,7 +DA:78,7 +DA:79,7 +DA:80,7 +DA:81,7 +DA:82,7 +DA:83,7 +DA:84,7 +DA:85,7 +DA:86,7 +DA:87,7 +DA:88,7 +DA:89,7 +DA:90,7 +DA:91,7 +DA:92,7 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,2 +DA:97,2 +DA:98,2 +DA:99,2 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,3 +DA:108,3 +DA:109,3 +DA:110,3 +DA:111,3 +DA:112,3 +DA:113,3 +DA:114,3 +DA:115,3 +DA:116,3 +DA:117,3 +DA:118,3 +DA:119,3 +DA:120,3 +DA:121,3 +DA:122,3 +DA:123,3 +DA:124,3 +DA:125,3 +DA:126,3 +DA:127,3 +DA:128,3 +DA:129,3 +DA:130,0 +DA:131,0 +DA:132,3 +DA:133,3 +DA:134,3 +DA:135,3 +DA:136,3 +DA:137,3 +DA:138,3 +DA:139,3 +DA:140,3 +DA:141,3 +DA:142,3 +DA:143,3 +DA:144,3 +DA:145,3 +DA:146,3 +DA:147,3 +DA:148,3 +DA:149,3 +DA:150,3 +DA:151,3 +DA:152,3 +DA:153,1 +DA:154,1 +DA:155,1 +DA:156,2 +DA:157,2 +DA:158,1 +DA:159,1 +DA:160,1 +DA:161,0 +DA:162,0 +DA:163,1 +DA:164,1 +DA:165,1 +DA:166,3 +DA:167,3 +DA:168,3 +DA:169,3 +DA:170,3 +DA:171,3 +DA:172,3 +DA:173,3 +DA:174,3 +DA:175,3 +DA:176,3 +DA:177,3 +DA:178,3 +DA:179,3 +DA:180,3 +DA:181,3 +DA:182,2 +DA:183,3 +DA:184,2 +DA:185,2 +DA:186,3 +DA:187,3 +DA:188,3 +DA:189,3 +DA:190,3 +DA:191,3 +DA:192,3 +DA:193,1 +DA:194,1 +DA:195,1 +DA:196,1 +DA:197,1 +DA:198,1 +DA:199,1 +DA:200,1 +DA:201,1 +DA:202,1 +DA:203,1 +DA:204,1 +DA:205,1 +DA:206,1 +DA:207,1 +DA:208,1 +DA:209,1 +DA:210,1 +DA:211,1 +DA:212,1 +DA:213,2 +DA:214,2 +DA:215,2 +DA:216,2 +DA:217,2 +DA:218,2 +DA:219,2 +DA:220,2 +DA:221,2 +DA:222,2 +DA:223,2 +DA:224,2 +DA:225,2 +DA:226,2 +DA:227,2 +DA:228,2 +DA:229,2 +DA:230,2 +DA:231,2 +DA:232,2 +DA:233,2 +DA:234,2 +DA:235,2 +DA:236,2 +DA:237,2 +DA:238,2 +DA:239,2 +DA:240,2 +DA:241,2 +DA:242,2 +DA:243,2 +DA:244,2 +DA:245,2 +DA:246,2 +DA:247,2 +DA:248,2 +DA:249,2 +DA:250,2 +DA:251,2 +DA:252,2 +DA:253,101 +DA:254,101 +DA:255,101 +DA:256,2 +DA:257,2 +DA:258,2 +DA:259,2 +DA:260,2 +DA:261,2 +DA:262,2 +DA:263,2 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,2 +DA:269,2 +DA:270,2 +DA:271,2 +DA:272,2 +DA:273,2 +DA:274,2 +DA:275,2 +DA:276,2 +DA:277,2 +DA:278,2 +DA:279,2 +DA:280,2 +DA:281,2 +DA:282,2 +DA:283,2 +DA:284,1 +DA:285,1 +DA:286,1 +DA:287,1 +DA:288,1 +DA:289,1 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,1 +DA:309,1 +DA:310,1 +DA:311,1 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,1 +DA:318,1 +DA:319,1 +DA:320,1 +DA:321,7 +DA:322,7 +DA:323,7 +DA:324,7 +DA:325,7 +DA:326,7 +DA:327,7 +DA:328,7 +DA:329,7 +DA:330,7 +DA:331,1 +DA:332,1 +DA:333,7 +DA:334,7 +DA:335,1 +DA:336,7 +DA:337,6 +DA:338,7 +DA:339,0 +DA:340,7 +DA:341,0 +DA:342,7 +DA:343,7 +DA:344,1 +DA:345,1 +DA:346,7 +DA:347,7 +DA:348,7 +DA:349,7 +DA:350,7 +DA:351,7 +DA:352,7 +DA:353,7 +DA:354,7 +DA:355,7 +DA:356,7 +DA:357,7 +DA:358,7 +DA:359,7 +DA:360,7 +DA:361,7 +DA:362,7 +DA:363,7 +DA:364,1 +LF:364 +LH:331 +BRDA:45,0,0,20 +BRDA:53,1,0,7 +BRDA:64,2,0,0 +BRDA:65,3,0,0 +BRDA:67,4,0,0 +BRDA:72,5,0,0 +BRDA:83,6,0,1 +BRDA:84,7,0,6 +BRDA:95,8,0,2 +BRDA:99,9,0,1 +BRDA:106,10,0,3 +BRDA:122,11,0,1 +BRDA:123,12,0,1 +BRDA:124,13,0,1 +BRDA:125,14,0,0 +BRDA:127,15,0,0 +BRDA:129,16,0,0 +BRDA:129,17,0,0 +BRDA:142,18,0,1 +BRDA:143,19,0,2 +BRDA:142,20,0,2 +BRDA:155,21,0,2 +BRDA:165,22,0,3 +BRDA:174,23,0,1 +BRDA:175,24,0,1 +BRDA:177,25,0,1 +BRDA:178,26,0,1 +BRDA:181,27,0,2 +BRDA:183,28,0,2 +BRDA:195,29,0,1 +BRDA:212,30,0,2 +BRDA:239,31,0,0 +BRDA:242,32,0,0 +BRDA:247,33,0,0 +BRDA:252,34,0,101 +BRDA:253,35,0,2 +BRDA:254,36,0,2 +BRDA:263,37,0,0 +BRDA:238,38,0,101 +BRDA:259,39,0,101 +BRDA:259,40,0,0 +BRDA:320,41,0,7 +BRDA:326,42,0,0 +BRDA:327,43,0,0 +BRDA:328,44,0,0 +BRDA:332,45,0,7 +BRDA:334,46,0,1 +BRDA:336,47,0,6 +BRDA:338,48,0,0 +BRDA:340,49,0,0 +BRDA:345,50,0,7 +BRDA:351,51,0,1 +BRDA:352,52,0,6 +BRDA:353,53,0,6 +BRDA:354,54,0,1 +BRDA:356,55,0,0 +BRDA:358,56,0,0 +BRDA:360,57,0,0 +BRF:58 +BRH:37 +end_of_record +TN: +SF:src/gas/gas-estimator.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +LF:163 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/gas/gas.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +LF:24 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/gas/algorithms/fee-prediction.algorithm.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +LF:125 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/gas/batching/batching.service.ts +FN:30,BatchingService +FN:36,planBatches +FN:92,isBatchingWorthwhile +FN:96,groupByNetwork +FNF:4 +FNH:4 +FNDA:7,BatchingService +FNDA:7,planBatches +FNDA:2,isBatchingWorthwhile +FNDA:6,groupByNetwork +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,7 +DA:32,7 +DA:33,7 +DA:34,7 +DA:35,7 +DA:36,7 +DA:37,7 +DA:38,7 +DA:39,7 +DA:40,7 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,6 +DA:50,6 +DA:51,6 +DA:52,6 +DA:53,7 +DA:54,8 +DA:55,12 +DA:56,12 +DA:57,8 +DA:58,6 +DA:59,6 +DA:60,6 +DA:61,6 +DA:62,6 +DA:63,6 +DA:64,6 +DA:65,12 +DA:66,12 +DA:67,6 +DA:68,6 +DA:69,6 +DA:70,6 +DA:71,6 +DA:72,6 +DA:73,6 +DA:74,6 +DA:75,6 +DA:76,7 +DA:77,7 +DA:78,7 +DA:79,7 +DA:80,7 +DA:81,7 +DA:82,7 +DA:83,7 +DA:84,7 +DA:85,7 +DA:86,7 +DA:87,7 +DA:88,7 +DA:89,7 +DA:90,7 +DA:91,7 +DA:92,7 +DA:93,2 +DA:94,2 +DA:95,7 +DA:96,7 +DA:97,6 +DA:98,6 +DA:99,6 +DA:100,6 +DA:101,47 +DA:102,47 +DA:103,47 +DA:104,47 +DA:105,6 +DA:106,6 +DA:107,6 +DA:108,6 +DA:109,7 +LF:109 +LH:109 +BRDA:30,0,0,7 +BRDA:36,1,0,7 +BRDA:40,2,0,1 +BRDA:49,3,0,6 +BRDA:53,4,0,8 +BRDA:54,5,0,12 +BRDA:58,6,0,6 +BRDA:76,7,0,0 +BRDA:60,8,0,47 +BRDA:64,9,0,12 +BRDA:65,10,0,47 +BRDA:92,11,0,2 +BRDA:96,12,0,6 +BRDA:100,13,0,47 +BRDA:102,14,0,8 +BRF:15 +BRH:14 +end_of_record +TN: +SF:src/gas/dto/gas-estimate.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +LF:163 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/gas/entities/gas-usage.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +LF:65 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/gas/optimizer/gas-optimizer.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +LF:95 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/gateway/api-gateway.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +LF:34 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/gateway/auth/gateway-auth.service.ts +FN:4,GatewayAuthService +FN:12,validateRequest +FN:27,generateApiKey +FNF:3 +FNH:3 +FNDA:4,GatewayAuthService +FNDA:2,validateRequest +FNDA:1,generateApiKey +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,4 +DA:6,4 +DA:7,4 +DA:8,4 +DA:9,4 +DA:10,4 +DA:11,4 +DA:12,4 +DA:13,2 +DA:14,2 +DA:15,2 +DA:16,2 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,4 +DA:24,4 +DA:25,4 +DA:26,4 +DA:27,4 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,4 +LF:31 +LH:31 +BRDA:4,0,0,4 +BRDA:12,1,0,2 +BRDA:16,2,0,1 +BRDA:27,3,0,1 +BRF:4 +BRH:4 +end_of_record +TN: +SF:src/gateway/circuit-breaker/circuit-breaker.service.ts +FN:14,CircuitBreakerService +FN:24,checkCircuit +FN:35,reportSuccess +FN:45,reportFailure +FNF:4 +FNH:4 +FNDA:5,CircuitBreakerService +FNDA:8,checkCircuit +FNDA:1,reportSuccess +FNDA:11,reportFailure +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,5 +DA:16,5 +DA:17,5 +DA:18,5 +DA:19,5 +DA:20,5 +DA:21,5 +DA:22,5 +DA:23,5 +DA:24,5 +DA:25,8 +DA:26,2 +DA:27,2 +DA:28,2 +DA:29,2 +DA:30,8 +DA:31,5 +DA:32,5 +DA:33,5 +DA:34,5 +DA:35,5 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,5 +DA:41,5 +DA:42,5 +DA:43,5 +DA:44,5 +DA:45,5 +DA:46,11 +DA:47,11 +DA:48,11 +DA:49,11 +DA:50,11 +DA:51,11 +DA:52,2 +DA:53,2 +DA:54,2 +DA:55,2 +DA:56,2 +DA:57,0 +DA:58,0 +DA:59,2 +DA:60,2 +DA:61,11 +DA:62,5 +LF:62 +LH:60 +BRDA:7,0,0,1 +BRDA:14,1,0,5 +BRDA:24,2,0,8 +BRDA:25,3,0,2 +BRDA:35,4,0,1 +BRDA:45,5,0,11 +BRDA:51,6,0,2 +BRF:7 +BRH:7 +end_of_record +TN: +SF:src/gateway/monitoring/gateway-monitor.service.ts +FN:11,GatewayMonitorService +FN:35,logRequest +FN:51,getMetrics +FNF:3 +FNH:3 +FNDA:3,GatewayMonitorService +FNDA:1,logRequest +FNDA:1,getMetrics +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,3 +DA:13,3 +DA:14,3 +DA:15,3 +DA:16,3 +DA:17,3 +DA:18,3 +DA:19,3 +DA:20,3 +DA:21,3 +DA:22,3 +DA:23,3 +DA:24,3 +DA:25,3 +DA:26,3 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +LF:54 +LH:54 +BRDA:11,0,0,3 +BRDA:35,1,0,1 +BRDA:51,2,0,1 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/gateway/rate-limiting/advanced-rate-limiter.service.ts +FN:8,AdvancedRateLimiterService +FN:18,checkRateLimit +FN:42,getUsage +FNF:3 +FNH:2 +FNDA:3,AdvancedRateLimiterService +FNDA:2,checkRateLimit +FNDA:0,getUsage +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,2 +DA:20,2 +DA:21,2 +DA:22,2 +DA:23,2 +DA:24,2 +DA:25,2 +DA:26,2 +DA:27,2 +DA:28,2 +DA:29,2 +DA:30,2 +DA:31,2 +DA:32,2 +DA:33,2 +DA:34,2 +DA:35,2 +DA:36,2 +DA:37,2 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,0 +DA:44,0 +DA:45,1 +LF:45 +LH:43 +BRDA:8,0,0,3 +BRDA:18,1,0,2 +BRDA:24,2,0,1 +BRDA:24,3,0,1 +BRF:4 +BRH:4 +end_of_record +TN: +SF:src/gateway/transformation/request-transformer.service.ts +FN:4,RequestTransformerService +FN:13,transformRequest +FN:30,transformResponse +FN:41,energyRequestTransformation +FN:50,energyResponseTransformation +FNF:5 +FNH:5 +FNDA:5,RequestTransformerService +FNDA:2,transformRequest +FNDA:2,transformResponse +FNDA:1,energyRequestTransformation +FNDA:1,energyResponseTransformation +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,5 +DA:6,5 +DA:7,5 +DA:8,5 +DA:9,5 +DA:10,5 +DA:11,5 +DA:12,5 +DA:13,5 +DA:14,2 +DA:15,2 +DA:16,2 +DA:17,2 +DA:18,1 +DA:19,2 +DA:20,1 +DA:21,2 +DA:22,2 +DA:23,5 +DA:24,5 +DA:25,5 +DA:26,5 +DA:27,5 +DA:28,5 +DA:29,5 +DA:30,5 +DA:31,2 +DA:32,2 +DA:33,2 +DA:34,2 +DA:35,1 +DA:36,2 +DA:37,1 +DA:38,2 +DA:39,2 +DA:40,5 +DA:41,5 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,5 +DA:50,5 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,0 +DA:60,0 +DA:61,5 +LF:61 +LH:59 +BRDA:4,0,0,5 +BRDA:13,1,0,2 +BRDA:17,2,0,1 +BRDA:19,3,0,1 +BRDA:30,4,0,2 +BRDA:34,5,0,1 +BRDA:36,6,0,1 +BRDA:41,7,0,1 +BRDA:50,8,0,1 +BRDA:59,9,0,0 +BRF:10 +BRH:9 +end_of_record +TN: +SF:src/location/location.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +LF:12 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/location/location.service.ts +FN:22,LocationService +FN:32,createLocation +FN:63,updateLocation +FN:102,getLocation +FN:118,searchLocations +FN:240,generateHeatmapData +FN:304,findZoneForCoordinate +FN:314,calculateDistance +FN:334,getRegionalPriceMultiplier +FN:342,createGridZone +FN:350,getGridZones +FN:357,updateGridZone +FN:373,deleteLocation +FN:379,validateCoordinates +FN:388,sortByDistance +FN:410,paginateResults +FNF:16 +FNH:8 +FNDA:7,LocationService +FNDA:3,createLocation +FNDA:0,updateLocation +FNDA:3,getLocation +FNDA:1,searchLocations +FNDA:0,generateHeatmapData +FNDA:1,findZoneForCoordinate +FNDA:1,calculateDistance +FNDA:1,getRegionalPriceMultiplier +FNDA:0,createGridZone +FNDA:0,getGridZones +FNDA:0,updateGridZone +FNDA:0,deleteLocation +FNDA:3,validateCoordinates +FNDA:0,sortByDistance +FNDA:0,paginateResults +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,7 +DA:24,7 +DA:25,7 +DA:26,7 +DA:27,7 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,3 +DA:34,3 +DA:35,3 +DA:36,3 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,3 +DA:42,1 +DA:43,3 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,3 +DA:104,3 +DA:105,3 +DA:106,3 +DA:107,3 +DA:108,3 +DA:109,0 +DA:110,0 +DA:111,3 +DA:112,3 +DA:113,3 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,1 +DA:162,1 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,1 +DA:171,1 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,1 +DA:177,1 +DA:178,1 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,1 +DA:195,1 +DA:196,1 +DA:197,1 +DA:198,1 +DA:199,1 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,1 +DA:214,1 +DA:215,1 +DA:216,1 +DA:217,1 +DA:218,1 +DA:219,1 +DA:220,1 +DA:221,1 +DA:222,1 +DA:223,1 +DA:224,1 +DA:225,1 +DA:226,1 +DA:227,1 +DA:228,1 +DA:229,1 +DA:230,1 +DA:231,1 +DA:232,1 +DA:233,1 +DA:234,1 +DA:235,1 +DA:236,1 +DA:237,1 +DA:238,1 +DA:239,1 +DA:240,1 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,1 +DA:301,1 +DA:302,1 +DA:303,1 +DA:304,1 +DA:305,1 +DA:306,1 +DA:307,1 +DA:308,1 +DA:309,1 +DA:310,1 +DA:311,1 +DA:312,1 +DA:313,1 +DA:314,1 +DA:315,1 +DA:316,1 +DA:317,1 +DA:318,1 +DA:319,1 +DA:320,1 +DA:321,1 +DA:322,1 +DA:323,1 +DA:324,1 +DA:325,1 +DA:326,1 +DA:327,1 +DA:328,1 +DA:329,1 +DA:330,1 +DA:331,1 +DA:332,1 +DA:333,1 +DA:334,1 +DA:335,1 +DA:336,1 +DA:337,1 +DA:338,1 +DA:339,1 +DA:340,1 +DA:341,1 +DA:342,1 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,1 +DA:347,1 +DA:348,1 +DA:349,1 +DA:350,1 +DA:351,0 +DA:352,0 +DA:353,1 +DA:354,1 +DA:355,1 +DA:356,1 +DA:357,1 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,1 +DA:370,1 +DA:371,1 +DA:372,1 +DA:373,1 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,1 +DA:379,1 +DA:380,3 +DA:381,1 +DA:382,1 +DA:383,3 +DA:384,1 +DA:385,1 +DA:386,3 +DA:387,1 +DA:388,1 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,1 +DA:410,1 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,1 +LF:432 +LH:218 +BRDA:22,0,0,7 +BRDA:32,1,0,3 +BRDA:37,2,0,1 +BRDA:41,3,0,1 +BRDA:43,4,0,1 +BRDA:49,5,0,0 +BRDA:102,6,0,3 +BRDA:108,7,0,0 +BRDA:118,8,0,1 +BRDA:129,9,0,0 +BRDA:141,10,0,0 +BRDA:153,11,0,0 +BRDA:162,12,0,0 +BRDA:171,13,0,0 +BRDA:178,14,0,0 +BRDA:178,15,0,0 +BRDA:178,16,0,0 +BRDA:199,17,0,0 +BRDA:199,18,0,0 +BRDA:221,19,0,0 +BRDA:222,20,0,0 +BRDA:304,21,0,1 +BRDA:314,22,0,1 +BRDA:334,23,0,1 +BRDA:379,24,0,3 +BRDA:380,25,0,1 +BRDA:383,26,0,2 +BRDA:383,27,0,1 +BRF:28 +BRH:14 +end_of_record +TN: +SF:src/location/algorithms/distance.algorithm.ts +FN:20,calculateDistance +FN:53,calculateBearing +FN:70,findPointsWithinRadius +FN:89,getBoundingBox +FN:114,isPointInPolygon +FN:134,toRadians +FN:138,toDegrees +FNF:7 +FNH:4 +FNDA:1,calculateDistance +FNDA:1,calculateBearing +FNDA:0,findPointsWithinRadius +FNDA:0,getBoundingBox +FNDA:0,isPointInPolygon +FNDA:7,toRadians +FNDA:1,toDegrees +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,1 +DA:134,1 +DA:135,7 +DA:136,7 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +LF:141 +LH:90 +BRDA:20,0,0,1 +BRDA:40,1,0,0 +BRDA:53,2,0,1 +BRDA:134,3,0,7 +BRDA:138,4,0,1 +BRF:5 +BRH:4 +end_of_record +TN: +SF:src/location/algorithms/zone-mapping.algorithm.ts +FN:15,findZoneForCoordinate +FN:55,findZonesWithinRadius +FN:81,calculateZoneCentroid +FN:101,calculateZoneArea +FN:121,isCoordinateInZone +FN:149,calculatePolygonCentroid +FN:169,calculatePolygonArea +FN:185,getAdjacentZones +FN:214,doZonesShareBoundary +FNF:9 +FNH:1 +FNDA:1,findZoneForCoordinate +FNDA:0,findZonesWithinRadius +FNDA:0,calculateZoneCentroid +FNDA:0,calculateZoneArea +FNDA:0,isCoordinateInZone +FNDA:0,calculatePolygonCentroid +FNDA:0,calculatePolygonArea +FNDA:0,getAdjacentZones +FNDA:0,doZonesShareBoundary +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,1 +DA:165,1 +DA:166,1 +DA:167,1 +DA:168,1 +DA:169,1 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,1 +DA:182,1 +DA:183,1 +DA:184,1 +DA:185,1 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,1 +DA:211,1 +DA:212,1 +DA:213,1 +DA:214,1 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,1 +LF:231 +LH:73 +BRDA:15,0,0,1 +BRDA:23,1,0,0 +BRDA:48,2,0,0 +BRF:3 +BRH:1 +end_of_record +TN: +SF:src/location/dto/location-search.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +LF:238 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/location/entities/grid-zone.entity.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +LF:66 +LH:66 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/location/entities/location.entity.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +LF:55 +LH:55 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/logging/logging.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +LF:40 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/logging/logging.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +LF:519 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/logging/alerts/log-alert.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:765,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:769,0 +DA:770,0 +DA:771,0 +DA:772,0 +DA:773,0 +DA:774,0 +DA:775,0 +DA:776,0 +DA:777,0 +DA:778,0 +DA:779,0 +DA:780,0 +DA:781,0 +DA:782,0 +DA:783,0 +DA:784,0 +DA:785,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:795,0 +DA:796,0 +DA:797,0 +DA:798,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:803,0 +DA:804,0 +DA:805,0 +DA:806,0 +DA:807,0 +DA:808,0 +DA:809,0 +DA:810,0 +DA:811,0 +DA:812,0 +DA:813,0 +DA:814,0 +DA:815,0 +DA:816,0 +DA:817,0 +DA:818,0 +DA:819,0 +DA:820,0 +DA:821,0 +DA:822,0 +DA:823,0 +DA:824,0 +DA:825,0 +DA:826,0 +DA:827,0 +DA:828,0 +DA:829,0 +DA:830,0 +DA:831,0 +DA:832,0 +DA:833,0 +DA:834,0 +DA:835,0 +DA:836,0 +DA:837,0 +DA:838,0 +DA:839,0 +DA:840,0 +DA:841,0 +DA:842,0 +DA:843,0 +DA:844,0 +DA:845,0 +DA:846,0 +DA:847,0 +DA:848,0 +DA:849,0 +DA:850,0 +DA:851,0 +DA:852,0 +DA:853,0 +DA:854,0 +DA:855,0 +DA:856,0 +DA:857,0 +DA:858,0 +DA:859,0 +DA:860,0 +DA:861,0 +DA:862,0 +DA:863,0 +DA:864,0 +DA:865,0 +DA:866,0 +DA:867,0 +DA:868,0 +DA:869,0 +DA:870,0 +DA:871,0 +DA:872,0 +DA:873,0 +DA:874,0 +DA:875,0 +DA:876,0 +DA:877,0 +DA:878,0 +DA:879,0 +DA:880,0 +DA:881,0 +DA:882,0 +DA:883,0 +DA:884,0 +DA:885,0 +DA:886,0 +DA:887,0 +DA:888,0 +DA:889,0 +DA:890,0 +DA:891,0 +DA:892,0 +DA:893,0 +DA:894,0 +DA:895,0 +DA:896,0 +DA:897,0 +DA:898,0 +DA:899,0 +DA:900,0 +DA:901,0 +DA:902,0 +DA:903,0 +DA:904,0 +DA:905,0 +DA:906,0 +DA:907,0 +DA:908,0 +DA:909,0 +DA:910,0 +DA:911,0 +DA:912,0 +DA:913,0 +DA:914,0 +DA:915,0 +DA:916,0 +DA:917,0 +DA:918,0 +DA:919,0 +DA:920,0 +DA:921,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:925,0 +DA:926,0 +DA:927,0 +DA:928,0 +DA:929,0 +DA:930,0 +DA:931,0 +DA:932,0 +DA:933,0 +DA:934,0 +DA:935,0 +DA:936,0 +DA:937,0 +DA:938,0 +DA:939,0 +DA:940,0 +DA:941,0 +DA:942,0 +DA:943,0 +DA:944,0 +DA:945,0 +DA:946,0 +DA:947,0 +DA:948,0 +DA:949,0 +DA:950,0 +DA:951,0 +DA:952,0 +DA:953,0 +DA:954,0 +DA:955,0 +DA:956,0 +DA:957,0 +DA:958,0 +DA:959,0 +DA:960,0 +DA:961,0 +DA:962,0 +DA:963,0 +DA:964,0 +DA:965,0 +DA:966,0 +DA:967,0 +DA:968,0 +DA:969,0 +DA:970,0 +DA:971,0 +DA:972,0 +DA:973,0 +DA:974,0 +DA:975,0 +DA:976,0 +DA:977,0 +DA:978,0 +LF:978 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/logging/elasticsearch/elasticsearch.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +LF:33 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/logging/elasticsearch/elasticsearch.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +LF:646 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/logging/parsing/log-parser.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +LF:580 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/logging/retention/retention-policy.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:765,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:769,0 +DA:770,0 +DA:771,0 +DA:772,0 +DA:773,0 +DA:774,0 +DA:775,0 +LF:775 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/matching.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +LF:24 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/matching.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +LF:654 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/algorithms/geographic-matching.algorithm.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +LF:556 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/algorithms/partial-fulfillment.algorithm.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +LF:629 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/algorithms/priority-matching.algorithm.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +LF:469 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/audit/audit.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +LF:461 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/dto/matching-preferences.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +LF:214 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/entities/match.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +LF:103 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/entities/matching-rule.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +LF:131 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/matching/events/matching-events.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +LF:450 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/modules/dao/dao.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +LF:49 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/modules/dao/dao.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +LF:80 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/modules/dao/dto/create-proposal.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +LF:19 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/modules/dao/entities/proposal.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +LF:14 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/modules/energy/energy.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +LF:46 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/modules/energy/energy.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +LF:72 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/modules/energy/dto/create-energy-trade.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +LF:7 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/modules/energy/entities/energy-trade.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +LF:11 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/monitoring/monitoring.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +LF:40 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/monitoring/monitoring.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +LF:30 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/monitoring/transaction-monitor.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +LF:489 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/monitoring/alerts/alert.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +LF:402 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/monitoring/dto/transaction-status.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +LF:317 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/monitoring/entities/transaction-status.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +LF:112 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/monitoring/retry/retry.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +LF:434 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/monitoring/workflows/transaction.workflow.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +LF:487 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/multisig/multisig.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +LF:15 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/multisig/multisig.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +LF:459 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/multisig/dto/multisig.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +LF:302 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/multisig/entities/multisig-wallet.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +LF:94 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/multisig/entities/signature.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +LF:124 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/multisig/recovery/recovery.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +LF:615 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/multisig/workflows/signature-collection.workflow.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +LF:362 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/pricing.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +LF:83 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/pricing.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/pricing.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +LF:364 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/algorithms/dynamic-pricing.algorithm.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +LF:113 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/algorithms/location-adjustment.algorithm.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +LF:182 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/algorithms/prediction.algorithm.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +LF:230 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/algorithms/time-pricing.algorithm.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +LF:152 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/dto/calculate-price.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +LF:109 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/pricing/entities/price-history.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +LF:63 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/risk/risk-management.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/risk/assessment/risk-assessor.service.ts +FN:15,RiskAssessorService +FN:20,assessRisk +FN:58,calculateRiskLevel +FN:97,calculateRiskScore +FN:105,calculateMarketRisk +FN:118,calculateCreditRisk +FN:132,calculateOperationalRisk +FN:141,calculateLiquidityRisk +FN:150,calculateRegulatoryRisk +FN:159,generateMitigationActions +FN:221,getImplementationTimeline +FN:236,getRiskAssessment +FN:243,updateRiskAssessment +FNF:13 +FNH:11 +FNDA:9,RiskAssessorService +FNDA:4,assessRisk +FNDA:6,calculateRiskLevel +FNDA:4,calculateRiskScore +FNDA:3,calculateMarketRisk +FNDA:2,calculateCreditRisk +FNDA:1,calculateOperationalRisk +FNDA:0,calculateLiquidityRisk +FNDA:0,calculateRegulatoryRisk +FNDA:4,generateMitigationActions +FNDA:4,getImplementationTimeline +FNDA:1,getRiskAssessment +FNDA:1,updateRiskAssessment +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,9 +DA:17,9 +DA:18,9 +DA:19,1 +DA:20,1 +DA:21,4 +DA:22,4 +DA:23,4 +DA:24,4 +DA:25,4 +DA:26,4 +DA:27,4 +DA:28,4 +DA:29,4 +DA:30,4 +DA:31,4 +DA:32,4 +DA:33,4 +DA:34,4 +DA:35,4 +DA:36,4 +DA:37,4 +DA:38,4 +DA:39,4 +DA:40,4 +DA:41,4 +DA:42,4 +DA:43,4 +DA:44,4 +DA:45,4 +DA:46,4 +DA:47,4 +DA:48,4 +DA:49,4 +DA:50,4 +DA:51,4 +DA:52,4 +DA:53,4 +DA:54,4 +DA:55,4 +DA:56,4 +DA:57,1 +DA:58,1 +DA:59,6 +DA:60,6 +DA:61,6 +DA:62,6 +DA:63,6 +DA:64,6 +DA:65,6 +DA:66,6 +DA:67,6 +DA:68,6 +DA:69,3 +DA:70,3 +DA:71,6 +DA:72,2 +DA:73,2 +DA:74,2 +DA:75,2 +DA:76,2 +DA:77,6 +DA:78,1 +DA:79,1 +DA:80,6 +DA:81,0 +DA:82,0 +DA:83,6 +DA:84,0 +DA:85,0 +DA:86,6 +DA:87,6 +DA:88,6 +DA:89,6 +DA:90,6 +DA:91,6 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,1 +DA:97,1 +DA:98,4 +DA:99,4 +DA:100,4 +DA:101,4 +DA:102,4 +DA:103,4 +DA:104,1 +DA:105,1 +DA:106,3 +DA:107,3 +DA:108,3 +DA:109,3 +DA:110,3 +DA:111,3 +DA:112,3 +DA:113,3 +DA:114,3 +DA:115,3 +DA:116,3 +DA:117,1 +DA:118,1 +DA:119,2 +DA:120,2 +DA:121,2 +DA:122,2 +DA:123,2 +DA:124,2 +DA:125,2 +DA:126,2 +DA:127,2 +DA:128,2 +DA:129,2 +DA:130,2 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,1 +DA:150,1 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,1 +DA:159,1 +DA:160,4 +DA:161,4 +DA:162,4 +DA:163,4 +DA:164,4 +DA:165,4 +DA:166,4 +DA:167,4 +DA:168,4 +DA:169,4 +DA:170,4 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,4 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,4 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,4 +DA:189,4 +DA:190,4 +DA:191,4 +DA:192,4 +DA:193,2 +DA:194,2 +DA:195,2 +DA:196,4 +DA:197,1 +DA:198,1 +DA:199,1 +DA:200,4 +DA:201,1 +DA:202,1 +DA:203,1 +DA:204,4 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,4 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,4 +DA:213,4 +DA:214,4 +DA:215,4 +DA:216,4 +DA:217,4 +DA:218,4 +DA:219,4 +DA:220,1 +DA:221,1 +DA:222,4 +DA:223,4 +DA:224,4 +DA:225,4 +DA:226,0 +DA:227,4 +DA:228,0 +DA:229,4 +DA:230,0 +DA:231,4 +DA:232,0 +DA:233,4 +DA:234,4 +DA:235,1 +DA:236,1 +DA:237,1 +DA:238,1 +DA:239,1 +DA:240,1 +DA:241,1 +DA:242,1 +DA:243,1 +DA:244,1 +DA:245,1 +DA:246,1 +DA:247,1 +DA:248,1 +DA:249,1 +DA:250,1 +LF:250 +LH:203 +BRDA:15,0,0,9 +BRDA:20,1,0,4 +BRDA:58,2,0,6 +BRDA:68,3,0,3 +BRDA:71,4,0,2 +BRDA:77,5,0,1 +BRDA:80,6,0,0 +BRDA:83,7,0,0 +BRDA:86,8,0,0 +BRDA:92,9,0,0 +BRDA:97,10,0,4 +BRDA:105,11,0,3 +BRDA:110,12,0,2 +BRDA:110,13,0,1 +BRDA:111,14,0,2 +BRDA:111,15,0,1 +BRDA:118,16,0,2 +BRDA:123,17,0,0 +BRDA:124,18,0,0 +BRDA:132,19,0,1 +BRDA:159,20,0,4 +BRDA:170,21,0,0 +BRDA:175,22,0,0 +BRDA:181,23,0,0 +BRDA:192,24,0,2 +BRDA:196,25,0,1 +BRDA:200,26,0,1 +BRDA:204,27,0,0 +BRDA:208,28,0,0 +BRDA:221,29,0,4 +BRDA:225,30,0,0 +BRDA:227,31,0,0 +BRDA:229,32,0,0 +BRDA:231,33,0,0 +BRDA:236,34,0,1 +BRDA:243,35,0,1 +BRF:36 +BRH:21 +end_of_record +TN: +SF:src/risk/calculations/var-calculator.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +LF:527 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/risk/controller/risk-management.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +LF:411 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/risk/dto/risk-assessment.dto.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +LF:151 +LH:151 +BRDA:13,0,0,1 +BRDA:21,1,0,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/risk/entities/risk-data.entity.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +LF:49 +LH:49 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/risk/hedging/hedging-strategy.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +LF:443 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/risk/monitoring/real-time-monitor.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +LF:341 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/risk/testing/stress-test.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +LF:695 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/scheduler.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +LF:27 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/scheduler.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:765,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:769,0 +DA:770,0 +DA:771,0 +DA:772,0 +DA:773,0 +DA:774,0 +DA:775,0 +DA:776,0 +DA:777,0 +DA:778,0 +DA:779,0 +DA:780,0 +DA:781,0 +DA:782,0 +DA:783,0 +DA:784,0 +DA:785,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:795,0 +DA:796,0 +DA:797,0 +DA:798,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:803,0 +DA:804,0 +DA:805,0 +DA:806,0 +DA:807,0 +DA:808,0 +DA:809,0 +DA:810,0 +DA:811,0 +DA:812,0 +DA:813,0 +DA:814,0 +DA:815,0 +DA:816,0 +LF:816 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/controllers/scheduler.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +LF:477 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/dto/schedule-trade.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +LF:492 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/entities/scheduled-job.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +LF:272 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/jobs/maintenance.job.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:760,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:765,0 +DA:766,0 +DA:767,0 +DA:768,0 +DA:769,0 +DA:770,0 +DA:771,0 +DA:772,0 +DA:773,0 +DA:774,0 +DA:775,0 +DA:776,0 +DA:777,0 +DA:778,0 +DA:779,0 +DA:780,0 +DA:781,0 +DA:782,0 +DA:783,0 +DA:784,0 +DA:785,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:795,0 +DA:796,0 +DA:797,0 +DA:798,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:803,0 +DA:804,0 +DA:805,0 +DA:806,0 +DA:807,0 +DA:808,0 +DA:809,0 +DA:810,0 +DA:811,0 +DA:812,0 +DA:813,0 +DA:814,0 +DA:815,0 +DA:816,0 +DA:817,0 +DA:818,0 +DA:819,0 +DA:820,0 +DA:821,0 +DA:822,0 +DA:823,0 +DA:824,0 +DA:825,0 +DA:826,0 +DA:827,0 +DA:828,0 +DA:829,0 +DA:830,0 +DA:831,0 +DA:832,0 +DA:833,0 +DA:834,0 +DA:835,0 +DA:836,0 +DA:837,0 +DA:838,0 +DA:839,0 +DA:840,0 +DA:841,0 +DA:842,0 +DA:843,0 +DA:844,0 +DA:845,0 +DA:846,0 +DA:847,0 +DA:848,0 +DA:849,0 +DA:850,0 +DA:851,0 +DA:852,0 +DA:853,0 +DA:854,0 +DA:855,0 +DA:856,0 +DA:857,0 +DA:858,0 +DA:859,0 +DA:860,0 +DA:861,0 +DA:862,0 +LF:862 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/jobs/settlement.job.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:603,0 +DA:604,0 +DA:605,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:617,0 +DA:618,0 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,0 +DA:628,0 +DA:629,0 +DA:630,0 +DA:631,0 +DA:632,0 +DA:633,0 +DA:634,0 +DA:635,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:640,0 +DA:641,0 +DA:642,0 +DA:643,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:647,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:652,0 +DA:653,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:663,0 +DA:664,0 +DA:665,0 +DA:666,0 +DA:667,0 +DA:668,0 +DA:669,0 +DA:670,0 +DA:671,0 +DA:672,0 +DA:673,0 +DA:674,0 +DA:675,0 +DA:676,0 +DA:677,0 +DA:678,0 +DA:679,0 +DA:680,0 +DA:681,0 +DA:682,0 +DA:683,0 +DA:684,0 +DA:685,0 +DA:686,0 +DA:687,0 +DA:688,0 +DA:689,0 +DA:690,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:694,0 +DA:695,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:699,0 +DA:700,0 +DA:701,0 +DA:702,0 +DA:703,0 +DA:704,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:710,0 +DA:711,0 +DA:712,0 +DA:713,0 +DA:714,0 +DA:715,0 +DA:716,0 +DA:717,0 +DA:718,0 +DA:719,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:734,0 +DA:735,0 +DA:736,0 +DA:737,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:741,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:746,0 +DA:747,0 +DA:748,0 +DA:749,0 +DA:750,0 +DA:751,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +LF:755 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/jobs/trade-execution.job.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +DA:551,0 +DA:552,0 +DA:553,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:559,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:564,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +LF:598 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/scheduler/services/market-hours.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +LF:527 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/security.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +LF:105 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/security.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +LF:51 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/alerts/security-alert.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +LF:250 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/ddos/ddos-protection.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +LF:40 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/detectors/anomaly.detector.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +LF:189 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/detectors/fraud.detector.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +LF:254 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/entities/security-event.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +LF:76 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/headers/security-headers.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +LF:46 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/middleware/security.middleware.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +LF:69 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/monitoring/security-monitor.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +LF:193 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/response/incident-response.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +LF:310 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/security/waf/waf.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +LF:90 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/sentiment-analysis.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/sentiment.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +LF:88 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/aggregators/news-aggregator.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +LF:32 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/algorithms/sentiment-scorer.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +LF:65 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/correlation/market-correlation.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +LF:71 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/dto/sentiment-query.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +LF:72 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/entities/sentiment-data.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +LF:75 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/monitors/social-media.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +LF:36 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sentiment/nlp/text-processor.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +LF:119 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/settings/settings.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +LF:89 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/settings/settings.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +LF:18 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/settings/settings.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +LF:312 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/settings/dto/market-setting.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +LF:52 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/settings/dto/user-preference.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +LF:19 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/settings/entities/market-setting.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +LF:55 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/settings/entities/user-preference.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +LF:62 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/settings/validators/setting.validator.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +LF:37 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sync/sync.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +LF:29 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sync/sync.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +LF:427 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sync/entities/sync-state.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +LF:92 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sync/handlers/partition.handler.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +LF:429 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sync/optimizers/performance.optimizer.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +LF:539 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sync/recovery/recovery.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:530,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:537,0 +DA:538,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:550,0 +LF:550 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/sync/resolvers/conflict.resolver.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:417,0 +DA:418,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:464,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:484,0 +DA:485,0 +DA:486,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +LF:513 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/tracing/opentelemetry.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +LF:78 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/tracing/otel-sdk.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +LF:79 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/tracing/tracing.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +LF:26 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/tracing/analytics/trace-analytics.service.ts +FN:12,TraceAnalyticsService +FN:34,trackRequest +FN:55,getHealthReport +FNF:3 +FNH:3 +FNDA:3,TraceAnalyticsService +FNDA:1,trackRequest +FNDA:1,getHealthReport +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,3 +DA:14,3 +DA:15,3 +DA:16,3 +DA:17,3 +DA:18,3 +DA:19,3 +DA:20,3 +DA:21,3 +DA:22,3 +DA:23,3 +DA:24,3 +DA:25,3 +DA:26,3 +DA:27,3 +DA:28,3 +DA:29,3 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,0 +DA:43,0 +DA:44,1 +DA:45,1 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +LF:62 +LH:56 +BRDA:12,0,0,3 +BRDA:34,1,0,1 +BRDA:41,2,0,0 +BRDA:45,3,0,0 +BRDA:55,4,0,1 +BRF:5 +BRH:3 +end_of_record +TN: +SF:src/tracing/filters/tracing.filter.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +LF:43 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/tracing/instrumentation/custom-instrumentation.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +LF:81 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/tracing/interceptors/tracing.interceptor.ts +FN:16,TracingInterceptor +FN:18,intercept +FN:37,next +FN:58,error +FN:82,complete +FNF:5 +FNH:4 +FNDA:2,TracingInterceptor +FNDA:1,intercept +FNDA:1,next +FNDA:0,error +FNDA:1,complete +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,0 +DA:91,0 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +LF:96 +LH:72 +BRDA:16,0,0,2 +BRDA:18,1,0,1 +BRDA:24,2,0,1 +BRDA:25,3,0,1 +BRDA:30,4,0,0 +BRDA:37,5,0,1 +BRDA:82,6,0,1 +BRF:7 +BRH:6 +end_of_record +TN: +SF:src/webhooks/webhook.controller.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +LF:163 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/webhooks/webhook.service.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,0 +DA:254,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +LF:290 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/webhooks/webhooks.module.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +LF:22 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/webhooks/auth/hmac.auth.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +LF:44 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/webhooks/dto/webhook.dto.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +LF:145 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/webhooks/entities/webhook-delivery.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +LF:66 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/webhooks/entities/webhook.entity.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +LF:51 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/webhooks/filters/event.filter.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +LF:83 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record diff --git a/package-lock.json b/package-lock.json index 6482f76..02b3575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "rxjs": "^7.8.1", "simple-statistics": "^7.8.3", "typeorm": "^0.3.20", + "uuid": "^9.0.1", "xss": "^1.0.15" }, "devDependencies": { @@ -57,6 +58,7 @@ "@types/jest": "^30.0.0", "@types/node": "^22.10.7", "@types/supertest": "^6.0.2", + "@types/uuid": "^9.0.8", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-prettier": "^5.2.2", @@ -4093,6 +4095,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/validator": { "version": "13.15.10", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", @@ -12049,6 +12058,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/typeorm/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -12240,16 +12262,16 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { diff --git a/src/ai/recommendations/ab-testing.service.ts b/src/ai/recommendations/ab-testing.service.ts index 1c2324a..ec2cfed 100644 --- a/src/ai/recommendations/ab-testing.service.ts +++ b/src/ai/recommendations/ab-testing.service.ts @@ -24,7 +24,7 @@ export class AbTestingService { async analyzeTestResults(testId: string): Promise { this.logger.log(`Analyzing A/B test results for ${testId}`); - + // Statistical analysis of test results return { testId, diff --git a/src/ai/recommendations/ai-recommendations.controller.ts b/src/ai/recommendations/ai-recommendations.controller.ts index 32e20ed..b90fdf6 100644 --- a/src/ai/recommendations/ai-recommendations.controller.ts +++ b/src/ai/recommendations/ai-recommendations.controller.ts @@ -17,7 +17,10 @@ export class AiRecommendationsController { @Get() @ApiOperation({ summary: 'Get personalized recommendations for user' }) - @ApiResponse({ status: 200, description: 'Returns AI-powered recommendations' }) + @ApiResponse({ + status: 200, + description: 'Returns AI-powered recommendations', + }) async getRecommendations( @Query('userId') userId: string, @Query('asset') asset?: string, @@ -35,7 +38,9 @@ export class AiRecommendationsController { @Post(':recommendationId/accept') @ApiOperation({ summary: 'Accept a recommendation' }) @ApiResponse({ status: 200, description: 'Recommendation accepted' }) - async acceptRecommendation(@Param('recommendationId') recommendationId: string): Promise { + async acceptRecommendation( + @Param('recommendationId') recommendationId: string, + ): Promise { // Track recommendation acceptance } @@ -55,7 +60,10 @@ export class AiRecommendationsController { @Get('model/performance') @ApiOperation({ summary: 'Get ML model performance metrics' }) - @ApiResponse({ status: 200, description: 'Returns model accuracy and metrics' }) + @ApiResponse({ + status: 200, + description: 'Returns model accuracy and metrics', + }) async getModelPerformance(): Promise { return this.mlModelService.getModelPerformance(); } diff --git a/src/ai/recommendations/dto/recommendation.dto.ts b/src/ai/recommendations/dto/recommendation.dto.ts index bd51dd5..24158b9 100644 --- a/src/ai/recommendations/dto/recommendation.dto.ts +++ b/src/ai/recommendations/dto/recommendation.dto.ts @@ -1,5 +1,11 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsUUID, IsOptional, IsNumber, IsString, IsEnum } from 'class-validator'; +import { + IsUUID, + IsOptional, + IsNumber, + IsString, + IsEnum, +} from 'class-validator'; import { RecommendationType } from '../entities/recommendation.entity'; export class CreateRecommendationDto { diff --git a/src/ai/recommendations/entities/recommendation.entity.ts b/src/ai/recommendations/entities/recommendation.entity.ts index c12ff32..234ca2e 100644 --- a/src/ai/recommendations/entities/recommendation.entity.ts +++ b/src/ai/recommendations/entities/recommendation.entity.ts @@ -1,4 +1,10 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + Index, +} from 'typeorm'; export enum RecommendationType { BUY = 'buy', @@ -36,7 +42,11 @@ export class Recommendation { @Column({ type: 'float', default: 0 }) confidenceScore: number; - @Column({ type: 'enum', enum: ConfidenceLevel, default: ConfidenceLevel.MEDIUM }) + @Column({ + type: 'enum', + enum: ConfidenceLevel, + default: ConfidenceLevel.MEDIUM, + }) confidenceLevel: ConfidenceLevel; @Column('jsonb') diff --git a/src/ai/recommendations/market-pattern.service.ts b/src/ai/recommendations/market-pattern.service.ts index 9b50936..b435390 100644 --- a/src/ai/recommendations/market-pattern.service.ts +++ b/src/ai/recommendations/market-pattern.service.ts @@ -19,7 +19,8 @@ export class MarketPatternService { const patterns: MarketPattern[] = []; // Technical analysis patterns - const technicalPatterns = await this.analyzeTechnicalIndicators(assetSymbol); + const technicalPatterns = + await this.analyzeTechnicalIndicators(assetSymbol); patterns.push(...technicalPatterns); // Price action patterns @@ -33,18 +34,26 @@ export class MarketPatternService { return patterns; } - async getMarketTrend(assetSymbol: string): Promise<'bullish' | 'bearish' | 'neutral'> { + async getMarketTrend( + assetSymbol: string, + ): Promise<'bullish' | 'bearish' | 'neutral'> { const patterns = await this.detectPatterns(assetSymbol); - - const bullishCount = patterns.filter(p => p.direction === 'bullish').length; - const bearishCount = patterns.filter(p => p.direction === 'bearish').length; - + + const bullishCount = patterns.filter( + (p) => p.direction === 'bullish', + ).length; + const bearishCount = patterns.filter( + (p) => p.direction === 'bearish', + ).length; + if (bullishCount > bearishCount * 1.5) return 'bullish'; if (bearishCount > bullishCount * 1.5) return 'bearish'; return 'neutral'; } - async getSupportResistanceLevels(assetSymbol: string): Promise<{ support: number[]; resistance: number[] }> { + async getSupportResistanceLevels( + assetSymbol: string, + ): Promise<{ support: number[]; resistance: number[] }> { // Calculate support and resistance levels using historical data return { support: [95, 90, 85], // Placeholder @@ -52,7 +61,9 @@ export class MarketPatternService { }; } - private async analyzeTechnicalIndicators(assetSymbol: string): Promise { + private async analyzeTechnicalIndicators( + assetSymbol: string, + ): Promise { // Analyze RSI, MACD, Moving Averages, etc. return [ { @@ -66,7 +77,9 @@ export class MarketPatternService { ]; } - private async analyzePriceAction(assetSymbol: string): Promise { + private async analyzePriceAction( + assetSymbol: string, + ): Promise { // Detect chart patterns like head & shoulders, triangles, etc. return [ { @@ -80,14 +93,16 @@ export class MarketPatternService { ]; } - private async analyzeVolumePatterns(assetSymbol: string): Promise { + private async analyzeVolumePatterns( + assetSymbol: string, + ): Promise { // Analyze volume trends and anomalies return [ { type: 'VOLUME_SPIKE', strength: 0.8, direction: 'bullish', - confidence: 0.70, + confidence: 0.7, timeFrame: '1h', indicators: ['Volume', 'OBV'], }, diff --git a/src/ai/recommendations/ml-model.service.ts b/src/ai/recommendations/ml-model.service.ts index 9c01c43..56771a2 100644 --- a/src/ai/recommendations/ml-model.service.ts +++ b/src/ai/recommendations/ml-model.service.ts @@ -23,24 +23,28 @@ export class MlModelService { this.logger.log('Generating ML prediction'); // Feature engineering - const features = this.extractFeatures(userBehavior, marketPatterns, assetData); - + const features = this.extractFeatures( + userBehavior, + marketPatterns, + assetData, + ); + // Run inference through trained model const prediction = await this.runInference(features); - + return prediction; } async trainModel(trainingData: any[]): Promise { this.logger.log('Training ML model'); - + // Implement model training pipeline // - Data preprocessing // - Feature extraction // - Model training // - Validation // - Deployment - + // Placeholder for actual training logic } @@ -67,35 +71,37 @@ export class MlModelService { private calculateMarketSentiment(patterns: MarketPattern[]): number { if (patterns.length === 0) return 0; - + const sentimentMap = { bullish: 1, neutral: 0, bearish: -1 }; const weightedSum = patterns.reduce((sum, p) => { - return sum + (sentimentMap[p.direction] * p.confidence * p.strength); + return sum + sentimentMap[p.direction] * p.confidence * p.strength; }, 0); - + return weightedSum / patterns.length; } private calculateTechnicalScore(patterns: MarketPattern[]): number { if (patterns.length === 0) return 0.5; - - const avgConfidence = patterns.reduce((sum, p) => sum + p.confidence, 0) / patterns.length; - const avgStrength = patterns.reduce((sum, p) => sum + p.strength, 0) / patterns.length; - + + const avgConfidence = + patterns.reduce((sum, p) => sum + p.confidence, 0) / patterns.length; + const avgStrength = + patterns.reduce((sum, p) => sum + p.strength, 0) / patterns.length; + return (avgConfidence + avgStrength) / 2; } private async runInference(features: any): Promise { // Placeholder for actual ML inference // In production, use trained model to generate predictions - + const baseConfidence = 0.75; const expectedReturn = (Math.random() - 0.3) * 0.2; // -6% to +14% - + let action: 'buy' | 'sell' | 'hold' = 'hold'; if (expectedReturn > 0.05) action = 'buy'; else if (expectedReturn < -0.05) action = 'sell'; - + return { action, confidence: baseConfidence, @@ -105,7 +111,11 @@ export class MlModelService { }; } - getModelPerformance(): { accuracy: number; precision: number; recall: number } { + getModelPerformance(): { + accuracy: number; + precision: number; + recall: number; + } { // Return model performance metrics return { accuracy: 0.78, // Target: >75% diff --git a/src/ai/recommendations/recommendation-engine.service.ts b/src/ai/recommendations/recommendation-engine.service.ts index 10d94fa..1a4442a 100644 --- a/src/ai/recommendations/recommendation-engine.service.ts +++ b/src/ai/recommendations/recommendation-engine.service.ts @@ -2,7 +2,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { UserBehaviorService } from './user-behavior.service'; import { MarketPatternService } from './market-pattern.service'; import { MlModelService } from './ml-model.service'; -import { Recommendation, RecommendationType, ConfidenceLevel } from '../entities/recommendation.entity'; +import { + Recommendation, + RecommendationType, + ConfidenceLevel, +} from '../entities/recommendation.entity'; @Injectable() export class RecommendationEngineService { @@ -14,22 +18,32 @@ export class RecommendationEngineService { private readonly mlModelService: MlModelService, ) {} - async generateRecommendations(userId: string, assetSymbol?: string): Promise[]> { + async generateRecommendations( + userId: string, + assetSymbol?: string, + ): Promise[]> { this.logger.log(`Generating recommendations for user ${userId}`); // Get user behavior profile - const userBehavior = await this.userBehaviorService.analyzeUserBehavior(userId); - + const userBehavior = + await this.userBehaviorService.analyzeUserBehavior(userId); + // Get market patterns - const marketPatterns = assetSymbol + const marketPatterns = assetSymbol ? await this.marketPatternService.detectPatterns(assetSymbol) : await this.getBroadMarketPatterns(); // Generate ML predictions - const predictions = await this.generatePredictions(userBehavior, marketPatterns, assetSymbol); - + const predictions = await this.generatePredictions( + userBehavior, + marketPatterns, + assetSymbol, + ); + // Convert predictions to recommendations - return predictions.map(prediction => this.createRecommendation(userId, prediction, userBehavior)); + return predictions.map((prediction) => + this.createRecommendation(userId, prediction, userBehavior), + ); } private async generatePredictions( @@ -39,19 +53,27 @@ export class RecommendationEngineService { ): Promise { if (assetSymbol) { const assetData = await this.getAssetData(assetSymbol); - const prediction = await this.mlModelService.predict(userBehavior, marketPatterns, assetData); + const prediction = await this.mlModelService.predict( + userBehavior, + marketPatterns, + assetData, + ); return [{ assetSymbol, ...prediction }]; } else { // Generate recommendations for multiple assets const topAssets = ['ENERGY', 'SOLAR', 'WIND', 'GRID']; const predictions = []; - + for (const asset of topAssets) { const assetData = await this.getAssetData(asset); - const prediction = await this.mlModelService.predict(userBehavior, marketPatterns, assetData); + const prediction = await this.mlModelService.predict( + userBehavior, + marketPatterns, + assetData, + ); predictions.push({ assetSymbol: asset, ...prediction }); } - + return predictions; } } @@ -63,7 +85,7 @@ export class RecommendationEngineService { ): Partial { const type = this.mapActionToRecommendationType(prediction.action); const confidenceLevel = this.mapConfidenceToLevel(prediction.confidence); - + return { userId, type, @@ -85,9 +107,12 @@ export class RecommendationEngineService { private mapActionToRecommendationType(action: string): RecommendationType { switch (action) { - case 'buy': return RecommendationType.BUY; - case 'sell': return RecommendationType.SELL; - default: return RecommendationType.HOLD; + case 'buy': + return RecommendationType.BUY; + case 'sell': + return RecommendationType.SELL; + default: + return RecommendationType.HOLD; } } @@ -106,13 +131,18 @@ export class RecommendationEngineService { `Risk level: ${(prediction.riskLevel * 100).toFixed(0)}%`, `Matches your ${userBehavior.tradingStyle} trading style`, ]; - + return reasons.join('. '); } private async getBroadMarketPatterns(): Promise { return [ - { type: 'MARKET_UPTREND', strength: 0.7, direction: 'bullish' as const, confidence: 0.75 }, + { + type: 'MARKET_UPTREND', + strength: 0.7, + direction: 'bullish' as const, + confidence: 0.75, + }, ]; } diff --git a/src/ai/recommendations/user-behavior.service.ts b/src/ai/recommendations/user-behavior.service.ts index 5e70566..1cf2924 100644 --- a/src/ai/recommendations/user-behavior.service.ts +++ b/src/ai/recommendations/user-behavior.service.ts @@ -1,7 +1,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { Recommendation, RecommendationType, ConfidenceLevel } from '../entities/recommendation.entity'; +import { + Recommendation, + RecommendationType, + ConfidenceLevel, +} from '../entities/recommendation.entity'; export interface UserBehaviorProfile { riskTolerance: number; // 0-1 @@ -30,7 +34,7 @@ export class UserBehaviorService { // In production, query actual trading history and user data const tradingHistory = await this.getUserTradingHistory(userId); - + return { riskTolerance: this.calculateRiskTolerance(tradingHistory), tradingFrequency: this.determineTradingFrequency(tradingHistory), @@ -65,8 +69,10 @@ export class UserBehaviorService { recommendation.outcome = outcome; recommendation.actualReturn = actualReturn || 0; await this.recommendationRepo.save(recommendation); - - this.logger.log(`Tracked outcome for recommendation ${recommendationId}: ${outcome}`); + + this.logger.log( + `Tracked outcome for recommendation ${recommendationId}: ${outcome}`, + ); } } @@ -78,13 +84,15 @@ export class UserBehaviorService { private calculateRiskTolerance(tradingHistory: any[]): number { // Analyze historical trades to determine risk tolerance // Consider factors like: asset volatility, position sizing, stop-loss usage, leverage usage - + return 0.6; // Placeholder } - private determineTradingFrequency(tradingHistory: any[]): 'low' | 'medium' | 'high' { + private determineTradingFrequency( + tradingHistory: any[], + ): 'low' | 'medium' | 'high' { const tradesPerMonth = tradingHistory.length / 12; // Assuming 1 year of data - + if (tradesPerMonth < 5) return 'low'; if (tradesPerMonth < 20) return 'medium'; return 'high'; @@ -92,10 +100,13 @@ export class UserBehaviorService { private getPreferredAssets(tradingHistory: any[]): string[] { // Extract most frequently traded assets - const assetCounts = tradingHistory.reduce((acc, trade) => { - acc[trade.asset] = (acc[trade.asset] || 0) + 1; - return acc; - }, {} as Record); + const assetCounts = tradingHistory.reduce( + (acc, trade) => { + acc[trade.asset] = (acc[trade.asset] || 0) + 1; + return acc; + }, + {} as Record, + ); return Object.entries(assetCounts) .sort((a, b) => b[1] - a[1]) @@ -105,32 +116,41 @@ export class UserBehaviorService { private calculateAverageTradeSize(tradingHistory: any[]): number { if (tradingHistory.length === 0) return 0; - - const totalSize = tradingHistory.reduce((sum, trade) => sum + trade.size, 0); + + const totalSize = tradingHistory.reduce( + (sum, trade) => sum + trade.size, + 0, + ); return totalSize / tradingHistory.length; } private calculateSuccessRate(tradingHistory: any[]): number { if (tradingHistory.length === 0) return 0.5; - - const profitableTrades = tradingHistory.filter(t => t.profit > 0).length; + + const profitableTrades = tradingHistory.filter((t) => t.profit > 0).length; return profitableTrades / tradingHistory.length; } - private determineTradingStyle(tradingHistory: any[]): 'conservative' | 'moderate' | 'aggressive' { + private determineTradingStyle( + tradingHistory: any[], + ): 'conservative' | 'moderate' | 'aggressive' { const riskMetrics = this.calculateRiskMetrics(tradingHistory); - + if (riskMetrics.avgVolatility < 0.15) return 'conservative'; - if (riskMetrics.avgVolatility < 0.30) return 'moderate'; + if (riskMetrics.avgVolatility < 0.3) return 'moderate'; return 'aggressive'; } - private calculateRiskMetrics(tradingHistory: any[]): { avgVolatility: number } { + private calculateRiskMetrics(tradingHistory: any[]): { + avgVolatility: number; + } { // Calculate portfolio volatility and other risk metrics return { avgVolatility: 0.25 }; // Placeholder } - private async getActivityPattern(userId: string): Promise { + private async getActivityPattern( + userId: string, + ): Promise { // Analyze when user is most active return { mostActiveHours: [9, 10, 14, 15], // 9-10 AM, 2-3 PM diff --git a/src/analytics/analytics.module.ts b/src/analytics/analytics.module.ts index 8009d8f..a252f13 100644 --- a/src/analytics/analytics.module.ts +++ b/src/analytics/analytics.module.ts @@ -8,9 +8,7 @@ import { UserPerformanceReport } from './reports/user-performance.report'; import { MarketEfficiencyReport } from './reports/market-efficiency.report'; @Module({ - imports: [ - TypeOrmModule.forFeature([AnalyticsData]) - ], + imports: [TypeOrmModule.forFeature([AnalyticsData])], providers: [ AnalyticsService, TradingVolumeReport, diff --git a/src/analytics/analytics.service.spec.ts b/src/analytics/analytics.service.spec.ts index 714a14d..3886e46 100644 --- a/src/analytics/analytics.service.spec.ts +++ b/src/analytics/analytics.service.spec.ts @@ -2,7 +2,11 @@ import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { AnalyticsService } from './analytics.service'; -import { AnalyticsData, AnalyticsType, AggregationPeriod } from './entities/analytics-data.entity'; +import { + AnalyticsData, + AnalyticsType, + AggregationPeriod, +} from './entities/analytics-data.entity'; import { ReportParamsDto } from './dto/report-params.dto'; import { TradingVolumeReport } from './reports/trading-volume.report'; import { PriceTrendsReport } from './reports/price-trends.report'; @@ -68,11 +72,17 @@ describe('AnalyticsService', () => { }).compile(); service = module.get(AnalyticsService); - repository = module.get>(getRepositoryToken(AnalyticsData)); + repository = module.get>( + getRepositoryToken(AnalyticsData), + ); tradingVolumeReport = module.get(TradingVolumeReport); priceTrendsReport = module.get(PriceTrendsReport); - userPerformanceReport = module.get(UserPerformanceReport); - marketEfficiencyReport = module.get(MarketEfficiencyReport); + userPerformanceReport = module.get( + UserPerformanceReport, + ); + marketEfficiencyReport = module.get( + MarketEfficiencyReport, + ); }); it('should be defined', () => { @@ -109,7 +119,9 @@ describe('AnalyticsService', () => { const result = await service.generateTradingVolumeReport(params); expect(result).toEqual(expectedReport); - expect(mockTradingVolumeReport.generateReport).toHaveBeenCalledWith(params); + expect(mockTradingVolumeReport.generateReport).toHaveBeenCalledWith( + params, + ); }); }); @@ -131,8 +143,8 @@ describe('AnalyticsService', () => { priceChange: 2.15, priceChangePercent: 4.47, volatility: 0.15, - averagePrice: 48.50, - highestPrice: 52.00, + averagePrice: 48.5, + highestPrice: 52.0, lowestPrice: 45.75, trend: 'BULLISH', }, @@ -182,12 +194,16 @@ describe('AnalyticsService', () => { historicalData: [], }; - mockUserPerformanceReport.generateReport.mockResolvedValue(expectedReport); + mockUserPerformanceReport.generateReport.mockResolvedValue( + expectedReport, + ); const result = await service.generateUserPerformanceReport(params); expect(result).toEqual(expectedReport); - expect(mockUserPerformanceReport.generateReport).toHaveBeenCalledWith(params); + expect(mockUserPerformanceReport.generateReport).toHaveBeenCalledWith( + params, + ); }); }); @@ -215,12 +231,16 @@ describe('AnalyticsService', () => { metrics: [], }; - mockMarketEfficiencyReport.generateReport.mockResolvedValue(expectedReport); + mockMarketEfficiencyReport.generateReport.mockResolvedValue( + expectedReport, + ); const result = await service.generateMarketEfficiencyReport(params); expect(result).toEqual(expectedReport); - expect(mockMarketEfficiencyReport.generateReport).toHaveBeenCalledWith(params); + expect(mockMarketEfficiencyReport.generateReport).toHaveBeenCalledWith( + params, + ); }); }); @@ -275,7 +295,9 @@ describe('AnalyticsService', () => { it('should throw error for unsupported format', async () => { const reportData = { summary: { totalVolume: 1000 } }; - await expect(service.exportReport(reportData, 'xml' as any)).rejects.toThrow('Unsupported format: xml'); + await expect( + service.exportReport(reportData, 'xml' as any), + ).rejects.toThrow('Unsupported format: xml'); }); }); }); diff --git a/src/analytics/analytics.service.ts b/src/analytics/analytics.service.ts index 3318817..a249d53 100644 --- a/src/analytics/analytics.service.ts +++ b/src/analytics/analytics.service.ts @@ -1,7 +1,11 @@ import { Injectable, BadRequestException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, Between } from 'typeorm'; -import { AnalyticsData, AnalyticsType, AggregationPeriod } from './entities/analytics-data.entity'; +import { + AnalyticsData, + AnalyticsType, + AggregationPeriod, +} from './entities/analytics-data.entity'; import { ReportParamsDto, DashboardMetricsDto } from './dto/report-params.dto'; import { TradingVolumeReport } from './reports/trading-volume.report'; import { PriceTrendsReport } from './reports/price-trends.report'; @@ -59,7 +63,7 @@ export class AnalyticsService { period: { start: startDate, end: endDate, - timeWindowHours: timeWindow + timeWindowHours: timeWindow, }, summary: { totalVolume: 0, @@ -67,8 +71,8 @@ export class AnalyticsService { totalTransactions: 0, averagePrice: 0, renewableEnergyPercentage: 0, - marketEfficiencyScore: 0 - } + marketEfficiencyScore: 0, + }, }; // Get trading volume metrics @@ -80,19 +84,28 @@ export class AnalyticsService { // Get renewable energy percentage if (params.includeRenewableMetrics) { - const renewableMetrics = await this.getRenewableEnergyMetrics(startDate, endDate); + const renewableMetrics = await this.getRenewableEnergyMetrics( + startDate, + endDate, + ); metrics.summary.renewableEnergyPercentage = renewableMetrics.percentage; } // Get market efficiency if (params.includeMarketEfficiency) { - const efficiencyMetrics = await this.getMarketEfficiencyMetrics(startDate, endDate); + const efficiencyMetrics = await this.getMarketEfficiencyMetrics( + startDate, + endDate, + ); metrics.summary.marketEfficiencyScore = efficiencyMetrics.score; } // Get geographic breakdown if (params.includeGeographicBreakdown) { - metrics.geographicBreakdown = await this.getGeographicBreakdown(startDate, endDate); + metrics.geographicBreakdown = await this.getGeographicBreakdown( + startDate, + endDate, + ); } // Get top performers @@ -107,7 +120,9 @@ export class AnalyticsService { /** * Store analytics data */ - async storeAnalyticsData(data: Partial): Promise { + async storeAnalyticsData( + data: Partial, + ): Promise { const analyticsData = this.analyticsRepository.create(data); return this.analyticsRepository.save(analyticsData); } @@ -122,7 +137,7 @@ export class AnalyticsService { endDate?: Date, userId?: string, gridZoneId?: string, - country?: string + country?: string, ): Promise { const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') @@ -130,10 +145,13 @@ export class AnalyticsService { .andWhere('analytics.period = :period', { period }); if (startDate && endDate) { - queryBuilder.andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { - startDate, - endDate - }); + queryBuilder.andWhere( + 'analytics.timestamp BETWEEN :startDate AND :endDate', + { + startDate, + endDate, + }, + ); } if (userId) { @@ -141,7 +159,9 @@ export class AnalyticsService { } if (gridZoneId) { - queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { gridZoneId }); + queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { + gridZoneId, + }); } if (country) { @@ -156,17 +176,20 @@ export class AnalyticsService { /** * Export report to different formats */ - async exportReport(reportData: any, format: 'json' | 'csv' | 'pdf'): Promise { + async exportReport( + reportData: any, + format: 'json' | 'csv' | 'pdf', + ): Promise { switch (format) { case 'json': return JSON.stringify(reportData, null, 2); - + case 'csv': return this.convertToCSV(reportData); - + case 'pdf': return this.convertToPDF(reportData); - + default: throw new BadRequestException(`Unsupported format: ${format}`); } @@ -179,7 +202,7 @@ export class AnalyticsService { reportType: AnalyticsType, schedule: string, // Cron expression recipients: string[], - params: ReportParamsDto + params: ReportParamsDto, ): Promise { // This would integrate with a job scheduler like Bull Queue // For now, we'll just log the scheduling request @@ -198,7 +221,7 @@ export class AnalyticsService { .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .getRawOne(); @@ -206,7 +229,7 @@ export class AnalyticsService { totalVolume: parseInt(result?.totalVolume || '0'), totalValue: parseFloat(result?.totalValue || '0'), totalTransactions: parseInt(result?.totalTransactions || '0'), - averagePrice: parseFloat(result?.averagePrice || '0') + averagePrice: parseFloat(result?.averagePrice || '0'), }; } @@ -217,7 +240,7 @@ export class AnalyticsService { .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }); const renewableVolumeQuery = this.analyticsRepository @@ -226,37 +249,41 @@ export class AnalyticsService { .where('analytics.type = :type', { type: AnalyticsType.RENEWABLE_ENERGY }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }); const [totalVolumeResult, renewableVolumeResult] = await Promise.all([ totalVolumeQuery.getRawOne(), - renewableVolumeQuery.getRawOne() + renewableVolumeQuery.getRawOne(), ]); const totalVolume = parseInt(totalVolumeResult?.totalVolume || '0'); - const renewableVolume = parseInt(renewableVolumeResult?.renewableVolume || '0'); + const renewableVolume = parseInt( + renewableVolumeResult?.renewableVolume || '0', + ); return { totalVolume, renewableVolume, - percentage: totalVolume > 0 ? (renewableVolume / totalVolume) * 100 : 0 + percentage: totalVolume > 0 ? (renewableVolume / totalVolume) * 100 : 0, }; } private async getMarketEfficiencyMetrics(startDate: Date, endDate: Date) { const result = await this.analyticsRepository .createQueryBuilder('analytics') - .select('AVG(analytics.data->>\'priceEfficiency\')', 'efficiency') - .where('analytics.type = :type', { type: AnalyticsType.MARKET_EFFICIENCY }) + .select("AVG(analytics.data->>'priceEfficiency')", 'efficiency') + .where('analytics.type = :type', { + type: AnalyticsType.MARKET_EFFICIENCY, + }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .getRawOne(); return { - score: parseFloat(result?.efficiency || '0') * 100 + score: parseFloat(result?.efficiency || '0') * 100, }; } @@ -269,7 +296,7 @@ export class AnalyticsService { .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .andWhere('analytics.country IS NOT NULL') .groupBy('analytics.country') @@ -278,20 +305,24 @@ export class AnalyticsService { .getRawMany(); } - private async getTopPerformers(startDate: Date, endDate: Date, limit: number) { + private async getTopPerformers( + startDate: Date, + endDate: Date, + limit: number, + ) { return this.analyticsRepository .createQueryBuilder('analytics') .select('analytics.userId', 'userId') - .addSelect('SUM(analytics.data->>\'profitLoss\')', 'totalProfitLoss') + .addSelect("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss') .addSelect('COUNT(analytics.id)', 'tradeCount') .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .andWhere('analytics.userId IS NOT NULL') .groupBy('analytics.userId') - .orderBy('SUM(analytics.data->>\'profitLoss\')', 'DESC') + .orderBy("SUM(analytics.data->>'profitLoss')", 'DESC') .limit(limit) .getRawMany(); } @@ -300,22 +331,24 @@ export class AnalyticsService { const hourlyData = await this.analyticsRepository .createQueryBuilder('analytics') .select('analytics.timestamp', 'timestamp') - .addSelect('analytics.data->>\'price\'', 'price') + .addSelect("analytics.data->>'price'", 'price') .addSelect('analytics.count', 'volume') .where('analytics.type = :type', { type: AnalyticsType.PRICE_TREND }) - .andWhere('analytics.period = :period', { period: AggregationPeriod.HOURLY }) + .andWhere('analytics.period = :period', { + period: AggregationPeriod.HOURLY, + }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .orderBy('analytics.timestamp', 'ASC') .limit(24) // Last 24 hours .getRawMany(); - return hourlyData.map(item => ({ + return hourlyData.map((item) => ({ timestamp: item.timestamp, price: parseFloat(item.price || '0'), - volume: parseInt(item.volume || '0') + volume: parseInt(item.volume || '0'), })); } diff --git a/src/analytics/dto/report-params.dto.ts b/src/analytics/dto/report-params.dto.ts index b497650..6cfb556 100644 --- a/src/analytics/dto/report-params.dto.ts +++ b/src/analytics/dto/report-params.dto.ts @@ -1,18 +1,29 @@ -import { IsOptional, IsString, IsEnum, IsDate, IsNumber, Min, Max } from 'class-validator'; +import { + IsOptional, + IsString, + IsEnum, + IsDate, + IsNumber, + Min, + Max, +} from 'class-validator'; import { Type } from 'class-transformer'; import { ApiPropertyOptional } from '@nestjs/swagger'; -import { AnalyticsType, AggregationPeriod } from '../entities/analytics-data.entity'; +import { + AnalyticsType, + AggregationPeriod, +} from '../entities/analytics-data.entity'; export enum ReportFormat { JSON = 'json', CSV = 'csv', - PDF = 'pdf' + PDF = 'pdf', } export class ReportParamsDto { @ApiPropertyOptional({ description: 'Type of analytics report', - enum: AnalyticsType + enum: AnalyticsType, }) @IsOptional() @IsEnum(AnalyticsType) @@ -20,7 +31,7 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'Aggregation period for the data', - enum: AggregationPeriod + enum: AggregationPeriod, }) @IsOptional() @IsEnum(AggregationPeriod) @@ -29,7 +40,7 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'Start date for the report period', type: Date, - example: '2024-01-01' + example: '2024-01-01', }) @IsOptional() @IsDate() @@ -39,7 +50,7 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'End date for the report period', type: Date, - example: '2024-12-31' + example: '2024-12-31', }) @IsOptional() @IsDate() @@ -48,7 +59,7 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'User ID to filter data for specific user', - example: 'user-123' + example: 'user-123', }) @IsOptional() @IsString() @@ -56,7 +67,7 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'Grid zone ID to filter data for specific zone', - example: 'zone-456' + example: 'zone-456', }) @IsOptional() @IsString() @@ -64,7 +75,7 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'Country to filter data', - example: 'United States' + example: 'United States', }) @IsOptional() @IsString() @@ -73,7 +84,7 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'Report output format', enum: ReportFormat, - default: ReportFormat.JSON + default: ReportFormat.JSON, }) @IsOptional() @IsEnum(ReportFormat) @@ -81,14 +92,14 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'Include technical indicators in price trend reports', - default: true + default: true, }) @IsOptional() includeTechnicalIndicators?: boolean = true; @ApiPropertyOptional({ description: 'Include comparative analysis', - default: true + default: true, }) @IsOptional() includeComparativeAnalysis?: boolean = true; @@ -97,7 +108,7 @@ export class ReportParamsDto { description: 'Number of top performers to include in leaderboards', example: 10, minimum: 1, - maximum: 100 + maximum: 100, }) @IsOptional() @Type(() => Number) @@ -108,7 +119,7 @@ export class ReportParamsDto { @ApiPropertyOptional({ description: 'Enable real-time data refresh', - default: false + default: false, }) @IsOptional() realTime?: boolean = false; @@ -119,7 +130,7 @@ export class DashboardMetricsDto { description: 'Time window for dashboard metrics (in hours)', example: 24, minimum: 1, - maximum: 8760 + maximum: 8760, }) @IsOptional() @Type(() => Number) @@ -130,21 +141,21 @@ export class DashboardMetricsDto { @ApiPropertyOptional({ description: 'Include geographic breakdown', - default: true + default: true, }) @IsOptional() includeGeographicBreakdown?: boolean = true; @ApiPropertyOptional({ description: 'Include renewable energy metrics', - default: true + default: true, }) @IsOptional() includeRenewableMetrics?: boolean = true; @ApiPropertyOptional({ description: 'Include market efficiency indicators', - default: true + default: true, }) @IsOptional() includeMarketEfficiency?: boolean = true; diff --git a/src/analytics/entities/analytics-data.entity.ts b/src/analytics/entities/analytics-data.entity.ts index 1041251..72e707c 100644 --- a/src/analytics/entities/analytics-data.entity.ts +++ b/src/analytics/entities/analytics-data.entity.ts @@ -1,4 +1,11 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, +} from 'typeorm'; export enum AnalyticsType { TRADING_VOLUME = 'trading_volume', @@ -6,7 +13,7 @@ export enum AnalyticsType { USER_PERFORMANCE = 'user_performance', MARKET_EFFICIENCY = 'market_efficiency', GEOGRAPHIC_PATTERN = 'geographic_pattern', - RENEWABLE_ENERGY = 'renewable_energy' + RENEWABLE_ENERGY = 'renewable_energy', } export enum AggregationPeriod { @@ -15,7 +22,7 @@ export enum AggregationPeriod { WEEKLY = 'weekly', MONTHLY = 'monthly', QUARTERLY = 'quarterly', - YEARLY = 'yearly' + YEARLY = 'yearly', } @Entity('analytics_data') @@ -28,13 +35,13 @@ export class AnalyticsData { @Column({ type: 'enum', - enum: AnalyticsType + enum: AnalyticsType, }) type: AnalyticsType; @Column({ type: 'enum', - enum: AggregationPeriod + enum: AggregationPeriod, }) period: AggregationPeriod; diff --git a/src/analytics/reports/market-efficiency.report.ts b/src/analytics/reports/market-efficiency.report.ts index 338d01c..36563c9 100644 --- a/src/analytics/reports/market-efficiency.report.ts +++ b/src/analytics/reports/market-efficiency.report.ts @@ -1,7 +1,11 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { AnalyticsData, AnalyticsType, AggregationPeriod } from '../entities/analytics-data.entity'; +import { + AnalyticsData, + AnalyticsType, + AggregationPeriod, +} from '../entities/analytics-data.entity'; import { ReportParamsDto } from '../dto/report-params.dto'; export interface MarketEfficiencyMetrics { @@ -55,13 +59,21 @@ export class MarketEfficiencyReport { private analyticsRepository: Repository, ) {} - async generateReport(params: ReportParamsDto): Promise { - const startDate = params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago + async generateReport( + params: ReportParamsDto, + ): Promise { + const startDate = + params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago const endDate = params.endDate || new Date(); const period = params.period || AggregationPeriod.DAILY; // Fetch market efficiency data - const metrics = await this.fetchMarketEfficiencyData(startDate, endDate, period, params); + const metrics = await this.fetchMarketEfficiencyData( + startDate, + endDate, + period, + params, + ); // Calculate summary statistics const summary = this.calculateSummary(metrics); @@ -72,7 +84,11 @@ export class MarketEfficiencyReport { : undefined; // Get time-based analysis - const timeAnalysis = await this.getTimeBasedAnalysis(startDate, endDate, params); + const timeAnalysis = await this.getTimeBasedAnalysis( + startDate, + endDate, + params, + ); // Generate recommendations const recommendations = this.generateRecommendations(summary); @@ -81,13 +97,13 @@ export class MarketEfficiencyReport { period: { start: startDate, end: endDate, - aggregation: period + aggregation: period, }, summary, metrics, geographicComparison, timeAnalysis, - recommendations + recommendations, }; } @@ -95,30 +111,36 @@ export class MarketEfficiencyReport { startDate: Date, endDate: Date, period: AggregationPeriod, - params: ReportParamsDto + params: ReportParamsDto, ): Promise { const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') - .where('analytics.type = :type', { type: AnalyticsType.MARKET_EFFICIENCY }) + .where('analytics.type = :type', { + type: AnalyticsType.MARKET_EFFICIENCY, + }) .andWhere('analytics.period = :period', { period }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }); if (params.gridZoneId) { - queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { gridZoneId: params.gridZoneId }); + queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { + gridZoneId: params.gridZoneId, + }); } if (params.country) { - queryBuilder.andWhere('analytics.country = :country', { country: params.country }); + queryBuilder.andWhere('analytics.country = :country', { + country: params.country, + }); } queryBuilder.orderBy('analytics.timestamp', 'ASC'); const analyticsData = await queryBuilder.getMany(); - return analyticsData.map(data => { + return analyticsData.map((data) => { const efficiencyData = data.data as any; return { timestamp: data.timestamp, @@ -130,7 +152,9 @@ export class MarketEfficiencyReport { priceEfficiency: parseFloat(efficiencyData.priceEfficiency || '0'), volumeWeightedAveragePrice: parseFloat(efficiencyData.vwap || '0'), tradingVelocity: parseFloat(efficiencyData.tradingVelocity || '0'), - orderBookImbalance: parseFloat(efficiencyData.orderBookImbalance || '0') + orderBookImbalance: parseFloat( + efficiencyData.orderBookImbalance || '0', + ), }; }); } @@ -143,25 +167,32 @@ export class MarketEfficiencyReport { averageLiquidity: 0, marketEfficiencyScore: 0, priceDiscoveryEfficiency: 0, - informationAsymmetry: 0 + informationAsymmetry: 0, }; } - const averageSpread = metrics.reduce((sum, m) => sum + m.bidAskSpread, 0) / metrics.length; - const averageVolatility = metrics.reduce((sum, m) => sum + m.volatility, 0) / metrics.length; - const averageLiquidity = metrics.reduce((sum, m) => sum + m.liquidity, 0) / metrics.length; - const averagePriceEfficiency = metrics.reduce((sum, m) => sum + m.priceEfficiency, 0) / metrics.length; + const averageSpread = + metrics.reduce((sum, m) => sum + m.bidAskSpread, 0) / metrics.length; + const averageVolatility = + metrics.reduce((sum, m) => sum + m.volatility, 0) / metrics.length; + const averageLiquidity = + metrics.reduce((sum, m) => sum + m.liquidity, 0) / metrics.length; + const averagePriceEfficiency = + metrics.reduce((sum, m) => sum + m.priceEfficiency, 0) / metrics.length; // Calculate market efficiency score (0-100) - const spreadScore = Math.max(0, 100 - (averageSpread * 1000)); // Lower spread is better - const volatilityScore = Math.max(0, 100 - (averageVolatility * 100)); // Lower volatility is better + const spreadScore = Math.max(0, 100 - averageSpread * 1000); // Lower spread is better + const volatilityScore = Math.max(0, 100 - averageVolatility * 100); // Lower volatility is better const liquidityScore = Math.min(100, averageLiquidity * 10); // Higher liquidity is better const priceEfficiencyScore = averagePriceEfficiency * 100; - const marketEfficiencyScore = (spreadScore + volatilityScore + liquidityScore + priceEfficiencyScore) / 4; + const marketEfficiencyScore = + (spreadScore + volatilityScore + liquidityScore + priceEfficiencyScore) / + 4; // Price discovery efficiency (how quickly prices reflect new information) - const priceDiscoveryEfficiency = this.calculatePriceDiscoveryEfficiency(metrics); + const priceDiscoveryEfficiency = + this.calculatePriceDiscoveryEfficiency(metrics); // Information asymmetry (inverse of price efficiency) const informationAsymmetry = Math.max(0, 100 - priceDiscoveryEfficiency); @@ -172,11 +203,13 @@ export class MarketEfficiencyReport { averageLiquidity, marketEfficiencyScore, priceDiscoveryEfficiency, - informationAsymmetry + informationAsymmetry, }; } - private calculatePriceDiscoveryEfficiency(metrics: MarketEfficiencyMetrics[]): number { + private calculatePriceDiscoveryEfficiency( + metrics: MarketEfficiencyMetrics[], + ): number { if (metrics.length < 2) return 0; // Calculate price efficiency based on how quickly prices converge @@ -184,7 +217,7 @@ export class MarketEfficiencyReport { for (let i = 1; i < metrics.length; i++) { const currentEfficiency = metrics[i].priceEfficiency; const previousEfficiency = metrics[i - 1].priceEfficiency; - + // Higher efficiency when prices are stable and reflect information quickly const convergenceRate = Math.abs(currentEfficiency - previousEfficiency); totalEfficiency += Math.max(0, 1 - convergenceRate); @@ -196,49 +229,58 @@ export class MarketEfficiencyReport { private async getGeographicComparison( startDate: Date, endDate: Date, - params: ReportParamsDto + params: ReportParamsDto, ) { const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') .select('analytics.country', 'country') - .addSelect('AVG(analytics.data->>\'bidAskSpread\')', 'spread') - .addSelect('AVG(analytics.data->>\'volatility\')', 'volatility') - .addSelect('AVG(analytics.data->>\'liquidity\')', 'liquidity') - .addSelect('AVG(analytics.data->>\'priceEfficiency\')', 'priceEfficiency') - .where('analytics.type = :type', { type: AnalyticsType.MARKET_EFFICIENCY }) + .addSelect("AVG(analytics.data->>'bidAskSpread')", 'spread') + .addSelect("AVG(analytics.data->>'volatility')", 'volatility') + .addSelect("AVG(analytics.data->>'liquidity')", 'liquidity') + .addSelect("AVG(analytics.data->>'priceEfficiency')", 'priceEfficiency') + .where('analytics.type = :type', { + type: AnalyticsType.MARKET_EFFICIENCY, + }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .andWhere('analytics.country IS NOT NULL') .groupBy('analytics.country'); if (params.gridZoneId) { - queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { gridZoneId: params.gridZoneId }); + queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { + gridZoneId: params.gridZoneId, + }); } const results = await queryBuilder.getRawMany(); - return results.map(result => { + return results.map((result) => { const spread = parseFloat(result.spread || '0'); const volatility = parseFloat(result.volatility || '0'); const liquidity = parseFloat(result.liquidity || '0'); const priceEfficiency = parseFloat(result.priceEfficiency || '0'); // Calculate efficiency score for each region - const spreadScore = Math.max(0, 100 - (spread * 1000)); - const volatilityScore = Math.max(0, 100 - (volatility * 100)); + const spreadScore = Math.max(0, 100 - spread * 1000); + const volatilityScore = Math.max(0, 100 - volatility * 100); const liquidityScore = Math.min(100, liquidity * 10); const priceEfficiencyScore = priceEfficiency * 100; - const efficiencyScore = (spreadScore + volatilityScore + liquidityScore + priceEfficiencyScore) / 4; + const efficiencyScore = + (spreadScore + + volatilityScore + + liquidityScore + + priceEfficiencyScore) / + 4; return { country: result.country, efficiencyScore, spread, volatility, - liquidity + liquidity, }; }); } @@ -246,38 +288,44 @@ export class MarketEfficiencyReport { private async getTimeBasedAnalysis( startDate: Date, endDate: Date, - params: ReportParamsDto + params: ReportParamsDto, ) { // Get hourly efficiency patterns const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') .select('EXTRACT(HOUR FROM analytics.timestamp)', 'hour') - .addSelect('AVG(analytics.data->>\'priceEfficiency\')', 'efficiencyScore') - .addSelect('AVG(analytics.data->>\'volatility\')', 'volatility') + .addSelect("AVG(analytics.data->>'priceEfficiency')", 'efficiencyScore') + .addSelect("AVG(analytics.data->>'volatility')", 'volatility') .addSelect('SUM(analytics.count)', 'volume') - .where('analytics.type = :type', { type: AnalyticsType.MARKET_EFFICIENCY }) + .where('analytics.type = :type', { + type: AnalyticsType.MARKET_EFFICIENCY, + }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .groupBy('EXTRACT(HOUR FROM analytics.timestamp)') .orderBy('hour', 'ASC'); if (params.gridZoneId) { - queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { gridZoneId: params.gridZoneId }); + queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { + gridZoneId: params.gridZoneId, + }); } if (params.country) { - queryBuilder.andWhere('analytics.country = :country', { country: params.country }); + queryBuilder.andWhere('analytics.country = :country', { + country: params.country, + }); } const results = await queryBuilder.getRawMany(); - return results.map(result => ({ + return results.map((result) => ({ hour: parseInt(result.hour), efficiencyScore: parseFloat(result.efficiencyScore || '0') * 100, volume: parseInt(result.volume || '0'), - volatility: parseFloat(result.volatility || '0') + volatility: parseFloat(result.volatility || '0'), })); } @@ -285,46 +333,69 @@ export class MarketEfficiencyReport { const recommendations: string[] = []; if (summary.averageSpread > 0.05) { - recommendations.push('High bid-ask spread detected. Consider improving market maker incentives to reduce spreads.'); + recommendations.push( + 'High bid-ask spread detected. Consider improving market maker incentives to reduce spreads.', + ); } if (summary.averageVolatility > 0.3) { - recommendations.push('High volatility observed. Implement circuit breakers or volatility controls to stabilize the market.'); + recommendations.push( + 'High volatility observed. Implement circuit breakers or volatility controls to stabilize the market.', + ); } if (summary.averageLiquidity < 5) { - recommendations.push('Low liquidity detected. Consider liquidity provision programs or market maker incentives.'); + recommendations.push( + 'Low liquidity detected. Consider liquidity provision programs or market maker incentives.', + ); } if (summary.marketEfficiencyScore < 60) { - recommendations.push('Market efficiency is below optimal levels. Review market structure and consider regulatory improvements.'); + recommendations.push( + 'Market efficiency is below optimal levels. Review market structure and consider regulatory improvements.', + ); } if (summary.priceDiscoveryEfficiency < 50) { - recommendations.push('Price discovery is inefficient. Improve information dissemination and transparency requirements.'); + recommendations.push( + 'Price discovery is inefficient. Improve information dissemination and transparency requirements.', + ); } if (summary.informationAsymmetry > 40) { - recommendations.push('High information asymmetry detected. Implement better disclosure requirements and real-time data feeds.'); + recommendations.push( + 'High information asymmetry detected. Implement better disclosure requirements and real-time data feeds.', + ); } if (recommendations.length === 0) { - recommendations.push('Market efficiency metrics are within acceptable ranges. Continue monitoring for improvements.'); + recommendations.push( + 'Market efficiency metrics are within acceptable ranges. Continue monitoring for improvements.', + ); } return recommendations; } - async generateRealTimeMetrics(gridZoneId?: string, country?: string): Promise { + async generateRealTimeMetrics( + gridZoneId?: string, + country?: string, + ): Promise { const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') - .where('analytics.type = :type', { type: AnalyticsType.MARKET_EFFICIENCY }) - .andWhere('analytics.period = :period', { period: AggregationPeriod.HOURLY }) + .where('analytics.type = :type', { + type: AnalyticsType.MARKET_EFFICIENCY, + }) + .andWhere('analytics.period = :period', { + period: AggregationPeriod.HOURLY, + }) .orderBy('analytics.timestamp', 'DESC') .limit(1); if (gridZoneId) { - queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { gridZoneId }); + queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { + gridZoneId, + }); } if (country) { @@ -346,7 +417,7 @@ export class MarketEfficiencyReport { priceEfficiency: 0.85, volumeWeightedAveragePrice: 50, tradingVelocity: 5.2, - orderBookImbalance: 0.1 + orderBookImbalance: 0.1, }; } @@ -361,7 +432,7 @@ export class MarketEfficiencyReport { priceEfficiency: parseFloat(efficiencyData.priceEfficiency || '0'), volumeWeightedAveragePrice: parseFloat(efficiencyData.vwap || '0'), tradingVelocity: parseFloat(efficiencyData.tradingVelocity || '0'), - orderBookImbalance: parseFloat(efficiencyData.orderBookImbalance || '0') + orderBookImbalance: parseFloat(efficiencyData.orderBookImbalance || '0'), }; } } diff --git a/src/analytics/reports/price-trends.report.ts b/src/analytics/reports/price-trends.report.ts index d99db6e..6ec7e6d 100644 --- a/src/analytics/reports/price-trends.report.ts +++ b/src/analytics/reports/price-trends.report.ts @@ -1,7 +1,11 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { AnalyticsData, AnalyticsType, AggregationPeriod } from '../entities/analytics-data.entity'; +import { + AnalyticsData, + AnalyticsType, + AggregationPeriod, +} from '../entities/analytics-data.entity'; import { ReportParamsDto } from '../dto/report-params.dto'; export interface PriceDataPoint { @@ -54,18 +58,24 @@ export class PriceTrendsReport { ) {} async generateReport(params: ReportParamsDto): Promise { - const startDate = params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago + const startDate = + params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago const endDate = params.endDate || new Date(); const period = params.period || AggregationPeriod.DAILY; // Fetch price trend data - const priceData = await this.fetchPriceData(startDate, endDate, period, params); + const priceData = await this.fetchPriceData( + startDate, + endDate, + period, + params, + ); // Calculate summary statistics const summary = this.calculateSummary(priceData); // Generate technical indicators if requested - const technicalIndicators = params.includeTechnicalIndicators + const technicalIndicators = params.includeTechnicalIndicators ? this.generateTechnicalIndicators(priceData) : undefined; @@ -78,12 +88,12 @@ export class PriceTrendsReport { period: { start: startDate, end: endDate, - aggregation: period + aggregation: period, }, summary, data: priceData, technicalIndicators, - comparativeAnalysis + comparativeAnalysis, }; } @@ -91,7 +101,7 @@ export class PriceTrendsReport { startDate: Date, endDate: Date, period: AggregationPeriod, - params: ReportParamsDto + params: ReportParamsDto, ): Promise { const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') @@ -99,26 +109,32 @@ export class PriceTrendsReport { .andWhere('analytics.period = :period', { period }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }); if (params.userId) { - queryBuilder.andWhere('analytics.userId = :userId', { userId: params.userId }); + queryBuilder.andWhere('analytics.userId = :userId', { + userId: params.userId, + }); } if (params.gridZoneId) { - queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { gridZoneId: params.gridZoneId }); + queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { + gridZoneId: params.gridZoneId, + }); } if (params.country) { - queryBuilder.andWhere('analytics.country = :country', { country: params.country }); + queryBuilder.andWhere('analytics.country = :country', { + country: params.country, + }); } queryBuilder.orderBy('analytics.timestamp', 'ASC'); const analyticsData = await queryBuilder.getMany(); - return analyticsData.map(data => { + return analyticsData.map((data) => { const priceData = data.data as any; return { timestamp: data.timestamp, @@ -127,7 +143,7 @@ export class PriceTrendsReport { high: parseFloat(priceData.high || '0'), low: parseFloat(priceData.low || '0'), open: parseFloat(priceData.open || '0'), - close: parseFloat(priceData.close || '0') + close: parseFloat(priceData.close || '0'), }; }); } @@ -142,17 +158,19 @@ export class PriceTrendsReport { averagePrice: 0, highestPrice: 0, lowestPrice: 0, - trend: 'SIDEWAYS' as const + trend: 'SIDEWAYS' as const, }; } const currentPrice = data[data.length - 1].close; const firstPrice = data[0].open; const priceChange = currentPrice - firstPrice; - const priceChangePercent = firstPrice > 0 ? (priceChange / firstPrice) * 100 : 0; + const priceChangePercent = + firstPrice > 0 ? (priceChange / firstPrice) * 100 : 0; - const prices = data.map(d => d.close); - const averagePrice = prices.reduce((sum, price) => sum + price, 0) / prices.length; + const prices = data.map((d) => d.close); + const averagePrice = + prices.reduce((sum, price) => sum + price, 0) / prices.length; const highestPrice = Math.max(...prices); const lowestPrice = Math.min(...prices); @@ -163,7 +181,8 @@ export class PriceTrendsReport { returns.push((prices[i] - prices[i - 1]) / prices[i - 1]); } } - const volatility = returns.length > 0 ? this.calculateStandardDeviation(returns) * 100 : 0; + const volatility = + returns.length > 0 ? this.calculateStandardDeviation(returns) * 100 : 0; // Determine trend let trend: 'BULLISH' | 'BEARISH' | 'SIDEWAYS' = 'SIDEWAYS'; @@ -178,20 +197,22 @@ export class PriceTrendsReport { averagePrice, highestPrice, lowestPrice, - trend + trend, }; } - private generateTechnicalIndicators(data: PriceDataPoint[]): TechnicalIndicator[] { + private generateTechnicalIndicators( + data: PriceDataPoint[], + ): TechnicalIndicator[] { const indicators: TechnicalIndicator[] = []; - const prices = data.map(d => d.close); + const prices = data.map((d) => d.close); // Simple Moving Average (SMA) - 20 period const sma20 = this.calculateSMA(prices, 20); indicators.push({ name: 'SMA_20', values: sma20, - signals: this.generateSMASignals(prices, sma20) + signals: this.generateSMASignals(prices, sma20), }); // Exponential Moving Average (EMA) - 50 period @@ -199,7 +220,7 @@ export class PriceTrendsReport { indicators.push({ name: 'EMA_50', values: ema50, - signals: this.generateEMASignals(prices, ema50) + signals: this.generateEMASignals(prices, ema50), }); // Relative Strength Index (RSI) - 14 period @@ -207,7 +228,7 @@ export class PriceTrendsReport { indicators.push({ name: 'RSI_14', values: rsi, - signals: this.generateRSISignals(rsi) + signals: this.generateRSISignals(rsi), }); // MACD @@ -215,7 +236,7 @@ export class PriceTrendsReport { indicators.push({ name: 'MACD', values: macd.macdLine, - signals: this.generateMACDSignals(macd) + signals: this.generateMACDSignals(macd), }); return indicators; @@ -224,7 +245,9 @@ export class PriceTrendsReport { private calculateSMA(prices: number[], period: number): number[] { const sma: number[] = []; for (let i = period - 1; i < prices.length; i++) { - const sum = prices.slice(i - period + 1, i + 1).reduce((a, b) => a + b, 0); + const sum = prices + .slice(i - period + 1, i + 1) + .reduce((a, b) => a + b, 0); sma.push(sum / period); } return sma; @@ -233,13 +256,14 @@ export class PriceTrendsReport { private calculateEMA(prices: number[], period: number): number[] { const ema: number[] = []; const multiplier = 2 / (period + 1); - + // Start with SMA const sma = prices.slice(0, period).reduce((a, b) => a + b, 0) / period; ema.push(sma); for (let i = period; i < prices.length; i++) { - const currentEMA = (prices[i] - ema[ema.length - 1]) * multiplier + ema[ema.length - 1]; + const currentEMA = + (prices[i] - ema[ema.length - 1]) * multiplier + ema[ema.length - 1]; ema.push(currentEMA); } @@ -258,33 +282,47 @@ export class PriceTrendsReport { } for (let i = period - 1; i < gains.length; i++) { - const avgGain = gains.slice(i - period + 1, i + 1).reduce((a, b) => a + b, 0) / period; - const avgLoss = losses.slice(i - period + 1, i + 1).reduce((a, b) => a + b, 0) / period; - + const avgGain = + gains.slice(i - period + 1, i + 1).reduce((a, b) => a + b, 0) / period; + const avgLoss = + losses.slice(i - period + 1, i + 1).reduce((a, b) => a + b, 0) / period; + const rs = avgLoss === 0 ? 100 : avgGain / avgLoss; - rsi.push(100 - (100 / (1 + rs))); + rsi.push(100 - 100 / (1 + rs)); } return rsi; } - private calculateMACD(prices: number[]): { macdLine: number[]; signalLine: number[]; histogram: number[] } { + private calculateMACD(prices: number[]): { + macdLine: number[]; + signalLine: number[]; + histogram: number[]; + } { const ema12 = this.calculateEMA(prices, 12); const ema26 = this.calculateEMA(prices, 26); - + // MACD line = EMA12 - EMA26 - const macdLine = ema12.map((val, i) => val - ema26[i + (ema12.length - ema26.length)]); - + const macdLine = ema12.map( + (val, i) => val - ema26[i + (ema12.length - ema26.length)], + ); + // Signal line = 9-period EMA of MACD line const signalLine = this.calculateEMA(macdLine, 9); - + // Histogram = MACD line - Signal line - const histogram = macdLine.map((val, i) => val - (signalLine[i - (signalLine.length - macdLine.length)] || 0)); + const histogram = macdLine.map( + (val, i) => + val - (signalLine[i - (signalLine.length - macdLine.length)] || 0), + ); return { macdLine, signalLine, histogram }; } - private generateSMASignals(prices: number[], sma: number[]): ('BUY' | 'SELL' | 'HOLD')[] { + private generateSMASignals( + prices: number[], + sma: number[], + ): ('BUY' | 'SELL' | 'HOLD')[] { const signals: ('BUY' | 'SELL' | 'HOLD')[] = []; for (let i = 0; i < sma.length; i++) { const priceIndex = i + (prices.length - sma.length); @@ -299,22 +337,29 @@ export class PriceTrendsReport { return signals; } - private generateEMASignals(prices: number[], ema: number[]): ('BUY' | 'SELL' | 'HOLD')[] { + private generateEMASignals( + prices: number[], + ema: number[], + ): ('BUY' | 'SELL' | 'HOLD')[] { return this.generateSMASignals(prices, ema); } private generateRSISignals(rsi: number[]): ('BUY' | 'SELL' | 'HOLD')[] { - return rsi.map(value => { + return rsi.map((value) => { if (value < 30) return 'BUY'; if (value > 70) return 'SELL'; return 'HOLD'; }); } - private generateMACDSignals(macd: { macdLine: number[]; signalLine: number[]; histogram: number[] }): ('BUY' | 'SELL' | 'HOLD')[] { + private generateMACDSignals(macd: { + macdLine: number[]; + signalLine: number[]; + histogram: number[]; + }): ('BUY' | 'SELL' | 'HOLD')[] { const signals: ('BUY' | 'SELL' | 'HOLD')[] = []; const minLength = Math.min(macd.macdLine.length, macd.signalLine.length); - + for (let i = 0; i < minLength; i++) { if (macd.macdLine[i] > macd.signalLine[i]) { signals.push('BUY'); @@ -324,7 +369,7 @@ export class PriceTrendsReport { signals.push('HOLD'); } } - + return signals; } @@ -332,7 +377,7 @@ export class PriceTrendsReport { startDate: Date, endDate: Date, period: AggregationPeriod, - params: ReportParamsDto + params: ReportParamsDto, ) { const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') @@ -342,29 +387,32 @@ export class PriceTrendsReport { .andWhere('analytics.period = :period', { period }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .andWhere('analytics.country IS NOT NULL') .groupBy('analytics.country'); if (params.userId) { - queryBuilder.andWhere('analytics.userId = :userId', { userId: params.userId }); + queryBuilder.andWhere('analytics.userId = :userId', { + userId: params.userId, + }); } const results = await queryBuilder.getRawMany(); - return results.map(result => ({ + return results.map((result) => ({ region: result.region, averagePrice: parseFloat(result.averagePrice || '0'), priceChange: 0, // Would need historical data for this - volatility: 0 // Would need historical data for this + volatility: 0, // Would need historical data for this })); } private calculateStandardDeviation(values: number[]): number { const mean = values.reduce((sum, value) => sum + value, 0) / values.length; - const squaredDifferences = values.map(value => Math.pow(value - mean, 2)); - const variance = squaredDifferences.reduce((sum, diff) => sum + diff, 0) / values.length; + const squaredDifferences = values.map((value) => Math.pow(value - mean, 2)); + const variance = + squaredDifferences.reduce((sum, diff) => sum + diff, 0) / values.length; return Math.sqrt(variance); } } diff --git a/src/analytics/reports/trading-volume.report.ts b/src/analytics/reports/trading-volume.report.ts index c3fafb6..31fcc2a 100644 --- a/src/analytics/reports/trading-volume.report.ts +++ b/src/analytics/reports/trading-volume.report.ts @@ -1,7 +1,11 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, Between } from 'typeorm'; -import { AnalyticsData, AnalyticsType, AggregationPeriod } from '../entities/analytics-data.entity'; +import { + AnalyticsData, + AnalyticsType, + AggregationPeriod, +} from '../entities/analytics-data.entity'; import { ReportParamsDto } from '../dto/report-params.dto'; export interface TradingVolumeData { @@ -50,34 +54,44 @@ export class TradingVolumeReport { ) {} async generateReport(params: ReportParamsDto): Promise { - const startDate = params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago + const startDate = + params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago const endDate = params.endDate || new Date(); const period = params.period || AggregationPeriod.DAILY; // Fetch trading volume data - const volumeData = await this.fetchTradingVolumeData(startDate, endDate, period, params); + const volumeData = await this.fetchTradingVolumeData( + startDate, + endDate, + period, + params, + ); // Calculate summary statistics const summary = this.calculateSummary(volumeData); // Get geographic breakdown if requested - const geographicBreakdown = params.includeComparativeAnalysis + const geographicBreakdown = params.includeComparativeAnalysis ? await this.getGeographicBreakdown(startDate, endDate, params) : undefined; // Get renewable energy breakdown - const renewableEnergyBreakdown = await this.getRenewableEnergyBreakdown(startDate, endDate, params); + const renewableEnergyBreakdown = await this.getRenewableEnergyBreakdown( + startDate, + endDate, + params, + ); return { period: { start: startDate, end: endDate, - aggregation: period + aggregation: period, }, summary, data: volumeData, geographicBreakdown, - renewableEnergyBreakdown + renewableEnergyBreakdown, }; } @@ -85,7 +99,7 @@ export class TradingVolumeReport { startDate: Date, endDate: Date, period: AggregationPeriod, - params: ReportParamsDto + params: ReportParamsDto, ): Promise { const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') @@ -93,32 +107,38 @@ export class TradingVolumeReport { .andWhere('analytics.period = :period', { period }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }); if (params.userId) { - queryBuilder.andWhere('analytics.userId = :userId', { userId: params.userId }); + queryBuilder.andWhere('analytics.userId = :userId', { + userId: params.userId, + }); } if (params.gridZoneId) { - queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { gridZoneId: params.gridZoneId }); + queryBuilder.andWhere('analytics.gridZoneId = :gridZoneId', { + gridZoneId: params.gridZoneId, + }); } if (params.country) { - queryBuilder.andWhere('analytics.country = :country', { country: params.country }); + queryBuilder.andWhere('analytics.country = :country', { + country: params.country, + }); } queryBuilder.orderBy('analytics.timestamp', 'ASC'); const analyticsData = await queryBuilder.getMany(); - return analyticsData.map(data => ({ + return analyticsData.map((data) => ({ timestamp: data.timestamp, volume: data.count || 0, value: parseFloat(data.totalValue?.toString() || '0'), transactions: data.count || 0, averageTransactionSize: parseFloat(data.averageValue?.toString() || '0'), - period: data.period + period: data.period, })); } @@ -131,23 +151,31 @@ export class TradingVolumeReport { averageTransactionSize: 0, peakVolume: 0, peakVolumeTime: new Date(), - growthRate: 0 + growthRate: 0, }; } const totalVolume = data.reduce((sum, item) => sum + item.volume, 0); const totalValue = data.reduce((sum, item) => sum + item.value, 0); - const totalTransactions = data.reduce((sum, item) => sum + item.transactions, 0); - const averageTransactionSize = totalTransactions > 0 ? totalValue / totalTransactions : 0; + const totalTransactions = data.reduce( + (sum, item) => sum + item.transactions, + 0, + ); + const averageTransactionSize = + totalTransactions > 0 ? totalValue / totalTransactions : 0; // Find peak volume - const peakData = data.reduce((max, item) => - item.volume > max.volume ? item : max, data[0]); + const peakData = data.reduce( + (max, item) => (item.volume > max.volume ? item : max), + data[0], + ); // Calculate growth rate (comparing first and last periods) - const growthRate = data.length > 1 - ? ((data[data.length - 1].volume - data[0].volume) / data[0].volume) * 100 - : 0; + const growthRate = + data.length > 1 + ? ((data[data.length - 1].volume - data[0].volume) / data[0].volume) * + 100 + : 0; return { totalVolume, @@ -156,14 +184,14 @@ export class TradingVolumeReport { averageTransactionSize, peakVolume: peakData.volume, peakVolumeTime: peakData.timestamp, - growthRate + growthRate, }; } private async getGeographicBreakdown( startDate: Date, endDate: Date, - params: ReportParamsDto + params: ReportParamsDto, ) { const queryBuilder = this.analyticsRepository .createQueryBuilder('analytics') @@ -173,32 +201,40 @@ export class TradingVolumeReport { .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .andWhere('analytics.country IS NOT NULL') .groupBy('analytics.country') .orderBy('SUM(analytics.count)', 'DESC'); if (params.userId) { - queryBuilder.andWhere('analytics.userId = :userId', { userId: params.userId }); + queryBuilder.andWhere('analytics.userId = :userId', { + userId: params.userId, + }); } const results = await queryBuilder.getRawMany(); - const totalVolume = results.reduce((sum, item) => sum + parseFloat(item.volume || '0'), 0); + const totalVolume = results.reduce( + (sum, item) => sum + parseFloat(item.volume || '0'), + 0, + ); - return results.map(item => ({ + return results.map((item) => ({ country: item.country, volume: parseFloat(item.volume || '0'), value: parseFloat(item.value || '0'), - percentage: totalVolume > 0 ? (parseFloat(item.volume || '0') / totalVolume) * 100 : 0 + percentage: + totalVolume > 0 + ? (parseFloat(item.volume || '0') / totalVolume) * 100 + : 0, })); } private async getRenewableEnergyBreakdown( startDate: Date, endDate: Date, - params: ReportParamsDto + params: ReportParamsDto, ) { // Get total trading volume const totalVolumeQuery = this.analyticsRepository @@ -207,11 +243,13 @@ export class TradingVolumeReport { .where('analytics.type = :type', { type: AnalyticsType.TRADING_VOLUME }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }); if (params.userId) { - totalVolumeQuery.andWhere('analytics.userId = :userId', { userId: params.userId }); + totalVolumeQuery.andWhere('analytics.userId = :userId', { + userId: params.userId, + }); } const totalVolumeResult = await totalVolumeQuery.getRawOne(); @@ -224,48 +262,60 @@ export class TradingVolumeReport { .where('analytics.type = :type', { type: AnalyticsType.RENEWABLE_ENERGY }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }); if (params.userId) { - renewableVolumeQuery.andWhere('analytics.userId = :userId', { userId: params.userId }); + renewableVolumeQuery.andWhere('analytics.userId = :userId', { + userId: params.userId, + }); } const renewableVolumeResult = await renewableVolumeQuery.getRawOne(); - const renewableVolume = parseFloat(renewableVolumeResult?.renewableVolume || '0'); + const renewableVolume = parseFloat( + renewableVolumeResult?.renewableVolume || '0', + ); return { renewableVolume, totalVolume, - percentage: totalVolume > 0 ? (renewableVolume / totalVolume) * 100 : 0 + percentage: totalVolume > 0 ? (renewableVolume / totalVolume) * 100 : 0, }; } - async generateHourlyReport(params: ReportParamsDto): Promise { + async generateHourlyReport( + params: ReportParamsDto, + ): Promise { return this.generateReport({ ...params, - period: AggregationPeriod.HOURLY + period: AggregationPeriod.HOURLY, }); } - async generateDailyReport(params: ReportParamsDto): Promise { + async generateDailyReport( + params: ReportParamsDto, + ): Promise { return this.generateReport({ ...params, - period: AggregationPeriod.DAILY + period: AggregationPeriod.DAILY, }); } - async generateWeeklyReport(params: ReportParamsDto): Promise { + async generateWeeklyReport( + params: ReportParamsDto, + ): Promise { return this.generateReport({ ...params, - period: AggregationPeriod.WEEKLY + period: AggregationPeriod.WEEKLY, }); } - async generateMonthlyReport(params: ReportParamsDto): Promise { + async generateMonthlyReport( + params: ReportParamsDto, + ): Promise { return this.generateReport({ ...params, - period: AggregationPeriod.MONTHLY + period: AggregationPeriod.MONTHLY, }); } } diff --git a/src/analytics/reports/user-performance.report.ts b/src/analytics/reports/user-performance.report.ts index 8d0c5e2..e745a14 100644 --- a/src/analytics/reports/user-performance.report.ts +++ b/src/analytics/reports/user-performance.report.ts @@ -1,7 +1,11 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { AnalyticsData, AnalyticsType, AggregationPeriod } from '../entities/analytics-data.entity'; +import { + AnalyticsData, + AnalyticsType, + AggregationPeriod, +} from '../entities/analytics-data.entity'; import { ReportParamsDto } from '../dto/report-params.dto'; export interface UserPerformanceMetrics { @@ -71,26 +75,47 @@ export class UserPerformanceReport { private analyticsRepository: Repository, ) {} - async generateReport(params: ReportParamsDto): Promise { + async generateReport( + params: ReportParamsDto, + ): Promise { if (!params.userId) { throw new Error('User ID is required for user performance report'); } - const startDate = params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago + const startDate = + params.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago const endDate = params.endDate || new Date(); const period = params.period || AggregationPeriod.DAILY; // Fetch user performance data - const userMetrics = await this.calculateUserMetrics(params.userId, startDate, endDate, params); + const userMetrics = await this.calculateUserMetrics( + params.userId, + startDate, + endDate, + params, + ); // Get historical performance data - const historicalData = await this.getHistoricalPerformance(params.userId, startDate, endDate, period); + const historicalData = await this.getHistoricalPerformance( + params.userId, + startDate, + endDate, + period, + ); // Get leaderboard position if requested - const leaderboard = await this.getLeaderboardPosition(params.userId, startDate, endDate); + const leaderboard = await this.getLeaderboardPosition( + params.userId, + startDate, + endDate, + ); // Get performance breakdown - const performanceBreakdown = await this.getPerformanceBreakdown(params.userId, startDate, endDate); + const performanceBreakdown = await this.getPerformanceBreakdown( + params.userId, + startDate, + endDate, + ); // Generate recommendations const recommendations = this.generateRecommendations(userMetrics); @@ -99,13 +124,13 @@ export class UserPerformanceReport { period: { start: startDate, end: endDate, - aggregation: period + aggregation: period, }, userMetrics, historicalData, leaderboard, performanceBreakdown, - recommendations + recommendations, }; } @@ -113,7 +138,7 @@ export class UserPerformanceReport { userId: string, startDate: Date, endDate: Date, - params: ReportParamsDto + params: ReportParamsDto, ): Promise { // Get trading data const tradingData = await this.analyticsRepository @@ -126,20 +151,23 @@ export class UserPerformanceReport { .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .getRawOne(); // Get profit/loss data const profitLossData = await this.analyticsRepository .createQueryBuilder('analytics') - .select('SUM(analytics.data->>\'profitLoss\')', 'totalProfitLoss') - .addSelect('COUNT(CASE WHEN analytics.data->>\'isWinningTrade\' = \'true\' THEN 1 END)', 'winningTrades') + .select("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss') + .addSelect( + "COUNT(CASE WHEN analytics.data->>'isWinningTrade' = 'true' THEN 1 END)", + 'winningTrades', + ) .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE }) .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .getRawOne(); @@ -151,7 +179,7 @@ export class UserPerformanceReport { .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .getRawOne(); @@ -163,14 +191,25 @@ export class UserPerformanceReport { const winningTrades = parseInt(profitLossData?.winningTrades || '0'); const renewableTrades = parseInt(renewableData?.renewableTrades || '0'); - const profitLossPercent = totalValue > 0 ? (totalProfitLoss / totalValue) * 100 : 0; + const profitLossPercent = + totalValue > 0 ? (totalProfitLoss / totalValue) * 100 : 0; const winRate = totalTrades > 0 ? (winningTrades / totalTrades) * 100 : 0; - const averageProfitPerTrade = totalTrades > 0 ? totalProfitLoss / totalTrades : 0; - const renewableEnergyPercentage = totalTrades > 0 ? (renewableTrades / totalTrades) * 100 : 0; + const averageProfitPerTrade = + totalTrades > 0 ? totalProfitLoss / totalTrades : 0; + const renewableEnergyPercentage = + totalTrades > 0 ? (renewableTrades / totalTrades) * 100 : 0; // Calculate risk metrics - const riskMetrics = await this.calculateRiskMetrics(userId, startDate, endDate); - const tradingFrequency = this.calculateTradingFrequency(totalTrades, startDate, endDate); + const riskMetrics = await this.calculateRiskMetrics( + userId, + startDate, + endDate, + ); + const tradingFrequency = this.calculateTradingFrequency( + totalTrades, + startDate, + endDate, + ); return { userId, @@ -187,14 +226,14 @@ export class UserPerformanceReport { maxDrawdown: riskMetrics.maxDrawdown, tradingFrequency, renewableEnergyTrades: renewableTrades, - renewableEnergyPercentage + renewableEnergyPercentage, }; } private async calculateRiskMetrics( userId: string, startDate: Date, - endDate: Date + endDate: Date, ): Promise<{ riskAdjustedReturn: number; sharpeRatio: number; @@ -203,17 +242,19 @@ export class UserPerformanceReport { // Get daily returns for risk calculations const dailyReturns = await this.analyticsRepository .createQueryBuilder('analytics') - .select('analytics.data->>\'dailyReturn\'', 'dailyReturn') + .select("analytics.data->>'dailyReturn'", 'dailyReturn') .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE }) .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .orderBy('analytics.timestamp', 'ASC') .getRawMany(); - const returns = dailyReturns.map(r => parseFloat(r.dailyReturn || '0')).filter(r => !isNaN(r)); + const returns = dailyReturns + .map((r) => parseFloat(r.dailyReturn || '0')) + .filter((r) => !isNaN(r)); if (returns.length === 0) { return { riskAdjustedReturn: 0, sharpeRatio: 0, maxDrawdown: 0 }; @@ -221,9 +262,12 @@ export class UserPerformanceReport { // Calculate Sharpe Ratio const meanReturn = returns.reduce((sum, r) => sum + r, 0) / returns.length; - const variance = returns.reduce((sum, r) => sum + Math.pow(r - meanReturn, 2), 0) / returns.length; + const variance = + returns.reduce((sum, r) => sum + Math.pow(r - meanReturn, 2), 0) / + returns.length; const standardDeviation = Math.sqrt(variance); - const sharpeRatio = standardDeviation > 0 ? meanReturn / standardDeviation : 0; + const sharpeRatio = + standardDeviation > 0 ? meanReturn / standardDeviation : 0; // Calculate maximum drawdown let maxDrawdown = 0; @@ -239,17 +283,24 @@ export class UserPerformanceReport { // Risk-adjusted return (simplified) const totalReturn = cumulativeReturn; - const riskAdjustedReturn = standardDeviation > 0 ? totalReturn / standardDeviation : 0; + const riskAdjustedReturn = + standardDeviation > 0 ? totalReturn / standardDeviation : 0; return { riskAdjustedReturn, sharpeRatio, - maxDrawdown + maxDrawdown, }; } - private calculateTradingFrequency(totalTrades: number, startDate: Date, endDate: Date): number { - const days = Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)); + private calculateTradingFrequency( + totalTrades: number, + startDate: Date, + endDate: Date, + ): number { + const days = Math.ceil( + (endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24), + ); return days > 0 ? totalTrades / days : 0; } @@ -257,20 +308,20 @@ export class UserPerformanceReport { userId: string, startDate: Date, endDate: Date, - period: AggregationPeriod + period: AggregationPeriod, ) { return this.analyticsRepository .createQueryBuilder('analytics') .select('analytics.timestamp', 'timestamp') - .addSelect('analytics.data->>\'profitLoss\'', 'profitLoss') - .addSelect('analytics.data->>\'cumulativeValue\'', 'cumulativeValue') + .addSelect("analytics.data->>'profitLoss'", 'profitLoss') + .addSelect("analytics.data->>'cumulativeValue'", 'cumulativeValue') .addSelect('analytics.count', 'tradeCount') .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE }) .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.period = :period', { period }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .orderBy('analytics.timestamp', 'ASC') .getRawMany(); @@ -279,17 +330,19 @@ export class UserPerformanceReport { private async getLeaderboardPosition( userId: string, startDate: Date, - endDate: Date - ): Promise<{ rank: number; totalUsers: number; percentile: number } | undefined> { + endDate: Date, + ): Promise< + { rank: number; totalUsers: number; percentile: number } | undefined + > { // Get user's total profit/loss const userProfitLoss = await this.analyticsRepository .createQueryBuilder('analytics') - .select('SUM(analytics.data->>\'profitLoss\')', 'totalProfitLoss') + .select("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss') .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE }) .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .getRawOne(); @@ -299,19 +352,20 @@ export class UserPerformanceReport { const leaderboard = await this.analyticsRepository .createQueryBuilder('analytics') .select('analytics.userId', 'userId') - .addSelect('SUM(analytics.data->>\'profitLoss\')', 'totalProfitLoss') + .addSelect("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss') .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .groupBy('analytics.userId') - .orderBy('SUM(analytics.data->>\'profitLoss\')', 'DESC') + .orderBy("SUM(analytics.data->>'profitLoss')", 'DESC') .getRawMany(); const totalUsers = leaderboard.length; - const rank = leaderboard.findIndex(user => user.userId === userId) + 1; - const percentile = totalUsers > 0 ? ((totalUsers - rank) / totalUsers) * 100 : 0; + const rank = leaderboard.findIndex((user) => user.userId === userId) + 1; + const percentile = + totalUsers > 0 ? ((totalUsers - rank) / totalUsers) * 100 : 0; return { rank, totalUsers, percentile }; } @@ -319,48 +373,51 @@ export class UserPerformanceReport { private async getPerformanceBreakdown( userId: string, startDate: Date, - endDate: Date + endDate: Date, ) { // Performance by grid zone const byGridZone = await this.analyticsRepository .createQueryBuilder('analytics') .select('analytics.gridZoneId', 'zoneId') - .addSelect('analytics.data->>\'zoneName\'', 'zoneName') - .addSelect('SUM(analytics.data->>\'profitLoss\')', 'profitLoss') + .addSelect("analytics.data->>'zoneName'", 'zoneName') + .addSelect("SUM(analytics.data->>'profitLoss')", 'profitLoss') .addSelect('COUNT(analytics.id)', 'tradeCount') - .addSelect('AVG(CASE WHEN analytics.data->>\'isWinningTrade\' = \'true\' THEN 1 ELSE 0 END)', 'winRate') + .addSelect( + "AVG(CASE WHEN analytics.data->>'isWinningTrade' = 'true' THEN 1 ELSE 0 END)", + 'winRate', + ) .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE }) .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .andWhere('analytics.gridZoneId IS NOT NULL') - .groupBy('analytics.gridZoneId, analytics.data->>\'zoneName\'') + .groupBy("analytics.gridZoneId, analytics.data->>'zoneName'") .getRawMany(); // Performance by energy type const totalTrades = await this.analyticsRepository .createQueryBuilder('analytics') .select('COUNT(analytics.id)', 'totalTrades') - .addSelect('SUM(analytics.data->>\'profitLoss\')', 'totalProfitLoss') + .addSelect("SUM(analytics.data->>'profitLoss')", 'totalProfitLoss') .where('analytics.type = :type', { type: AnalyticsType.USER_PERFORMANCE }) .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .getRawOne(); const renewableTrades = await this.analyticsRepository .createQueryBuilder('analytics') .select('COUNT(analytics.id)', 'renewableTrades') - .addSelect('SUM(analytics.data->>\'profitLoss\')', 'renewableProfitLoss') + .addSelect("SUM(analytics.data->>'profitLoss')", 'renewableProfitLoss') .where('analytics.type = :type', { type: AnalyticsType.RENEWABLE_ENERGY }) .andWhere('analytics.userId = :userId', { userId }) .andWhere('analytics.timestamp BETWEEN :startDate AND :endDate', { startDate, - endDate + endDate, }) .getRawOne(); @@ -369,25 +426,27 @@ export class UserPerformanceReport { const nonRenewable = total - renewable; return { - byGridZone: byGridZone.map(zone => ({ + byGridZone: byGridZone.map((zone) => ({ zoneId: zone.zoneId, zoneName: zone.zoneName || 'Unknown', profitLoss: parseFloat(zone.profitLoss || '0'), tradeCount: parseInt(zone.tradeCount || '0'), - winRate: parseFloat(zone.winRate || '0') * 100 + winRate: parseFloat(zone.winRate || '0') * 100, })), byEnergyType: { renewable: { profitLoss: parseFloat(renewableTrades?.renewableProfitLoss || '0'), tradeCount: renewable, - percentage: total > 0 ? (renewable / total) * 100 : 0 + percentage: total > 0 ? (renewable / total) * 100 : 0, }, nonRenewable: { - profitLoss: parseFloat(totalTrades?.totalProfitLoss || '0') - parseFloat(renewableTrades?.renewableProfitLoss || '0'), + profitLoss: + parseFloat(totalTrades?.totalProfitLoss || '0') - + parseFloat(renewableTrades?.renewableProfitLoss || '0'), tradeCount: nonRenewable, - percentage: total > 0 ? (nonRenewable / total) * 100 : 0 - } - } + percentage: total > 0 ? (nonRenewable / total) * 100 : 0, + }, + }, }; } @@ -395,31 +454,45 @@ export class UserPerformanceReport { const recommendations: string[] = []; if (metrics.winRate < 40) { - recommendations.push('Consider refining your trading strategy to improve win rate. Current win rate is below optimal levels.'); + recommendations.push( + 'Consider refining your trading strategy to improve win rate. Current win rate is below optimal levels.', + ); } if (metrics.sharpeRatio < 1) { - recommendations.push('Your risk-adjusted returns could be improved. Consider diversifying your portfolio or adjusting position sizes.'); + recommendations.push( + 'Your risk-adjusted returns could be improved. Consider diversifying your portfolio or adjusting position sizes.', + ); } if (metrics.maxDrawdown > 20) { - recommendations.push('High maximum drawdown detected. Consider implementing stricter risk management controls.'); + recommendations.push( + 'High maximum drawdown detected. Consider implementing stricter risk management controls.', + ); } if (metrics.renewableEnergyPercentage < 30) { - recommendations.push('Consider increasing renewable energy trades to align with sustainability goals and potentially access green energy incentives.'); + recommendations.push( + 'Consider increasing renewable energy trades to align with sustainability goals and potentially access green energy incentives.', + ); } if (metrics.tradingFrequency > 10) { - recommendations.push('High trading frequency may lead to increased transaction costs. Consider focusing on higher-quality trades.'); + recommendations.push( + 'High trading frequency may lead to increased transaction costs. Consider focusing on higher-quality trades.', + ); } if (metrics.profitLossPercent < 0) { - recommendations.push('Current strategy is showing losses. Consider reviewing your trading approach and market analysis methods.'); + recommendations.push( + 'Current strategy is showing losses. Consider reviewing your trading approach and market analysis methods.', + ); } if (recommendations.length === 0) { - recommendations.push('Your trading performance is solid. Continue monitoring risk metrics and market conditions.'); + recommendations.push( + 'Your trading performance is solid. Continue monitoring risk metrics and market conditions.', + ); } return recommendations; diff --git a/src/app.module.ts b/src/app.module.ts index 7655651..3d1b8df 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -23,6 +23,7 @@ import { HttpExceptionFilter } from './common/filters/http-exception.filter'; import { FraudDetectionModule } from './fraud/fraud-detection.module'; import { SyncModule } from './sync/sync.module'; import { LoggingModule } from './logging/logging.module'; +import { SettingsModule } from './settings/settings.module'; @Module({ imports: [ @@ -44,12 +45,9 @@ import { LoggingModule } from './logging/logging.module'; FraudDetectionModule, SyncModule, LoggingModule, + SettingsModule, ], controllers: [AppController, HealthController], - providers: [ - AppService, - ResponseInterceptor, - HttpExceptionFilter, - ], + providers: [AppService, ResponseInterceptor, HttpExceptionFilter], }) -export class AppModule { } +export class AppModule {} diff --git a/src/assets/caching/cache.service.spec.ts b/src/assets/caching/cache.service.spec.ts index c3aaaf4..d887036 100644 --- a/src/assets/caching/cache.service.spec.ts +++ b/src/assets/caching/cache.service.spec.ts @@ -4,7 +4,9 @@ import { CacheService } from './cache.service'; describe('CacheService', () => { let service: CacheService; beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ providers: [CacheService] }).compile(); + const module: TestingModule = await Test.createTestingModule({ + providers: [CacheService], + }).compile(); service = module.get(CacheService); }); it('should set and get cache', () => { diff --git a/src/assets/caching/cache.service.ts b/src/assets/caching/cache.service.ts index 3f99975..d86fe89 100644 --- a/src/assets/caching/cache.service.ts +++ b/src/assets/caching/cache.service.ts @@ -14,13 +14,13 @@ export class CacheService { get(key: string): any | null { const cached = this.cache.get(key); if (!cached) return null; - + if (Date.now() > cached.expiresAt) { this.logger.debug(`Cache expired for key: ${key}`); this.cache.delete(key); return null; } - + this.logger.debug(`Cache hit for key: ${key}`); return cached.data; } diff --git a/src/assets/cdn/cdn.service.spec.ts b/src/assets/cdn/cdn.service.spec.ts index 1894cd3..bed03fb 100644 --- a/src/assets/cdn/cdn.service.spec.ts +++ b/src/assets/cdn/cdn.service.spec.ts @@ -4,7 +4,9 @@ import { CdnService } from './cdn.service'; describe('CdnService', () => { let service: CdnService; beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ providers: [CdnService] }).compile(); + const module: TestingModule = await Test.createTestingModule({ + providers: [CdnService], + }).compile(); service = module.get(CdnService); }); it('should resolve asset URL', () => { diff --git a/src/assets/optimization/compression.service.spec.ts b/src/assets/optimization/compression.service.spec.ts index 4f2f4bc..5925311 100644 --- a/src/assets/optimization/compression.service.spec.ts +++ b/src/assets/optimization/compression.service.spec.ts @@ -4,7 +4,9 @@ import { CompressionService } from './compression.service'; describe('CompressionService', () => { let service: CompressionService; beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ providers: [CompressionService] }).compile(); + const module: TestingModule = await Test.createTestingModule({ + providers: [CompressionService], + }).compile(); service = module.get(CompressionService); }); it('should compress buffer', async () => { diff --git a/src/assets/optimization/compression.service.ts b/src/assets/optimization/compression.service.ts index 8b0ee69..2dac1f1 100644 --- a/src/assets/optimization/compression.service.ts +++ b/src/assets/optimization/compression.service.ts @@ -9,7 +9,10 @@ const brotliCompress = promisify(zlib.brotliCompress); export class CompressionService { private readonly logger = new Logger(CompressionService.name); - async compressAsset(buffer: Buffer, algorithm: 'gzip' | 'brotli' = 'brotli'): Promise { + async compressAsset( + buffer: Buffer, + algorithm: 'gzip' | 'brotli' = 'brotli', + ): Promise { this.logger.debug(`Compressing asset using ${algorithm}`); try { if (algorithm === 'brotli') { diff --git a/src/assets/optimization/image-optimizer.service.ts b/src/assets/optimization/image-optimizer.service.ts index 36f1e86..adef39d 100644 --- a/src/assets/optimization/image-optimizer.service.ts +++ b/src/assets/optimization/image-optimizer.service.ts @@ -4,7 +4,10 @@ import { Injectable, Logger } from '@nestjs/common'; export class ImageOptimizerService { private readonly logger = new Logger(ImageOptimizerService.name); - async optimizeImage(buffer: Buffer, format: 'webp' | 'jpeg' | 'png' = 'webp'): Promise { + async optimizeImage( + buffer: Buffer, + format: 'webp' | 'jpeg' | 'png' = 'webp', + ): Promise { this.logger.debug(`Optimizing image to ${format} format`); // Placeholder for actual image optimization logic (e.g., using sharp) // For now, we return the original buffer to ensure the pipeline doesn't break diff --git a/src/assets/versioning/asset-version.service.spec.ts b/src/assets/versioning/asset-version.service.spec.ts index a392dbd..674645b 100644 --- a/src/assets/versioning/asset-version.service.spec.ts +++ b/src/assets/versioning/asset-version.service.spec.ts @@ -4,7 +4,9 @@ import { AssetVersionService } from './asset-version.service'; describe('AssetVersionService', () => { let service: AssetVersionService; beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ providers: [AssetVersionService] }).compile(); + const module: TestingModule = await Test.createTestingModule({ + providers: [AssetVersionService], + }).compile(); service = module.get(AssetVersionService); }); it('should generate hash', () => { diff --git a/src/assets/versioning/asset-version.service.ts b/src/assets/versioning/asset-version.service.ts index ccfa04f..665575f 100644 --- a/src/assets/versioning/asset-version.service.ts +++ b/src/assets/versioning/asset-version.service.ts @@ -7,7 +7,11 @@ export class AssetVersionService { generateVersionHash(buffer: Buffer): string { this.logger.debug('Generating version hash for asset'); - return crypto.createHash('md5').update(buffer).digest('hex').substring(0, 8); + return crypto + .createHash('md5') + .update(buffer) + .digest('hex') + .substring(0, 8); } appendVersionToFilename(filename: string, hash: string): string { diff --git a/src/audit/decorators/audit.decorator.ts b/src/audit/decorators/audit.decorator.ts index 8c11dda..f1523db 100644 --- a/src/audit/decorators/audit.decorator.ts +++ b/src/audit/decorators/audit.decorator.ts @@ -1,7 +1,11 @@ import { SetMetadata, UseGuards, UseInterceptors } from '@nestjs/common'; import { Request } from 'express'; import { AuditInterceptor } from '../interceptors/audit.interceptor'; -import { AuditAction, AuditResource, AuditSeverity } from '../entities/audit-log.entity'; +import { + AuditAction, + AuditResource, + AuditSeverity, +} from '../entities/audit-log.entity'; export interface AuditOptions { action?: AuditAction; @@ -19,10 +23,14 @@ export interface AuditOptions { } export const Audit = (options: AuditOptions = {}) => { - return (target: any, propertyKey?: string, descriptor?: PropertyDescriptor) => { + return ( + target: any, + propertyKey?: string, + descriptor?: PropertyDescriptor, + ) => { const action = options.action || propertyKey || 'unknown'; const resource = options.resource || target.constructor.name; - + SetMetadata('audit', { action, resource, @@ -188,9 +196,13 @@ export const AuditComplianceCheck = (options: Partial = {}) => { }; export function AuditMethod(options: AuditOptions = {}) { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + return function ( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor, + ) { const originalMethod = descriptor.value; - + descriptor.value = async function (...args: any[]) { const startTime = Date.now(); let result: any; @@ -211,7 +223,9 @@ export function AuditMethod(options: AuditOptions = {}) { action: options.action || propertyKey, resource: options.resource || target.constructor.name, severity: options.severity || AuditSeverity.MEDIUM, - description: options.description || `${options.action || propertyKey} ${options.resource || target.constructor.name}`, + description: + options.description || + `${options.action || propertyKey} ${options.resource || target.constructor.name}`, executionTime, timestamp: new Date(), customFields: options.customFields || {}, @@ -229,22 +243,25 @@ export function AuditMethod(options: AuditOptions = {}) { }; } -export function AuditClass(options: { - action?: AuditAction; - resource?: AuditResource; - severity?: AuditSeverity; - description?: string; - includeRequestBody?: boolean; - includeResponseBody?: boolean; - includeHeaders?: boolean; - includeMetadata?: boolean; -} = {}) { - return function (constructor: T) { +export function AuditClass( + options: { + action?: AuditAction; + resource?: AuditResource; + severity?: AuditSeverity; + description?: string; + includeRequestBody?: boolean; + includeResponseBody?: boolean; + includeHeaders?: boolean; + includeMetadata?: boolean; + } = {}, +) { + return function (constructor: T) { const auditOptions = { action: options.action || AuditAction.READ, resource: options.resource || constructor.name, severity: options.severity || AuditSeverity.MEDIUM, - description: options.description || `${options.action} ${options.resource}`, + description: + options.description || `${options.action} ${options.resource}`, includeRequestBody: options.includeRequestBody ?? false, includeResponseBody: options.includeResponseBody ?? false, includeHeaders: options.includeHeaders ?? false, @@ -256,14 +273,20 @@ export function AuditClass(options: { }; } -export function AuditParam(options: { - name?: string; - description?: string; - redact?: boolean; -} = {}) { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { +export function AuditParam( + options: { + name?: string; + description?: string; + redact?: boolean; + } = {}, +) { + return function ( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor, + ) { const paramName = options.name || propertyKey; - + SetMetadata('audit:param', { name: paramName, description: options.description, @@ -274,14 +297,20 @@ export function AuditParam(options: { }; } -export function AuditSensitive(options: { - fields?: string[]; - redactAll?: boolean; - classification?: 'public' | 'internal' | 'confidential' | 'restricted'; -} = {}) { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { +export function AuditSensitive( + options: { + fields?: string[]; + redactAll?: boolean; + classification?: 'public' | 'internal' | 'confidential' | 'restricted'; + } = {}, +) { + return function ( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor, + ) { const fieldName = propertyKey; - + SetMetadata('audit:sensitive', { field: fieldName, redactAll: options.redactAll ?? false, @@ -294,21 +323,33 @@ export function AuditSensitive(options: { } export function AuditSkipIf(condition: (req: Request) => boolean) { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + return function ( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor, + ) { SetMetadata('audit:skipIf', condition); return descriptor; }; } export function AuditRedact(fields: string[]) { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + return function ( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor, + ) { SetMetadata('audit:redact', fields); return descriptor; }; } export function AuditCustomField(key: string, value: any) { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + return function ( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor, + ) { SetMetadata(`audit:custom:${key}`, value); return descriptor; }; diff --git a/src/audit/interceptors/audit.interceptor.ts b/src/audit/interceptors/audit.interceptor.ts index f264dea..3f18a78 100644 --- a/src/audit/interceptors/audit.interceptor.ts +++ b/src/audit/interceptors/audit.interceptor.ts @@ -1,9 +1,20 @@ -import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Logger } from '@nestjs/common'; +import { + Injectable, + NestInterceptor, + ExecutionContext, + CallHandler, + Logger, +} from '@nestjs/common'; import { Request, Response } from 'express'; import { Reflector } from '@nestjs/core'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { AuditLog, AuditAction, AuditResource, AuditSeverity } from '../entities/audit-log.entity'; +import { + AuditLog, + AuditAction, + AuditResource, + AuditSeverity, +} from '../entities/audit-log.entity'; import { TransactionLog } from '../entities/transaction-log.entity'; import { AuditService } from '../audit.service'; @@ -30,7 +41,7 @@ export class AuditInterceptor implements NestInterceptor { try { // Get audit metadata from the method or class const auditMetadata = this.getAuditMetadata(context); - + if (!auditMetadata) { return next.handle(); } @@ -51,12 +62,21 @@ export class AuditInterceptor implements NestInterceptor { // Create transaction log if applicable if (this.isTransactionRequest(request)) { - transactionLog = await this.createTransactionLog(request, auditMetadata, startTime, result); - await this.updateTransactionLog(transactionLog, response, startTime, result); + transactionLog = await this.createTransactionLog( + request, + auditMetadata, + startTime, + result, + ); + await this.updateTransactionLog( + transactionLog, + response, + startTime, + result, + ); } return result; - } catch (error) { // Log error in audit log if (auditLog) { @@ -73,13 +93,20 @@ export class AuditInterceptor implements NestInterceptor { private getAuditMetadata(context: ExecutionContext): any { const handler = context.getHandler(); - const classMetadata = Reflect.getMetadata('audit:global', handler?.constructor); + const classMetadata = Reflect.getMetadata( + 'audit:global', + handler?.constructor, + ); const methodMetadata = Reflect.getMetadata('audit', handler); - + return { ...classMetadata, ...methodMetadata }; } - private async createAuditLog(request: Request, metadata: any, startTime: number): Promise { + private async createAuditLog( + request: Request, + metadata: any, + startTime: number, + ): Promise { const auditLog = this.auditLogRepository.create({ action: metadata.action, resource: metadata.resource, @@ -91,7 +118,9 @@ export class AuditInterceptor implements NestInterceptor { userAgent: this.getUserAgent(request), requestMethod: request.method, requestUrl: request.url, - requestBody: metadata.includeRequestBody ? this.sanitizeData(request.body) : undefined, + requestBody: metadata.includeRequestBody + ? this.sanitizeData(request.body) + : undefined, responseBody: undefined, // Will be set in updateAuditLog responseStatus: undefined, // Will be set in updateAuditLog executionTime: undefined, // Will be set in updateAuditLog @@ -150,12 +179,13 @@ export class AuditInterceptor implements NestInterceptor { auditLog.isSensitive = true; auditLog.privacy = { dataClassification: 'confidential', - redactionRules: metadata.redactFields?.map(field => ({ - field, - condition: 'always', - action: 'redact', - applied: false, - })) || [], + redactionRules: + metadata.redactFields?.map((field) => ({ + field, + condition: 'always', + action: 'redact', + applied: false, + })) || [], }; } @@ -196,7 +226,8 @@ export class AuditInterceptor implements NestInterceptor { // Update security information if (auditLog.security) { - auditLog.security.permissionsChecked = this.getPermissionsChecked(request); + auditLog.security.permissionsChecked = + this.getPermissionsChecked(request); auditLog.security.rolesChecked = this.getRolesChecked(request); } @@ -343,7 +374,11 @@ export class AuditInterceptor implements NestInterceptor { await this.transactionLogRepository.save(transactionLog); } - private async logError(auditLog: AuditLog, error: any, startTime: number): Promise { + private async logError( + auditLog: AuditLog, + error: any, + startTime: number, + ): Promise { const endTime = Date.now(); const executionTime = endTime - startTime; @@ -365,7 +400,11 @@ export class AuditInterceptor implements NestInterceptor { await this.auditLogRepository.save(auditLog); } - private async logTransactionError(transactionLog: TransactionLog, error: any, startTime: number): Promise { + private async logTransactionError( + transactionLog: TransactionLog, + error: any, + startTime: number, + ): Promise { const endTime = Date.now(); const executionTime = endTime - startTime; @@ -394,7 +433,7 @@ export class AuditInterceptor implements NestInterceptor { '/api/energy/transactions', ]; - return transactionPaths.some(path => request.url.startsWith(path)); + return transactionPaths.some((path) => request.url.startsWith(path)); } private getTransactionType(request: Request): string { @@ -411,17 +450,17 @@ export class AuditInterceptor implements NestInterceptor { } private extractAmount(request: Request): number { - const body = request.body as any; + const body = request.body; return body?.amount || body?.quantity || 0; } private extractCurrency(request: Request): string { - const body = request.body as any; + const body = request.body; return body?.currency || 'USD'; } private extractParticipants(request: Request): any { - const body = request.body as any; + const body = request.body; return { buyer: body?.buyerId ? { id: body.buyerId } : undefined, seller: body?.sellerId ? { id: body.sellerId } : undefined, @@ -429,24 +468,28 @@ export class AuditInterceptor implements NestInterceptor { } private extractEnergyDetails(request: Request): any { - const body = request.body as any; + const body = request.body; return { energyType: body?.energyType, quantity: body?.quantity, unit: body?.unit, deliveryLocation: body?.deliveryLocation, - deliveryDate: body?.deliveryDate ? new Date(body.deliveryDate) : undefined, + deliveryDate: body?.deliveryDate + ? new Date(body.deliveryDate) + : undefined, quality: body?.quality, }; } private extractContractDetails(request: Request): any { - const body = request.body as any; + const body = request.body; return { contractId: body?.contractId, contractType: body?.contractType, terms: body?.terms, - expirationDate: body?.expirationDate ? new Date(body.expirationDate) : undefined, + expirationDate: body?.expirationDate + ? new Date(body.expirationDate) + : undefined, }; } @@ -459,7 +502,11 @@ export class AuditInterceptor implements NestInterceptor { } private getClientIp(request: Request): string { - return request.ip || request.headers['x-forwarded-for'] || request.connection.remoteAddress; + return ( + request.ip || + request.headers['x-forwarded-for'] || + request.connection.remoteAddress + ); } private getUserAgent(request: Request): string { @@ -486,7 +533,9 @@ export class AuditInterceptor implements NestInterceptor { } private getCorrelationId(request: Request): string | undefined { - return request.headers['x-correlation-id'] || request.headers['x-request-id']; + return ( + request.headers['x-correlation-id'] || request.headers['x-request-id'] + ); } private getBatchId(request: Request): string | undefined { @@ -506,7 +555,7 @@ export class AuditInterceptor implements NestInterceptor { if (typeof data === 'object' && data !== null) { const sanitized: any = {}; - + for (const [key, value] of Object.entries(data)) { if (this.isSensitiveField(key)) { sanitized[key] = '***REDACTED***'; @@ -516,7 +565,7 @@ export class AuditInterceptor implements NestInterceptor { sanitized[key] = value; } } - + return sanitized; } @@ -538,8 +587,8 @@ export class AuditInterceptor implements NestInterceptor { 'pin', ]; - return sensitiveFields.some(field => - fieldName.toLowerCase().includes(field.toLowerCase()) + return sensitiveFields.some((field) => + fieldName.toLowerCase().includes(field.toLowerCase()), ); } @@ -564,6 +613,6 @@ export class AuditInterceptor implements NestInterceptor { 'EAI_AGAIN', ]; - return recoverableErrors.some(err => error.code === err); + return recoverableErrors.some((err) => error.code === err); } } diff --git a/src/audit/reports/compliance.report.ts b/src/audit/reports/compliance.report.ts index 80f785c..6edc0e4 100644 --- a/src/audit/reports/compliance.report.ts +++ b/src/audit/reports/compliance.report.ts @@ -1,8 +1,17 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, Between, LessThan, MoreThan } from 'typeorm'; -import { AuditLog, AuditAction, AuditResource, AuditSeverity } from '../entities/audit-log.entity'; -import { TransactionLog, TransactionStatus, TransactionType } from '../entities/transaction-log.entity'; +import { + AuditLog, + AuditAction, + AuditResource, + AuditSeverity, +} from '../entities/audit-log.entity'; +import { + TransactionLog, + TransactionStatus, + TransactionType, +} from '../entities/transaction-log.entity'; export interface ComplianceReportData { reportId: string; @@ -134,7 +143,9 @@ export class ComplianceReport { startDate: Date, endDate: Date, ): Promise { - this.logger.log(`Generating ${reportType} compliance report for period ${startDate.toISOString()} to ${endDate.toISOString()}`); + this.logger.log( + `Generating ${reportType} compliance report for period ${startDate.toISOString()} to ${endDate.toISOString()}`, + ); const reportId = this.generateReportId(reportType, startDate); @@ -178,36 +189,86 @@ export class ComplianceReport { return report; } - async generateDailyReport(date: Date = new Date()): Promise { - const startDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); - const endDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999); + async generateDailyReport( + date: Date = new Date(), + ): Promise { + const startDate = new Date( + date.getFullYear(), + date.getMonth(), + date.getDate(), + ); + const endDate = new Date( + date.getFullYear(), + date.getMonth(), + date.getDate(), + 23, + 59, + 59, + 999, + ); return this.generateReport('daily', startDate, endDate); } - async generateWeeklyReport(date: Date = new Date()): Promise { - const startDate = new Date(date.getFullYear(), date.getMonth(), date.getDate() - date.getDay()); - const endDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + 6, 23, 59, 59, 999); + async generateWeeklyReport( + date: Date = new Date(), + ): Promise { + const startDate = new Date( + date.getFullYear(), + date.getMonth(), + date.getDate() - date.getDay(), + ); + const endDate = new Date( + startDate.getFullYear(), + startDate.getMonth(), + startDate.getDate() + 6, + 23, + 59, + 59, + 999, + ); return this.generateReport('weekly', startDate, endDate); } - async generateMonthlyReport(date: Date = new Date()): Promise { + async generateMonthlyReport( + date: Date = new Date(), + ): Promise { const startDate = new Date(date.getFullYear(), date.getMonth(), 1); - const endDate = new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999); + const endDate = new Date( + date.getFullYear(), + date.getMonth() + 1, + 0, + 23, + 59, + 59, + 999, + ); return this.generateReport('monthly', startDate, endDate); } - async generateQuarterlyReport(date: Date = new Date()): Promise { + async generateQuarterlyReport( + date: Date = new Date(), + ): Promise { const quarter = Math.floor(date.getMonth() / 3); const startDate = new Date(date.getFullYear(), quarter * 3, 1); - const endDate = new Date(date.getFullYear(), (quarter + 1) * 3, 0, 23, 59, 59, 999); + const endDate = new Date( + date.getFullYear(), + (quarter + 1) * 3, + 0, + 23, + 59, + 59, + 999, + ); return this.generateReport('quarterly', startDate, endDate); } - async generateAnnualReport(date: Date = new Date()): Promise { + async generateAnnualReport( + date: Date = new Date(), + ): Promise { const startDate = new Date(date.getFullYear(), 0, 1); const endDate = new Date(date.getFullYear(), 11, 31, 23, 59, 59, 999); @@ -229,7 +290,11 @@ export class ComplianceReport { const violations: ComplianceViolation[] = []; for (const requirement of regulation.requirements) { - const check = await this.validateRequirement(requirement, startDate, endDate); + const check = await this.validateRequirement( + requirement, + startDate, + endDate, + ); checks.push(check); if (check.status === 'non_compliant') { @@ -239,13 +304,18 @@ export class ComplianceReport { requirementId: requirement.id, severity: this.getViolationSeverity(requirement), description: check.details, - affectedRecords: await this.countAffectedRecords(requirement, startDate, endDate), + affectedRecords: await this.countAffectedRecords( + requirement, + startDate, + endDate, + ), detectedAt: new Date(), }); } } - const overallScore = checks.reduce((sum, check) => sum + check.score, 0) / checks.length; + const overallScore = + checks.reduce((sum, check) => sum + check.score, 0) / checks.length; return { regulation, @@ -255,7 +325,10 @@ export class ComplianceReport { }; } - async generateComplianceDashboard(startDate: Date, endDate: Date): Promise<{ + async generateComplianceDashboard( + startDate: Date, + endDate: Date, + ): Promise<{ overview: { totalRegulations: number; compliantRegulations: number; @@ -292,21 +365,37 @@ export class ComplianceReport { const regulationResults = []; for (const regulation of regulations) { - const result = await this.checkCompliance(regulation.id, startDate, endDate); + const result = await this.checkCompliance( + regulation.id, + startDate, + endDate, + ); regulationResults.push({ id: regulation.id, name: regulation.name, jurisdiction: regulation.jurisdiction, score: result.overallScore, violations: result.violations.length, - status: result.overallScore >= 80 ? 'compliant' : result.overallScore >= 60 ? 'pending' : 'non_compliant', + status: + result.overallScore >= 80 + ? 'compliant' + : result.overallScore >= 60 + ? 'pending' + : 'non_compliant', }); } const totalRegulations = regulations.length; - const compliantRegulations = regulationResults.filter(r => r.status === 'compliant').length; - const overallScore = regulationResults.reduce((sum, r) => sum + r.score, 0) / regulationResults.length; - const violationsCount = regulationResults.reduce((sum, r) => sum + r.violations, 0); + const compliantRegulations = regulationResults.filter( + (r) => r.status === 'compliant', + ).length; + const overallScore = + regulationResults.reduce((sum, r) => sum + r.score, 0) / + regulationResults.length; + const violationsCount = regulationResults.reduce( + (sum, r) => sum + r.violations, + 0, + ); return { overview: { @@ -356,27 +445,30 @@ export class ComplianceReport { } private async generateSummary(startDate: Date, endDate: Date): Promise { - const [totalAuditLogs, totalTransactions, totalVolume, errorRate] = await Promise.all([ - this.auditLogRepository.count({ - where: { createdAt: Between(startDate, endDate) }, - }), - this.transactionLogRepository.count({ - where: { createdAt: Between(startDate, endDate) }, - }), - this.transactionLogRepository - .createQueryBuilder('transaction') - .where('transaction.createdAt >= :startDate', { startDate }) - .andWhere('transaction.createdAt <= :endDate', { endDate }) - .select(['SUM(transaction.amount)']) - .getRawOne(), - this.calculateErrorRate(startDate, endDate), - ]); - - const [complianceScore, riskScore, retentionCompliance] = await Promise.all([ - this.calculateComplianceScore(startDate, endDate), - this.calculateRiskScore(startDate, endDate), - this.calculateRetentionCompliance(startDate, endDate), - ]); + const [totalAuditLogs, totalTransactions, totalVolume, errorRate] = + await Promise.all([ + this.auditLogRepository.count({ + where: { createdAt: Between(startDate, endDate) }, + }), + this.transactionLogRepository.count({ + where: { createdAt: Between(startDate, endDate) }, + }), + this.transactionLogRepository + .createQueryBuilder('transaction') + .where('transaction.createdAt >= :startDate', { startDate }) + .andWhere('transaction.createdAt <= :endDate', { endDate }) + .select(['SUM(transaction.amount)']) + .getRawOne(), + this.calculateErrorRate(startDate, endDate), + ]); + + const [complianceScore, riskScore, retentionCompliance] = await Promise.all( + [ + this.calculateComplianceScore(startDate, endDate), + this.calculateRiskScore(startDate, endDate), + this.calculateRetentionCompliance(startDate, endDate), + ], + ); return { totalAuditLogs, @@ -389,13 +481,17 @@ export class ComplianceReport { }; } - private async generateAuditMetrics(startDate: Date, endDate: Date): Promise { - const [logsByAction, logsByResource, logsBySeverity, avgExecutionTime] = await Promise.all([ - this.getLogsByAction(startDate, endDate), - this.getLogsByResource(startDate, endDate), - this.getLogsBySeverity(startDate, endDate), - this.calculateAverageExecutionTime(startDate, endDate), - ]); + private async generateAuditMetrics( + startDate: Date, + endDate: Date, + ): Promise { + const [logsByAction, logsByResource, logsBySeverity, avgExecutionTime] = + await Promise.all([ + this.getLogsByAction(startDate, endDate), + this.getLogsByResource(startDate, endDate), + this.getLogsBySeverity(startDate, endDate), + this.calculateAverageExecutionTime(startDate, endDate), + ]); const [sensitiveDataLogs, encryptedLogs] = await Promise.all([ this.countSensitiveDataLogs(startDate, endDate), @@ -412,12 +508,16 @@ export class ComplianceReport { }; } - private async generateTransactionMetrics(startDate: Date, endDate: Date): Promise { - const [transactionsByType, transactionsByStatus, avgAmount] = await Promise.all([ - this.getTransactionsByType(startDate, endDate), - this.getTransactionsByStatus(startDate, endDate), - this.calculateAverageAmount(startDate, endDate), - ]); + private async generateTransactionMetrics( + startDate: Date, + endDate: Date, + ): Promise { + const [transactionsByType, transactionsByStatus, avgAmount] = + await Promise.all([ + this.getTransactionsByType(startDate, endDate), + this.getTransactionsByStatus(startDate, endDate), + this.calculateAverageAmount(startDate, endDate), + ]); const [totalFees, totalTaxes] = await Promise.all([ this.calculateTotalFees(startDate, endDate), @@ -433,38 +533,55 @@ export class ComplianceReport { }; } - private async generateComplianceMetrics(startDate: Date, endDate: Date): Promise { + private async generateComplianceMetrics( + startDate: Date, + endDate: Date, + ): Promise { const regulations = await this.getActiveRegulations(); const regulationResults = []; for (const regulation of regulations) { - const result = await this.checkCompliance(regulation.id, startDate, endDate); + const result = await this.checkCompliance( + regulation.id, + startDate, + endDate, + ); regulationResults.push(result); } - const violations = regulationResults.flatMap(r => r.violations); + const violations = regulationResults.flatMap((r) => r.violations); const recommendations = this.generateRecommendations(violations); return { - regulations: regulationResults.map(r => ({ + regulations: regulationResults.map((r) => ({ name: r.regulation.name, jurisdiction: r.regulation.jurisdiction, requirements: r.regulation.requirements, compliant: r.overallScore >= 80, - violations: r.violations.map(v => ({ + violations: r.violations.map((v) => ({ requirement: v.requirementId, severity: v.severity, description: v.description, count: v.affectedRecords, })), })), - overallScore: regulationResults.reduce((sum, r) => sum + r.overallScore, 0) / regulationResults.length, + overallScore: + regulationResults.reduce((sum, r) => sum + r.overallScore, 0) / + regulationResults.length, recommendations, }; } - private async generatePrivacyMetrics(startDate: Date, endDate: Date): Promise { - const [dataClassification, redactionApplied, consentRecords, retentionPolicies] = await Promise.all([ + private async generatePrivacyMetrics( + startDate: Date, + endDate: Date, + ): Promise { + const [ + dataClassification, + redactionApplied, + consentRecords, + retentionPolicies, + ] = await Promise.all([ this.getDataClassificationMetrics(startDate, endDate), this.countRedactionApplied(startDate, endDate), this.countConsentRecords(startDate, endDate), @@ -479,8 +596,16 @@ export class ComplianceReport { }; } - private async generateSecurityMetrics(startDate: Date, endDate: Date): Promise { - const [authenticationEvents, accessDeniedEvents, securityViolations, threatDetections] = await Promise.all([ + private async generateSecurityMetrics( + startDate: Date, + endDate: Date, + ): Promise { + const [ + authenticationEvents, + accessDeniedEvents, + securityViolations, + threatDetections, + ] = await Promise.all([ this.countAuthenticationEvents(startDate, endDate), this.countAccessDeniedEvents(startDate, endDate), this.countSecurityViolations(startDate, endDate), @@ -495,13 +620,17 @@ export class ComplianceReport { }; } - private async generatePerformanceMetrics(startDate: Date, endDate: Date): Promise { - const [avgResponseTime, throughput, systemUptime, errorRate] = await Promise.all([ - this.calculateAverageResponseTime(startDate, endDate), - this.calculateThroughput(startDate, endDate), - this.calculateSystemUptime(startDate, endDate), - this.calculateErrorRate(startDate, endDate), - ]); + private async generatePerformanceMetrics( + startDate: Date, + endDate: Date, + ): Promise { + const [avgResponseTime, throughput, systemUptime, errorRate] = + await Promise.all([ + this.calculateAverageResponseTime(startDate, endDate), + this.calculateThroughput(startDate, endDate), + this.calculateSystemUptime(startDate, endDate), + this.calculateErrorRate(startDate, endDate), + ]); return { avgResponseTime, @@ -511,8 +640,16 @@ export class ComplianceReport { }; } - private async generateRiskMetrics(startDate: Date, endDate: Date): Promise { - const [highRiskTransactions, suspiciousActivities, complianceViolations, riskScore] = await Promise.all([ + private async generateRiskMetrics( + startDate: Date, + endDate: Date, + ): Promise { + const [ + highRiskTransactions, + suspiciousActivities, + complianceViolations, + riskScore, + ] = await Promise.all([ this.countHighRiskTransactions(startDate, endDate), this.countSuspiciousActivities(startDate, endDate), this.countComplianceViolations(startDate, endDate), @@ -532,10 +669,12 @@ export class ComplianceReport { return `compliance_${reportType}_${dateStr}_${Date.now()}`; } - private async getRegulation(regulationId: string): Promise { + private async getRegulation( + regulationId: string, + ): Promise { // This would fetch from a database or configuration const regulations: Record = { - 'sox': { + sox: { id: 'sox', name: 'Sarbanes-Oxley Act', jurisdiction: 'US', @@ -544,22 +683,26 @@ export class ComplianceReport { { id: 'sox_404', name: 'Section 404 - Internal Controls', - description: 'Establish and maintain internal controls over financial reporting', + description: + 'Establish and maintain internal controls over financial reporting', mandatory: true, - validation: 'audit_trail_exists && audit_trail_immutable && audit_trail_complete', + validation: + 'audit_trail_exists && audit_trail_immutable && audit_trail_complete', }, { id: 'sox_302', name: 'Section 302 - Corporate Responsibility', - description: 'Ensure financial statements are accurate and complete', + description: + 'Ensure financial statements are accurate and complete', mandatory: true, - validation: 'transaction_integrity_verified && no_material_weaknesses', + validation: + 'transaction_integrity_verified && no_material_weaknesses', }, ], lastUpdated: new Date(), isActive: true, }, - 'gdpr': { + gdpr: { id: 'gdpr', name: 'General Data Protection Regulation', jurisdiction: 'EU', @@ -568,16 +711,19 @@ export class ComplianceReport { { id: 'gdpr_32', name: 'Security of Processing', - description: 'Implement appropriate technical and organizational measures', + description: + 'Implement appropriate technical and organizational measures', mandatory: true, - validation: 'data_encryption_enabled && access_controls_implemented && security_incidents_logged', + validation: + 'data_encryption_enabled && access_controls_implemented && security_incidents_logged', }, { id: 'gdpr_25', name: 'Data Protection by Design and Default', description: 'Implement data protection principles from the start', mandatory: true, - validation: 'privacy_by_design && data_minimization && consent_management', + validation: + 'privacy_by_design && data_minimization && consent_management', }, ], lastUpdated: new Date(), @@ -588,7 +734,11 @@ export class ComplianceReport { return regulations[regulationId] || regulations['sox']; } - private async validateRequirement(requirement: any, startDate: Date, endDate: Date): Promise { + private async validateRequirement( + requirement: any, + startDate: Date, + endDate: Date, + ): Promise { const validation = requirement.validation; let status: 'compliant' | 'non_compliant' | 'pending' = 'pending'; let score = 0; @@ -600,7 +750,7 @@ export class ComplianceReport { const auditLogsCount = await this.auditLogRepository.count({ where: { createdAt: Between(startDate, endDate) }, }); - + if (auditLogsCount > 0) { score += 50; details += 'Audit trail exists. '; @@ -612,12 +762,12 @@ export class ComplianceReport { if (validation.includes('audit_trail_immutable')) { // Check if audit logs have checksums and signatures const immutableLogs = await this.auditLogRepository.count({ - where: { + where: { createdAt: Between(startDate, endDate), checksum: MoreThan(''), }, }); - + if (immutableLogs > 0) { score += 50; details += 'Audit trail is immutable. '; @@ -626,7 +776,8 @@ export class ComplianceReport { } } - status = score >= 80 ? 'compliant' : score >= 60 ? 'pending' : 'non_compliant'; + status = + score >= 80 ? 'compliant' : score >= 60 ? 'pending' : 'non_compliant'; return { regulationId: 'sox', @@ -639,12 +790,18 @@ export class ComplianceReport { }; } - private async countAffectedRecords(requirement: any, startDate: Date, endDate: Date): Promise { + private async countAffectedRecords( + requirement: any, + startDate: Date, + endDate: Date, + ): Promise { // This would count records affected by non-compliance return 0; } - private getViolationSeverity(requirement: any): 'low' | 'medium' | 'high' | 'critical' { + private getViolationSeverity( + requirement: any, + ): 'low' | 'medium' | 'high' | 'critical' { return requirement.mandatory ? 'high' : 'medium'; } @@ -654,13 +811,13 @@ export class ComplianceReport { private async getActiveRegulations(): Promise { // This would fetch from database - return [ - await this.getRegulation('sox'), - await this.getRegulation('gdpr'), - ]; + return [await this.getRegulation('sox'), await this.getRegulation('gdpr')]; } - private async generateComplianceTrends(startDate: Date, endDate: Date): Promise<{ + private async generateComplianceTrends( + startDate: Date, + endDate: Date, + ): Promise<{ scores: Array<{ date: Date; score: number }>; violations: Array<{ date: Date; count: number }>; }> { @@ -684,12 +841,17 @@ export class ComplianceReport { return { scores, violations }; } - private async generateComplianceAlerts(startDate: Date, endDate: Date): Promise> { + private async generateComplianceAlerts( + startDate: Date, + endDate: Date, + ): Promise< + Array<{ + type: string; + severity: string; + message: string; + timestamp: Date; + }> + > { // This would generate alerts based on compliance issues return [ { @@ -719,12 +881,16 @@ export class ComplianceReport { private generateRecommendations(violations: ComplianceViolation[]): string[] { const recommendations = []; - if (violations.some(v => v.severity === 'critical')) { - recommendations.push('Immediate action required for critical compliance violations'); + if (violations.some((v) => v.severity === 'critical')) { + recommendations.push( + 'Immediate action required for critical compliance violations', + ); } - if (violations.some(v => v.severity === 'high')) { - recommendations.push('Review and remediate high-priority compliance issues'); + if (violations.some((v) => v.severity === 'high')) { + recommendations.push( + 'Review and remediate high-priority compliance issues', + ); } if (violations.length > 10) { @@ -735,7 +901,10 @@ export class ComplianceReport { } // Helper methods for metrics calculation - private async calculateErrorRate(startDate: Date, endDate: Date): Promise { + private async calculateErrorRate( + startDate: Date, + endDate: Date, + ): Promise { const totalLogs = await this.auditLogRepository.count({ where: { createdAt: Between(startDate, endDate) }, }); @@ -750,77 +919,122 @@ export class ComplianceReport { return totalLogs > 0 ? (errorLogs / totalLogs) * 100 : 0; } - private async calculateComplianceScore(startDate: Date, endDate: Date): Promise { + private async calculateComplianceScore( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 85 + Math.random() * 15; } - private async calculateRiskScore(startDate: Date, endDate: Date): Promise { + private async calculateRiskScore( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 20 + Math.random() * 30; } - private async calculateRetentionCompliance(startDate: Date, endDate: Date): Promise { + private async calculateRetentionCompliance( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 90 + Math.random() * 10; } - private async getLogsByAction(startDate: Date, endDate: Date): Promise> { + private async getLogsByAction( + startDate: Date, + endDate: Date, + ): Promise> { // Placeholder implementation return {} as Record; } - private async getLogsByResource(startDate: Date, endDate: Date): Promise> { + private async getLogsByResource( + startDate: Date, + endDate: Date, + ): Promise> { // Placeholder implementation return {} as Record; } - private async getLogsBySeverity(startDate: Date, endDate: Date): Promise> { + private async getLogsBySeverity( + startDate: Date, + endDate: Date, + ): Promise> { // Placeholder implementation return {} as Record; } - private async calculateAverageExecutionTime(startDate: Date, endDate: Date): Promise { + private async calculateAverageExecutionTime( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 100 + Math.random() * 50; } - private async countSensitiveDataLogs(startDate: Date, endDate: Date): Promise { + private async countSensitiveDataLogs( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 100); } - private async countEncryptedLogs(startDate: Date, endDate: Date): Promise { + private async countEncryptedLogs( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 50); } - private async getTransactionsByType(startDate: Date, endDate: Date): Promise> { + private async getTransactionsByType( + startDate: Date, + endDate: Date, + ): Promise> { // Placeholder implementation return {} as Record; } - private async getTransactionsByStatus(startDate: Date, endDate: Date): Promise> { + private async getTransactionsByStatus( + startDate: Date, + endDate: Date, + ): Promise> { // Placeholder implementation return {} as Record; } - private async calculateAverageAmount(startDate: Date, endDate: Date): Promise { + private async calculateAverageAmount( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 1000 + Math.random() * 5000; } - private async calculateTotalFees(startDate: Date, endDate: Date): Promise { + private async calculateTotalFees( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.random() * 10000; } - private async calculateTotalTaxes(startDate: Date, endDate: Date): Promise { + private async calculateTotalTaxes( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.random() * 5000; } - private async getDataClassificationMetrics(startDate: Date, endDate: Date): Promise> { + private async getDataClassificationMetrics( + startDate: Date, + endDate: Date, + ): Promise> { // Placeholder implementation return { public: Math.floor(Math.random() * 100), @@ -830,17 +1044,26 @@ export class ComplianceReport { }; } - private async countRedactionApplied(startDate: Date, endDate: Date): Promise { + private async countRedactionApplied( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 25); } - private async countConsentRecords(startDate: Date, endDate: Date): Promise { + private async countConsentRecords( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 150); } - private async getRetentionPolicyMetrics(startDate: Date, endDate: Date): Promise> { + private async getRetentionPolicyMetrics( + startDate: Date, + endDate: Date, + ): Promise> { // Placeholder implementation return { '1_year': Math.floor(Math.random() * 100), @@ -850,67 +1073,106 @@ export class ComplianceReport { }; } - private async countAuthenticationEvents(startDate: Date, endDate: Date): Promise { + private async countAuthenticationEvents( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 500); } - private async countAccessDeniedEvents(startDate: Date, endDate: Date): Promise { + private async countAccessDeniedEvents( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 50); } - private async countSecurityViolations(startDate: Date, endDate: Date): Promise { + private async countSecurityViolations( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 10); } - private async countThreatDetections(startDate: Date, endDate: Date): Promise { + private async countThreatDetections( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 5); } - private async calculateAverageResponseTime(startDate: Date, endDate: Date): Promise { + private async calculateAverageResponseTime( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 150 + Math.random() * 100; } - private async calculateThroughput(startDate: Date, endDate: Date): Promise { + private async calculateThroughput( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 1000 + Math.random() * 500; } - private async calculateSystemUptime(startDate: Date, endDate: Date): Promise { + private async calculateSystemUptime( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 99.5 + Math.random() * 0.5; } - private async countHighRiskTransactions(startDate: Date, endDate: Date): Promise { + private async countHighRiskTransactions( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 20); } - private async countSuspiciousActivities(startDate: Date, endDate: Date): Promise { + private async countSuspiciousActivities( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 15); } - private async countComplianceViolations(startDate: Date, endDate: Date): Promise { + private async countComplianceViolations( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return Math.floor(Math.random() * 10); } - private async calculateAverageResponseTime(startDate: Date, endDate: Date): Promise { + private async calculateAverageResponseTime( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 150 + Math.random() * 100; } - private async calculateThroughput(startDate: Date, endDate: Date): Promise { + private async calculateThroughput( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 1000 + Math.random() * 500; } - private async calculateSystemUptime(startDate: Date, endDate: Date): Promise { + private async calculateSystemUptime( + startDate: Date, + endDate: Date, + ): Promise { // Placeholder implementation return 99.5 + Math.random() * 0.5; } diff --git a/src/carbon/analytics/reduction-analytics.service.ts b/src/carbon/analytics/reduction-analytics.service.ts index f3d6f96..6077871 100644 --- a/src/carbon/analytics/reduction-analytics.service.ts +++ b/src/carbon/analytics/reduction-analytics.service.ts @@ -14,7 +14,7 @@ export class ReductionAnalyticsService { }, { area: 'Renewable Integration', - potentialReduction: 0.40, + potentialReduction: 0.4, implementationCost: 150000, paybackPeriod: 36, }, @@ -23,7 +23,7 @@ export class ReductionAnalyticsService { async trackReductionProgress(targetPercent: number): Promise { const currentReduction = 0.22; // 22% achieved - + return { target: targetPercent, current: currentReduction, diff --git a/src/carbon/calculations/emission-calculator.service.ts b/src/carbon/calculations/emission-calculator.service.ts index bdd5979..53f846c 100644 --- a/src/carbon/calculations/emission-calculator.service.ts +++ b/src/carbon/calculations/emission-calculator.service.ts @@ -31,14 +31,22 @@ export class EmissionCalculatorService { }; } - calculateTransactionCarbonFootprint(transactionData: any): { emissions: number; intensity: number } { + calculateTransactionCarbonFootprint(transactionData: any): { + emissions: number; + intensity: number; + } { const { energyAmount, energySource, distance } = transactionData; // Calculate production emissions - const productionEmissions = this.calculateEmissions(energyAmount, energySource).emissions; + const productionEmissions = this.calculateEmissions( + energyAmount, + energySource, + ).emissions; // Calculate transportation emissions if applicable - const transportEmissions = distance ? this.calculateEmissions(distance, 'transportation').emissions : 0; + const transportEmissions = distance + ? this.calculateEmissions(distance, 'transportation').emissions + : 0; const totalEmissions = productionEmissions + transportEmissions; const intensity = energyAmount > 0 ? totalEmissions / energyAmount : 0; @@ -50,7 +58,9 @@ export class EmissionCalculatorService { } private getEmissionFactor(sourceType: string): number { - return this.emissionFactors[sourceType] || this.emissionFactors.grid_average; + return ( + this.emissionFactors[sourceType] || this.emissionFactors.grid_average + ); } validateCalculation(activityData: number, factor: number): boolean { diff --git a/src/carbon/carbon.controller.ts b/src/carbon/carbon.controller.ts index f7ca954..2d552a3 100644 --- a/src/carbon/carbon.controller.ts +++ b/src/carbon/carbon.controller.ts @@ -20,7 +20,10 @@ export class CarbonController { @Post('calculate') @ApiOperation({ summary: 'Calculate carbon emissions' }) async calculateEmissions(@Body() data: any): Promise { - const result = this.calculator.calculateEmissions(data.activityData, data.source); + const result = this.calculator.calculateEmissions( + data.activityData, + data.source, + ); return { ...result, timestamp: new Date() }; } @@ -59,7 +62,11 @@ export class CarbonController { @Get('footprint/transaction') @ApiOperation({ summary: 'Calculate transaction carbon footprint' }) - async getTransactionFootprint(@Query('data') transactionData: any): Promise { - return this.calculator.calculateTransactionCarbonFootprint(JSON.parse(transactionData)); + async getTransactionFootprint( + @Query('data') transactionData: any, + ): Promise { + return this.calculator.calculateTransactionCarbonFootprint( + JSON.parse(transactionData), + ); } } diff --git a/src/carbon/dto/carbon-calculation.dto.ts b/src/carbon/dto/carbon-calculation.dto.ts index d556ddb..7b319d9 100644 --- a/src/carbon/dto/carbon-calculation.dto.ts +++ b/src/carbon/dto/carbon-calculation.dto.ts @@ -1,5 +1,11 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsNumber, IsOptional, IsString, IsEnum, IsUUID } from 'class-validator'; +import { + IsNumber, + IsOptional, + IsString, + IsEnum, + IsUUID, +} from 'class-validator'; import { EmissionSource, UnitType } from '../entities/carbon-data.entity'; export class CarbonCalculationDto { @@ -11,7 +17,10 @@ export class CarbonCalculationDto { @IsNumber() activityData: number; - @ApiProperty({ description: 'Emission factor (kg CO2e per unit)', required: false }) + @ApiProperty({ + description: 'Emission factor (kg CO2e per unit)', + required: false, + }) @IsOptional() @IsNumber() emissionFactor?: number; diff --git a/src/carbon/entities/carbon-data.entity.ts b/src/carbon/entities/carbon-data.entity.ts index 7402b30..b23ff95 100644 --- a/src/carbon/entities/carbon-data.entity.ts +++ b/src/carbon/entities/carbon-data.entity.ts @@ -1,4 +1,10 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + Index, +} from 'typeorm'; export enum EmissionSource { ENERGY_PRODUCTION = 'energy_production', diff --git a/src/carbon/offsets/carbon-offset.service.ts b/src/carbon/offsets/carbon-offset.service.ts index 6e7952b..09e718a 100644 --- a/src/carbon/offsets/carbon-offset.service.ts +++ b/src/carbon/offsets/carbon-offset.service.ts @@ -4,8 +4,13 @@ import { Injectable, Logger } from '@nestjs/common'; export class CarbonOffsetService { private readonly logger = new Logger(CarbonOffsetService.name); - async purchaseOffset(amountTonnes: number, projectType: string): Promise { - this.logger.log(`Purchasing ${amountTonnes} tonnes of ${projectType} offsets`); + async purchaseOffset( + amountTonnes: number, + projectType: string, + ): Promise { + this.logger.log( + `Purchasing ${amountTonnes} tonnes of ${projectType} offsets`, + ); return { offsetId: `OFFSET-${Date.now()}`, @@ -19,9 +24,24 @@ export class CarbonOffsetService { async getAvailableProjects(): Promise { return [ - { id: 1, name: 'Solar Farm India', type: 'renewable_energy', pricePerTonne: 22 }, - { id: 2, name: 'Reforestation Brazil', type: 'forestry', pricePerTonne: 18 }, - { id: 3, name: 'Wind Farm Scotland', type: 'renewable_energy', pricePerTonne: 24 }, + { + id: 1, + name: 'Solar Farm India', + type: 'renewable_energy', + pricePerTonne: 22, + }, + { + id: 2, + name: 'Reforestation Brazil', + type: 'forestry', + pricePerTonne: 18, + }, + { + id: 3, + name: 'Wind Farm Scotland', + type: 'renewable_energy', + pricePerTonne: 24, + }, ]; } diff --git a/src/carbon/reporting/sustainability-report.service.ts b/src/carbon/reporting/sustainability-report.service.ts index 7920b47..2e11e2f 100644 --- a/src/carbon/reporting/sustainability-report.service.ts +++ b/src/carbon/reporting/sustainability-report.service.ts @@ -26,7 +26,7 @@ export class SustainabilityReportService { return { year, totalEmissions: 5200.8, - reductionTarget: 0.20, + reductionTarget: 0.2, actualReduction: 0.22, targetAchieved: true, }; diff --git a/src/carbon/tracking/real-time-tracker.service.ts b/src/carbon/tracking/real-time-tracker.service.ts index 8d6ae5f..d261b5f 100644 --- a/src/carbon/tracking/real-time-tracker.service.ts +++ b/src/carbon/tracking/real-time-tracker.service.ts @@ -17,7 +17,10 @@ export class RealTimeTrackerService { }; } - async getHistoricalData(timeRange: { start: Date; end: Date }): Promise { + async getHistoricalData(timeRange: { + start: Date; + end: Date; + }): Promise { return [ { timestamp: new Date(), emissions: 120 }, { timestamp: new Date(Date.now() - 900000), emissions: 125 }, diff --git a/src/classification/classification.module.ts b/src/classification/classification.module.ts index 4708353..ee88d49 100644 --- a/src/classification/classification.module.ts +++ b/src/classification/classification.module.ts @@ -1,6 +1,6 @@ /** * Classification Module - * + * * Module for managing energy classifications, quality ratings, and certifications. */ @@ -13,18 +13,9 @@ import { Certification } from './entities/certification.entity'; @Module({ imports: [ - TypeOrmModule.forFeature([ - EnergyCategory, - EnergyQuality, - Certification, - ]), - ], - providers: [ - ClassificationService, - ], - exports: [ - ClassificationService, - TypeOrmModule, + TypeOrmModule.forFeature([EnergyCategory, EnergyQuality, Certification]), ], + providers: [ClassificationService], + exports: [ClassificationService, TypeOrmModule], }) export class ClassificationModule {} diff --git a/src/classification/classification.service.ts b/src/classification/classification.service.ts index d5ab4ce..e55fd78 100644 --- a/src/classification/classification.service.ts +++ b/src/classification/classification.service.ts @@ -1,6 +1,6 @@ /** * Classification Service - * + * * Service for managing energy classifications, quality ratings, and certifications. */ @@ -83,7 +83,9 @@ export class ClassificationService implements OnModuleInit { } this.logger.log('Seeding default energy categories...'); - const categories = this.categoryRepository.create(DEFAULT_ENERGY_CATEGORIES); + const categories = this.categoryRepository.create( + DEFAULT_ENERGY_CATEGORIES, + ); await this.categoryRepository.save(categories); this.logger.log('Default energy categories seeded'); } @@ -99,10 +101,10 @@ export class ClassificationService implements OnModuleInit { } this.logger.log('Seeding default quality ratings...'); - + // Get all categories to link qualities const categories = await this.categoryRepository.find(); - + for (const quality of DEFAULT_QUALITY_RATINGS) { for (const category of categories) { const qualityEntity = this.qualityRepository.create({ @@ -112,7 +114,7 @@ export class ClassificationService implements OnModuleInit { await this.qualityRepository.save(qualityEntity); } } - + this.logger.log('Default quality ratings seeded'); } @@ -127,7 +129,9 @@ export class ClassificationService implements OnModuleInit { } this.logger.log('Seeding default certifications...'); - const certifications = this.certificationRepository.create(DEFAULT_CERTIFICATIONS); + const certifications = this.certificationRepository.create( + DEFAULT_CERTIFICATIONS, + ); await this.certificationRepository.save(certifications); this.logger.log('Default certifications seeded'); } @@ -179,7 +183,9 @@ export class ClassificationService implements OnModuleInit { relations: ['qualities', 'certifications'], }); if (!category) { - throw new NotFoundException(`Category with energy type ${energyType} not found`); + throw new NotFoundException( + `Category with energy type ${energyType} not found`, + ); } return category; } @@ -194,17 +200,29 @@ export class ClassificationService implements OnModuleInit { limit: number; totalPages: number; }> { - const { page = 1, limit = 10, search, isRenewable, isActive, energyType, tags } = filter; + const { + page = 1, + limit = 10, + search, + isRenewable, + isActive, + energyType, + tags, + } = filter; const skip = (page - 1) * limit; const queryBuilder = this.categoryRepository.createQueryBuilder('category'); if (energyType) { - queryBuilder.andWhere('category.energyType = :energyType', { energyType }); + queryBuilder.andWhere('category.energyType = :energyType', { + energyType, + }); } if (isRenewable !== undefined) { - queryBuilder.andWhere('category.isRenewable = :isRenewable', { isRenewable }); + queryBuilder.andWhere('category.isRenewable = :isRenewable', { + isRenewable, + }); } if (isActive !== undefined) { @@ -222,10 +240,7 @@ export class ClassificationService implements OnModuleInit { queryBuilder.andWhere('category.tags && :tags', { tags }); } - queryBuilder - .orderBy('category.sortOrder', 'ASC') - .skip(skip) - .take(limit); + queryBuilder.orderBy('category.sortOrder', 'ASC').skip(skip).take(limit); const [categories, total] = await queryBuilder.getManyAndCount(); @@ -270,9 +285,8 @@ export class ClassificationService implements OnModuleInit { name: category.name, priceMultiplier: Number(category.priceMultiplier), isRenewable: category.isRenewable, - children: children.length > 0 - ? await this.buildCategoryTree(children) - : [], + children: + children.length > 0 ? await this.buildCategoryTree(children) : [], }); } @@ -348,16 +362,23 @@ export class ClassificationService implements OnModuleInit { /** * List quality ratings with filters */ - async listQualityRatings( - filter: QualityRatingFilterDto, - ): Promise<{ + async listQualityRatings(filter: QualityRatingFilterDto): Promise<{ qualities: EnergyQuality[]; total: number; page: number; limit: number; totalPages: number; }> { - const { page = 1, limit = 10, search, rating, tier, categoryId, isVerified, isActive } = filter; + const { + page = 1, + limit = 10, + search, + rating, + tier, + categoryId, + isVerified, + isActive, + } = filter; const skip = (page - 1) * limit; const queryBuilder = this.qualityRepository.createQueryBuilder('quality'); @@ -389,10 +410,7 @@ export class ClassificationService implements OnModuleInit { ); } - queryBuilder - .orderBy('quality.sortOrder', 'ASC') - .skip(skip) - .take(limit); + queryBuilder.orderBy('quality.sortOrder', 'ASC').skip(skip).take(limit); const [qualities, total] = await queryBuilder.getManyAndCount(); @@ -456,7 +474,9 @@ export class ClassificationService implements OnModuleInit { /** * Get certification by type */ - async getCertificationByType(type: CertificationType): Promise { + async getCertificationByType( + type: CertificationType, + ): Promise { const certification = await this.certificationRepository.findOne({ where: { type }, }); @@ -469,9 +489,7 @@ export class ClassificationService implements OnModuleInit { /** * List certifications with filters */ - async listCertifications( - filter: CertificationFilterDto, - ): Promise<{ + async listCertifications(filter: CertificationFilterDto): Promise<{ certifications: Certification[]; total: number; page: number; @@ -490,7 +508,8 @@ export class ClassificationService implements OnModuleInit { } = filter; const skip = (page - 1) * limit; - const queryBuilder = this.certificationRepository.createQueryBuilder('cert'); + const queryBuilder = + this.certificationRepository.createQueryBuilder('cert'); if (type) { queryBuilder.andWhere('cert.type = :type', { type }); @@ -509,7 +528,9 @@ export class ClassificationService implements OnModuleInit { } if (validOnly) { - queryBuilder.andWhere('cert.status = :active', { active: CertificationStatus.ACTIVE }); + queryBuilder.andWhere('cert.status = :active', { + active: CertificationStatus.ACTIVE, + }); queryBuilder.andWhere('cert.validFrom <= :now', { now: new Date() }); queryBuilder.andWhere( '(cert.validUntil IS NULL OR cert.validUntil >= :now)', @@ -524,10 +545,7 @@ export class ClassificationService implements OnModuleInit { ); } - queryBuilder - .orderBy('cert.name', 'ASC') - .skip(skip) - .take(limit); + queryBuilder.orderBy('cert.name', 'ASC').skip(skip).take(limit); const [certifications, total] = await queryBuilder.getManyAndCount(); @@ -588,14 +606,22 @@ export class ClassificationService implements OnModuleInit { /** * Calculate price with all adjustments */ - async calculatePrice(dto: CalculatePriceDto): Promise { - const { basePrice, energyType, qualityMultiplier = 1.0, certificationMultiplier = 1.0 } = dto; + async calculatePrice( + dto: CalculatePriceDto, + ): Promise { + const { + basePrice, + energyType, + qualityMultiplier = 1.0, + certificationMultiplier = 1.0, + } = dto; // Get category for additional multiplier const category = await this.getCategoryByEnergyType(energyType); const categoryMultiplier = Number(category.priceMultiplier); - const totalMultiplier = categoryMultiplier * qualityMultiplier * certificationMultiplier; + const totalMultiplier = + categoryMultiplier * qualityMultiplier * certificationMultiplier; const adjustedPrice = basePrice * totalMultiplier; return { @@ -632,13 +658,12 @@ export class ClassificationService implements OnModuleInit { ); if (isRenewable !== undefined) { - queryBuilder.andWhere('category.isRenewable = :isRenewable', { isRenewable }); + queryBuilder.andWhere('category.isRenewable = :isRenewable', { + isRenewable, + }); } - queryBuilder - .orderBy('category.name', 'ASC') - .skip(skip) - .take(limit); + queryBuilder.orderBy('category.name', 'ASC').skip(skip).take(limit); const [categories, total] = await queryBuilder.getManyAndCount(); diff --git a/src/classification/dto/category.dto.ts b/src/classification/dto/category.dto.ts index 9e87578..3c7717c 100644 --- a/src/classification/dto/category.dto.ts +++ b/src/classification/dto/category.dto.ts @@ -1,6 +1,6 @@ /** * Category DTOs - * + * * Data Transfer Objects for energy category operations. */ @@ -94,27 +94,42 @@ export class UpdateCategoryDto extends PartialType(CreateCategoryDto) { * Category filter DTO */ export class CategoryFilterDto { - @ApiPropertyOptional({ enum: EnergyType, description: 'Filter by energy type' }) + @ApiPropertyOptional({ + enum: EnergyType, + description: 'Filter by energy type', + }) @IsEnum(EnergyType) @IsOptional() energyType?: EnergyType; - @ApiPropertyOptional({ enum: EnergySubType, description: 'Filter by sub-type' }) + @ApiPropertyOptional({ + enum: EnergySubType, + description: 'Filter by sub-type', + }) @IsEnum(EnergySubType) @IsOptional() subType?: EnergySubType; - @ApiPropertyOptional({ example: true, description: 'Filter by renewable status' }) + @ApiPropertyOptional({ + example: true, + description: 'Filter by renewable status', + }) @IsBoolean() @IsOptional() isRenewable?: boolean; - @ApiPropertyOptional({ example: true, description: 'Filter by active status' }) + @ApiPropertyOptional({ + example: true, + description: 'Filter by active status', + }) @IsBoolean() @IsOptional() isActive?: boolean; - @ApiPropertyOptional({ example: 'solar', description: 'Search by name or description' }) + @ApiPropertyOptional({ + example: 'solar', + description: 'Search by name or description', + }) @IsString() @IsOptional() search?: string; diff --git a/src/classification/dto/quality-rating.dto.ts b/src/classification/dto/quality-rating.dto.ts index b5cae15..1653c65 100644 --- a/src/classification/dto/quality-rating.dto.ts +++ b/src/classification/dto/quality-rating.dto.ts @@ -1,6 +1,6 @@ /** * Quality Rating DTOs - * + * * Data Transfer Objects for energy quality rating operations. */ @@ -20,7 +20,10 @@ import { } from 'class-validator'; import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger'; import { QualityRating, QualityTier } from '../entities/energy-quality.entity'; -import { CertificationType, CertificationStatus } from '../entities/certification.entity'; +import { + CertificationType, + CertificationStatus, +} from '../entities/certification.entity'; import { CategoryResponseDto } from './category.dto'; /** @@ -74,7 +77,10 @@ export class CreateQualityRatingDto { @Max(100) efficiencyMax: number; - @ApiPropertyOptional({ example: 99, description: 'Minimum purity percentage' }) + @ApiPropertyOptional({ + example: 99, + description: 'Minimum purity percentage', + }) @IsNumber() @IsOptional() @Min(0) @@ -86,7 +92,10 @@ export class CreateQualityRatingDto { @IsOptional() isVerified?: boolean; - @ApiPropertyOptional({ example: 'ISO 50001', description: 'Verification standard' }) + @ApiPropertyOptional({ + example: 'ISO 50001', + description: 'Verification standard', + }) @IsString() @IsOptional() verificationStandard?: string; @@ -98,7 +107,10 @@ export class CreateQualityRatingDto { @Max(999) sortOrder?: number; - @ApiPropertyOptional({ example: ['premium', 'high-efficiency'], description: 'Tags' }) + @ApiPropertyOptional({ + example: ['premium', 'high-efficiency'], + description: 'Tags', + }) @IsArray() @IsString({ each: true }) @IsOptional() @@ -112,7 +124,9 @@ export class CreateQualityRatingDto { /** * Update quality rating DTO */ -export class UpdateQualityRatingDto extends PartialType(CreateQualityRatingDto) { +export class UpdateQualityRatingDto extends PartialType( + CreateQualityRatingDto, +) { @ApiPropertyOptional({ example: true, description: 'Is active' }) @IsBoolean() @IsOptional() @@ -138,17 +152,26 @@ export class QualityRatingFilterDto { @IsOptional() categoryId?: string; - @ApiPropertyOptional({ example: true, description: 'Filter by verified status' }) + @ApiPropertyOptional({ + example: true, + description: 'Filter by verified status', + }) @IsBoolean() @IsOptional() isVerified?: boolean; - @ApiPropertyOptional({ example: true, description: 'Filter by active status' }) + @ApiPropertyOptional({ + example: true, + description: 'Filter by active status', + }) @IsBoolean() @IsOptional() isActive?: boolean; - @ApiPropertyOptional({ example: 'premium', description: 'Search by name or description' }) + @ApiPropertyOptional({ + example: 'premium', + description: 'Search by name or description', + }) @IsString() @IsOptional() search?: string; @@ -204,7 +227,10 @@ export class QualityRatingResponseDto { @ApiProperty({ example: true, description: 'Is verified' }) isVerified: boolean; - @ApiPropertyOptional({ example: 'ISO 50001', description: 'Verification standard' }) + @ApiPropertyOptional({ + example: 'ISO 50001', + description: 'Verification standard', + }) verificationStandard: string; @ApiProperty({ example: true, description: 'Is active' }) @@ -235,7 +261,10 @@ export class CreateCertificationDto { @IsNotEmpty() type: CertificationType; - @ApiProperty({ example: 'Green Energy Certification', description: 'Certification name' }) + @ApiProperty({ + example: 'Green Energy Certification', + description: 'Certification name', + }) @IsString() @IsNotEmpty() @Length(1, 150) @@ -251,7 +280,10 @@ export class CreateCertificationDto { @IsOptional() categoryId?: string; - @ApiProperty({ example: 'Green Energy Standards Board', description: 'Issuing authority' }) + @ApiProperty({ + example: 'Green Energy Standards Board', + description: 'Issuing authority', + }) @IsString() @IsNotEmpty() @Length(1, 150) @@ -268,7 +300,10 @@ export class CreateCertificationDto { @IsNotEmpty() validFrom: string; - @ApiPropertyOptional({ example: '2025-12-31', description: 'Valid until date' }) + @ApiPropertyOptional({ + example: '2025-12-31', + description: 'Valid until date', + }) @IsDateString() @IsOptional() validUntil?: string; @@ -284,7 +319,10 @@ export class CreateCertificationDto { @Min(1) renewalPeriodDays?: number; - @ApiPropertyOptional({ example: 1.25, description: 'Price adjustment multiplier' }) + @ApiPropertyOptional({ + example: 1.25, + description: 'Price adjustment multiplier', + }) @IsNumber() @IsOptional() @Min(0.1) @@ -296,12 +334,18 @@ export class CreateCertificationDto { @IsOptional() isVerified?: boolean; - @ApiPropertyOptional({ example: 'Third-party audit', description: 'Verification method' }) + @ApiPropertyOptional({ + example: 'Third-party audit', + description: 'Verification method', + }) @IsString() @IsOptional() verificationMethod?: string; - @ApiPropertyOptional({ example: '/logos/green-energy.png', description: 'Logo URL' }) + @ApiPropertyOptional({ + example: '/logos/green-energy.png', + description: 'Logo URL', + }) @IsString() @IsOptional() logoUrl?: string; @@ -320,8 +364,13 @@ export class CreateCertificationDto { /** * Update certification DTO */ -export class UpdateCertificationDto extends PartialType(CreateCertificationDto) { - @ApiPropertyOptional({ enum: CertificationStatus, description: 'Certification status' }) +export class UpdateCertificationDto extends PartialType( + CreateCertificationDto, +) { + @ApiPropertyOptional({ + enum: CertificationStatus, + description: 'Certification status', + }) @IsEnum(CertificationStatus) @IsOptional() status?: CertificationStatus; @@ -331,12 +380,18 @@ export class UpdateCertificationDto extends PartialType(CreateCertificationDto) * Certification filter DTO */ export class CertificationFilterDto { - @ApiPropertyOptional({ enum: CertificationType, description: 'Filter by type' }) + @ApiPropertyOptional({ + enum: CertificationType, + description: 'Filter by type', + }) @IsEnum(CertificationType) @IsOptional() type?: CertificationType; - @ApiPropertyOptional({ enum: CertificationStatus, description: 'Filter by status' }) + @ApiPropertyOptional({ + enum: CertificationStatus, + description: 'Filter by status', + }) @IsEnum(CertificationStatus) @IsOptional() status?: CertificationStatus; @@ -346,17 +401,26 @@ export class CertificationFilterDto { @IsOptional() categoryId?: string; - @ApiPropertyOptional({ example: true, description: 'Filter by verified status' }) + @ApiPropertyOptional({ + example: true, + description: 'Filter by verified status', + }) @IsBoolean() @IsOptional() isVerified?: boolean; - @ApiPropertyOptional({ example: 'green', description: 'Search by name or description' }) + @ApiPropertyOptional({ + example: 'green', + description: 'Search by name or description', + }) @IsString() @IsOptional() search?: string; - @ApiPropertyOptional({ example: true, description: 'Filter only valid certifications' }) + @ApiPropertyOptional({ + example: true, + description: 'Filter only valid certifications', + }) @IsBoolean() @IsOptional() validOnly?: boolean; @@ -400,7 +464,10 @@ export class CertificationResponseDto { @ApiProperty({ description: 'Certification code' }) certificationCode: string; - @ApiProperty({ enum: CertificationStatus, description: 'Certification status' }) + @ApiProperty({ + enum: CertificationStatus, + description: 'Certification status', + }) status: CertificationStatus; @ApiProperty({ description: 'Valid from' }) @@ -421,10 +488,16 @@ export class CertificationResponseDto { @ApiProperty({ example: true, description: 'Is verified' }) isVerified: boolean; - @ApiPropertyOptional({ example: 'Third-party audit', description: 'Verification method' }) + @ApiPropertyOptional({ + example: 'Third-party audit', + description: 'Verification method', + }) verificationMethod: string; - @ApiPropertyOptional({ example: '/logos/green-energy.png', description: 'Logo URL' }) + @ApiPropertyOptional({ + example: '/logos/green-energy.png', + description: 'Logo URL', + }) logoUrl: string; @ApiProperty({ example: ['green', 'renewable'], description: 'Tags' }) diff --git a/src/classification/entities/certification.entity.ts b/src/classification/entities/certification.entity.ts index fa5f525..3c563aa 100644 --- a/src/classification/entities/certification.entity.ts +++ b/src/classification/entities/certification.entity.ts @@ -1,6 +1,6 @@ /** * Certification Entity - * + * * Defines certifications for energy sources (Green Energy, Carbon Neutral, etc.). */ @@ -63,11 +63,10 @@ export class Certification { @Column({ name: 'category_id', nullable: true }) categoryId: string; - @ManyToOne( - () => EnergyCategory, - (category) => category.certifications, - { nullable: true, onDelete: 'SET NULL' }, - ) + @ManyToOne(() => EnergyCategory, (category) => category.certifications, { + nullable: true, + onDelete: 'SET NULL', + }) @JoinColumn({ name: 'category_id' }) category: EnergyCategory; @@ -96,7 +95,13 @@ export class Certification { @Column({ name: 'renewal_period_days', nullable: true }) renewalPeriodDays: number; - @Column({ name: 'price_adjustment', type: 'decimal', precision: 5, scale: 2, default: 1.0 }) + @Column({ + name: 'price_adjustment', + type: 'decimal', + precision: 5, + scale: 2, + default: 1.0, + }) priceAdjustment: number; @Column({ name: 'is_verified', default: false }) @@ -131,7 +136,8 @@ export const DEFAULT_CERTIFICATIONS = [ { type: CertificationType.GREEN_ENERGY, name: 'Green Energy Certification', - description: 'Certifies that energy is generated from renewable sources with minimal environmental impact', + description: + 'Certifies that energy is generated from renewable sources with minimal environmental impact', issuingAuthority: 'Green Energy Standards Board', certificationCode: 'GEC-001', status: CertificationStatus.ACTIVE, @@ -148,7 +154,8 @@ export const DEFAULT_CERTIFICATIONS = [ { type: CertificationType.CARBON_NEUTRAL, name: 'Carbon Neutral Certification', - description: 'Certifies that net carbon emissions are zero through offset programs', + description: + 'Certifies that net carbon emissions are zero through offset programs', issuingAuthority: 'Carbon Neutral Alliance', certificationCode: 'CNC-001', status: CertificationStatus.ACTIVE, @@ -165,7 +172,8 @@ export const DEFAULT_CERTIFICATIONS = [ { type: CertificationType.RENEWABLE_ENERGY, name: 'Renewable Energy Certification', - description: 'Certifies that energy is sourced entirely from renewable sources', + description: + 'Certifies that energy is sourced entirely from renewable sources', issuingAuthority: 'International Renewable Energy Agency', certificationCode: 'REC-001', status: CertificationStatus.ACTIVE, @@ -219,13 +227,13 @@ export const isCertificationValid = (certification: Certification): boolean => { if (certification.status !== CertificationStatus.ACTIVE) { return false; } - + const now = new Date(); - + if (certification.validUntil) { return now >= certification.validFrom && now <= certification.validUntil; } - + return now >= certification.validFrom; }; @@ -236,15 +244,15 @@ export const needsRenewal = (certification: Certification): boolean => { if (!certification.isRecurring || !certification.renewalPeriodDays) { return false; } - + if (!certification.validUntil) { return false; } - + const daysUntilExpiry = Math.ceil( (certification.validUntil.getTime() - Date.now()) / (1000 * 60 * 60 * 24), ); - + return daysUntilExpiry <= 30; }; @@ -256,12 +264,12 @@ export const calculatePriceWithCertification = ( certifications: Certification[], ): number => { let multiplier = 1.0; - + for (const cert of certifications) { if (isCertificationValid(cert)) { multiplier *= Number(cert.priceAdjustment); } } - + return basePrice * multiplier; }; diff --git a/src/classification/entities/energy-category.entity.ts b/src/classification/entities/energy-category.entity.ts index f21c757..089f7b5 100644 --- a/src/classification/entities/energy-category.entity.ts +++ b/src/classification/entities/energy-category.entity.ts @@ -1,6 +1,6 @@ /** * Energy Category Entity - * + * * Defines the taxonomy for different energy types with hierarchical classification. */ @@ -40,16 +40,16 @@ export enum EnergySubType { PHOTOVOLTAIC = 'photovoltaic', CONCENTRATED_SOLAR = 'concentrated_solar', SOLAR_THERMAL = 'solar_thermal', - + // Wind subtypes ONSHORE_WIND = 'onshore_wind', OFFSHORE_WIND = 'offshore_wind', - + // Hydro subtypes RUN_OF_RIVER = 'run_of_river', RESERVOIR = 'reservoir', PUMPED_STORAGE = 'pumped_storage', - + // Biomass subtypes SOLID_BIOMASS = 'solid_biomass', LIQUID_BIOMASS = 'liquid_biomass', @@ -87,18 +87,13 @@ export class EnergyCategory { @Column({ name: 'parent_id', nullable: true }) parentId: string; - @ManyToOne( - () => EnergyCategory, - (category) => category.children, - { nullable: true }, - ) + @ManyToOne(() => EnergyCategory, (category) => category.children, { + nullable: true, + }) @JoinColumn({ name: 'parent_id' }) parent: EnergyCategory; - @OneToMany( - () => EnergyCategory, - (category) => category.parent, - ) + @OneToMany(() => EnergyCategory, (category) => category.parent) children: EnergyCategory[]; @Column({ type: 'decimal', precision: 5, scale: 2, default: 1.0 }) @@ -126,16 +121,10 @@ export class EnergyCategory { updatedAt: Date; // Relationships - @OneToMany( - () => EnergyQuality, - (quality) => quality.category, - ) + @OneToMany(() => EnergyQuality, (quality) => quality.category) qualities: EnergyQuality[]; - @OneToMany( - () => Certification, - (certification) => certification.category, - ) + @OneToMany(() => Certification, (certification) => certification.category) certifications: Certification[]; } @@ -146,7 +135,8 @@ export const DEFAULT_ENERGY_CATEGORIES = [ { energyType: EnergyType.SOLAR, name: 'Solar Energy', - description: 'Energy derived from sunlight through photovoltaic or thermal means', + description: + 'Energy derived from sunlight through photovoltaic or thermal means', subType: null, priceMultiplier: 1.25, isRenewable: true, @@ -176,7 +166,7 @@ export const DEFAULT_ENERGY_CATEGORIES = [ { energyType: EnergyType.GEOTHERMAL, name: 'Geothermal Energy', - description: 'Energy derived from heat stored beneath the Earth\'s surface', + description: "Energy derived from heat stored beneath the Earth's surface", subType: null, priceMultiplier: 1.2, isRenewable: true, @@ -253,6 +243,6 @@ export const getPriceMultiplier = (energyType: EnergyType): number => { [EnergyType.NUCLEAR]: 0.9, [EnergyType.OIL]: 0.8, }; - + return multiplierMap[energyType] || 1.0; }; diff --git a/src/classification/entities/energy-quality.entity.ts b/src/classification/entities/energy-quality.entity.ts index 69830f3..5f98fa3 100644 --- a/src/classification/entities/energy-quality.entity.ts +++ b/src/classification/entities/energy-quality.entity.ts @@ -1,6 +1,6 @@ /** * Energy Quality Entity - * + * * Defines quality ratings for different energy sources. */ @@ -65,11 +65,9 @@ export class EnergyQuality { @Column({ name: 'category_id' }) categoryId: string; - @ManyToOne( - () => EnergyCategory, - (category) => category.qualities, - { onDelete: 'CASCADE' }, - ) + @ManyToOne(() => EnergyCategory, (category) => category.qualities, { + onDelete: 'CASCADE', + }) @JoinColumn({ name: 'category_id' }) category: EnergyCategory; @@ -82,7 +80,13 @@ export class EnergyQuality { @Column({ name: 'efficiency_max', type: 'decimal', precision: 5, scale: 2 }) efficiencyMax: number; - @Column({ name: 'min_purity', type: 'decimal', precision: 5, scale: 2, nullable: true }) + @Column({ + name: 'min_purity', + type: 'decimal', + precision: 5, + scale: 2, + nullable: true, + }) minPurity: number; @Column({ name: 'is_verified', default: false }) @@ -176,8 +180,10 @@ export const DEFAULT_QUALITY_RATINGS = [ /** * Helper function to get quality by rating */ -export const getQualityByRating = (rating: QualityRating): typeof DEFAULT_QUALITY_RATINGS[0] | undefined => { - return DEFAULT_QUALITY_RATINGS.find(q => q.rating === rating); +export const getQualityByRating = ( + rating: QualityRating, +): (typeof DEFAULT_QUALITY_RATINGS)[0] | undefined => { + return DEFAULT_QUALITY_RATINGS.find((q) => q.rating === rating); }; /** @@ -189,7 +195,7 @@ export const calculateAdjustedPrice = ( ): number => { const quality = getQualityByRating(qualityRating); if (!quality) return basePrice; - + return basePrice * Number(quality.priceMultiplier); }; @@ -203,7 +209,7 @@ export const meetsQualityRequirements = ( ): boolean => { const quality = getQualityByRating(rating); if (!quality) return false; - + return ( efficiency >= quality.efficiencyMin && (quality.minPurity === null || purity >= quality.minPurity) diff --git a/src/common/decorators/api-version.decorator.ts b/src/common/decorators/api-version.decorator.ts index 912e2d0..0e69c8c 100644 --- a/src/common/decorators/api-version.decorator.ts +++ b/src/common/decorators/api-version.decorator.ts @@ -1,11 +1,14 @@ /** * API Version Decorator - * + * * Decorator to set API version on endpoints and mark deprecated versions. */ import { SetMetadata } from '@nestjs/common'; -import { ApiVersionMetadata, DEFAULT_API_VERSION } from '../interfaces/response.interface'; +import { + ApiVersionMetadata, + DEFAULT_API_VERSION, +} from '../interfaces/response.interface'; /** * Metadata key for API version @@ -26,13 +29,13 @@ export interface ApiVersionOptions { /** * Set API version on endpoint - * + * * @example * ```typescript * @Controller('users') * @ApiVersion({ version: '1.0' }) * export class UsersController {} - * + * * @Get() * @ApiVersion({ version: '1.0' }) * findAll() {} @@ -49,7 +52,7 @@ export const ApiVersion = (options: ApiVersionOptions) => { /** * Mark endpoint as deprecated - * + * * @example * @Get('old-endpoint') * @Deprecated({ deprecationMessage: 'Use /v2/users instead' }) @@ -59,7 +62,8 @@ export const Deprecated = (options?: { deprecationMessage?: string }) => { return SetMetadata(API_VERSION_KEY, { version: DEFAULT_API_VERSION, deprecated: true, - deprecationMessage: options?.deprecationMessage || 'This endpoint is deprecated', + deprecationMessage: + options?.deprecationMessage || 'This endpoint is deprecated', } as ApiVersionMetadata); }; @@ -79,7 +83,8 @@ export const getApiVersion = (target: any): string => { * Check if endpoint is deprecated */ export const isDeprecated = (target: any): boolean => { - const metadata = Reflect.getMetadata(API_VERSION_KEY, target) || + const metadata = + Reflect.getMetadata(API_VERSION_KEY, target) || Reflect.getMetadata(API_VERSION_KEY, target.constructor); return metadata?.deprecated || false; }; @@ -88,7 +93,8 @@ export const isDeprecated = (target: any): boolean => { * Get deprecation message */ export const getDeprecationMessage = (target: any): string | undefined => { - const metadata = Reflect.getMetadata(API_VERSION_KEY, target) || + const metadata = + Reflect.getMetadata(API_VERSION_KEY, target) || Reflect.getMetadata(API_VERSION_KEY, target.constructor); return metadata?.deprecationMessage; }; diff --git a/src/common/decorators/scope.decorator.ts b/src/common/decorators/scope.decorator.ts index 533e8c3..bb10330 100644 --- a/src/common/decorators/scope.decorator.ts +++ b/src/common/decorators/scope.decorator.ts @@ -1,6 +1,6 @@ /** * Scope Decorator - * + * * Decorators for defining provider scope and lifecycle in NestJS DI. * Supports singleton, request-scoped, and transient providers. */ @@ -29,12 +29,12 @@ export const CACHE_TTL_KEY = 'cache_ttl'; /** * Set provider scope - * + * * @example * ```typescript * @Injectable({ scope: Scope.DEFAULT }) * export class MyService {} - * + * * @Injectable({ scope: Scope.REQUEST }) * export class RequestScopedService {} * ``` @@ -45,14 +45,18 @@ export const SetScope = (scope: Scope | ScopeType) => { /** * Mark service as singleton (default) - * + * * @example * @Singleton() * export class MySingletonService {} */ export const Singleton = (): ClassDecorator & MethodDecorator => { - return (target: any, key?: string | symbol, descriptor?: PropertyDescriptor) => { - SetScope(Scope.DEFAULT)(target, key!, descriptor!); + return ( + target: any, + key?: string | symbol, + descriptor?: PropertyDescriptor, + ) => { + SetScope(Scope.DEFAULT)(target, key, descriptor); Injectable()(target); return descriptor || target; }; @@ -60,14 +64,18 @@ export const Singleton = (): ClassDecorator & MethodDecorator => { /** * Mark service as request-scoped - * + * * @example * @RequestScoped() * export class RequestService {} */ export const RequestScoped = (): ClassDecorator & MethodDecorator => { - return (target: any, key?: string | symbol, descriptor?: PropertyDescriptor) => { - SetScope(Scope.REQUEST)(target, key!, descriptor!); + return ( + target: any, + key?: string | symbol, + descriptor?: PropertyDescriptor, + ) => { + SetScope(Scope.REQUEST)(target, key, descriptor); Injectable({ scope: Scope.REQUEST })(target); return descriptor || target; }; @@ -75,14 +83,18 @@ export const RequestScoped = (): ClassDecorator & MethodDecorator => { /** * Mark service as transient - * + * * @example * @Transient() * export class TransientService {} */ export const Transient = (): ClassDecorator & MethodDecorator => { - return (target: any, key?: string | symbol, descriptor?: PropertyDescriptor) => { - SetScope(Scope.TRANSIENT)(target, key!, descriptor!); + return ( + target: any, + key?: string | symbol, + descriptor?: PropertyDescriptor, + ) => { + SetScope(Scope.TRANSIENT)(target, key, descriptor); Injectable({ scope: Scope.TRANSIENT })(target); return descriptor || target; }; @@ -90,7 +102,7 @@ export const Transient = (): ClassDecorator & MethodDecorator => { /** * Mark service as cacheable - * + * * @example * @Cacheable({ ttl: 60000 }) * async getData() {} @@ -105,7 +117,11 @@ export interface CacheableOptions { } export const Cacheable = (options?: CacheableOptions): MethodDecorator => { - return (target: any, key: string | symbol, descriptor: PropertyDescriptor) => { + return ( + target: any, + key: string | symbol, + descriptor: PropertyDescriptor, + ) => { SetMetadata(CACHE_KEY, true)(target, key, descriptor); if (options?.ttl) { SetMetadata(CACHE_TTL_KEY, options.ttl)(target, key, descriptor); @@ -116,7 +132,7 @@ export const Cacheable = (options?: CacheableOptions): MethodDecorator => { /** * Invalidate cache decorator - * + * * @example * @InvalidateCache({ prefix: 'users' }) * async updateUser() {} @@ -130,8 +146,14 @@ export interface InvalidateCacheOptions { all?: boolean; } -export const InvalidateCache = (options?: InvalidateCacheOptions): MethodDecorator => { - return (target: any, key: string | symbol, descriptor: PropertyDescriptor) => { +export const InvalidateCache = ( + options?: InvalidateCacheOptions, +): MethodDecorator => { + return ( + target: any, + key: string | symbol, + descriptor: PropertyDescriptor, + ) => { SetMetadata('invalidate_cache', options || true)(target, key, descriptor); return descriptor; }; @@ -139,7 +161,7 @@ export const InvalidateCache = (options?: InvalidateCacheOptions): MethodDecorat /** * Lazy load decorator - for lazy loading heavy dependencies - * + * * @example * @Lazy() * private heavyService: HeavyService; @@ -152,7 +174,7 @@ export const Lazy = (): PropertyDecorator => { /** * Factory decorator - for custom provider factories - * + * * @example * @Factory({ scope: Scope.DEFAULT }) * createMyService() { @@ -167,7 +189,11 @@ export interface FactoryOptions { } export const Factory = (options?: FactoryOptions): MethodDecorator => { - return (target: any, key: string | symbol, descriptor: PropertyDescriptor) => { + return ( + target: any, + key: string | symbol, + descriptor: PropertyDescriptor, + ) => { if (options?.scope) { SetScope(options.scope)(target, key, descriptor); } @@ -178,24 +204,26 @@ export const Factory = (options?: FactoryOptions): MethodDecorator => { /** * Tag decorator for grouping providers - * + * * @example * @Tag('database') * export class DatabaseService {} - * + * * @Tag('cache') * export class CacheService {} */ export const Tag = (tag: string): ClassDecorator => { return (target: any) => { - SetMetadata('tags', [...(Reflect.getMetadata('tags', target) || []), tag])(target); + SetMetadata('tags', [...(Reflect.getMetadata('tags', target) || []), tag])( + target, + ); return target; }; }; /** * Alias decorator for creating provider aliases - * + * * @example * @Alias('EntityManager') * export class CustomEntityManager {} @@ -248,7 +276,10 @@ export const isCacheable = (target: any, key: string | symbol): boolean => { /** * Get cache TTL for method */ -export const getCacheTTL = (target: any, key: string | symbol): number | undefined => { +export const getCacheTTL = ( + target: any, + key: string | symbol, +): number | undefined => { return Reflect.getMetadata(CACHE_TTL_KEY, target, key); }; @@ -285,7 +316,7 @@ export const getScopedDependencies = ( dependencies: any[], scopes: Map, ): ScopedDependency[] => { - return dependencies.map(dep => ({ + return dependencies.map((dep) => ({ token: dep, scope: scopes.get(dep) || ScopeType.DEFAULT, })); diff --git a/src/common/filters/http-exception.filter.ts b/src/common/filters/http-exception.filter.ts index cd41235..4a06272 100644 --- a/src/common/filters/http-exception.filter.ts +++ b/src/common/filters/http-exception.filter.ts @@ -1,6 +1,6 @@ /** * HTTP Exception Filter - * + * * Standardizes error responses across the application. * Transforms all exceptions to {error, code, details} format. */ @@ -100,8 +100,8 @@ export class HttpExceptionFilter implements ExceptionFilter { const { status, error, code, details } = this.parseException(exception); // Get request ID - const requestId = request.headers['x-request-id'] as string || - this.generateRequestId(); + const requestId = + (request.headers['x-request-id'] as string) || this.generateRequestId(); // Get API version const apiVersion = this.config.apiVersion || DEFAULT_API_VERSION; @@ -143,7 +143,10 @@ export class HttpExceptionFilter implements ExceptionFilter { } // Handle validation errors (from class-validator) - if (Array.isArray(exception) && exception.every(e => e instanceof ValidationError)) { + if ( + Array.isArray(exception) && + exception.every((e) => e instanceof ValidationError) + ) { return this.parseValidationErrors(exception as ValidationError[]); } @@ -152,9 +155,16 @@ export class HttpExceptionFilter implements ExceptionFilter { status: HttpStatus.INTERNAL_SERVER_ERROR, error: this.getErrorMessage(ApiResponseCode.INTERNAL_ERROR), code: ApiResponseCode.INTERNAL_ERROR, - details: this.config.includeStackTrace ? [{ - message: exception instanceof Error ? exception.message : 'Unknown error', - }] : undefined, + details: this.config.includeStackTrace + ? [ + { + message: + exception instanceof Error + ? exception.message + : 'Unknown error', + }, + ] + : undefined, }; } @@ -184,7 +194,7 @@ export class HttpExceptionFilter implements ExceptionFilter { if (typeof response === 'object') { const responseObj = response as Record; - + // Handle validation errors if (Array.isArray(responseObj.message)) { return { @@ -198,7 +208,10 @@ export class HttpExceptionFilter implements ExceptionFilter { // Handle object response return { status, - error: responseObj.message || responseObj.error || this.getErrorMessage(code), + error: + responseObj.message || + responseObj.error || + this.getErrorMessage(code), code, details: responseObj.details, }; @@ -221,8 +234,8 @@ export class HttpExceptionFilter implements ExceptionFilter { details: { field?: string; message: string }[]; } { const details = errors - .filter(error => error.constraints) - .map(error => ({ + .filter((error) => error.constraints) + .map((error) => ({ field: error.property, message: Object.values(error.constraints || {}).join(', '), })); @@ -300,9 +313,12 @@ export class HttpExceptionFilter implements ExceptionFilter { */ private logError(exception: unknown, request: Request, status: number): void { const message = `${request.method} ${request.url} - ${status}`; - + if (status >= HttpStatus.INTERNAL_SERVER_ERROR) { - this.logger.error(message, exception instanceof Error ? exception.stack : undefined); + this.logger.error( + message, + exception instanceof Error ? exception.stack : undefined, + ); } else if (status >= HttpStatus.BAD_REQUEST) { this.logger.warn(message); } else { @@ -314,7 +330,10 @@ export class HttpExceptionFilter implements ExceptionFilter { /** * Helper function to throw standardized HTTP exceptions */ -export const throwBadRequest = (message: string, details?: { field?: string; message: string }[]) => { +export const throwBadRequest = ( + message: string, + details?: { field?: string; message: string }[], +) => { throw new BadRequestException({ message, code: ApiResponseCode.BAD_REQUEST, diff --git a/src/common/interceptors/response.interceptor.ts b/src/common/interceptors/response.interceptor.ts index f46a66b..2e897fc 100644 --- a/src/common/interceptors/response.interceptor.ts +++ b/src/common/interceptors/response.interceptor.ts @@ -1,6 +1,6 @@ /** * Response Interceptor - * + * * Transforms all API responses to standardized format. * Adds metadata, pagination, and version headers. */ @@ -23,7 +23,10 @@ import { PaginationLinks, DEFAULT_API_VERSION, } from '../interfaces/response.interface'; -import { getPaginationMeta, getPaginationLinks } from '../utils/pagination.util'; +import { + getPaginationMeta, + getPaginationLinks, +} from '../utils/pagination.util'; /** * Configuration for the response interceptor @@ -81,12 +84,12 @@ export class ResponseInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { const request = context.switchToHttp().getRequest(); const response = context.switchToHttp().getResponse(); - + this.startTime = Date.now(); // Get request ID from headers or generate one - const requestId = request.headers['x-request-id'] as string || - this.generateRequestId(); + const requestId = + (request.headers['x-request-id'] as string) || this.generateRequestId(); // Get API version from controller or endpoint const apiVersion = this.getApiVersion(context); @@ -105,7 +108,7 @@ export class ResponseInterceptor implements NestInterceptor { map((data) => { // Check if this is a paginated response const isPaginated = this.isPaginatedResponse(data); - + if (isPaginated) { return this.formatPaginatedResponse( data, @@ -210,7 +213,7 @@ export class ResponseInterceptor implements NestInterceptor { ): void { // Set API version header response.setHeader('X-API-Version', apiVersion); - + // Set request ID header if (this.config.includeRequestId) { response.setHeader('X-Request-Id', requestId); @@ -230,13 +233,19 @@ export class ResponseInterceptor implements NestInterceptor { // Check handler for version metadata const handlerVersion = Reflect.getMetadata('api_version', handler); if (handlerVersion) { - return handlerVersion.version || this.config.apiVersion || DEFAULT_API_VERSION; + return ( + handlerVersion.version || this.config.apiVersion || DEFAULT_API_VERSION + ); } // Check controller for version metadata const controllerVersion = Reflect.getMetadata('api_version', controller); if (controllerVersion) { - return controllerVersion.version || this.config.apiVersion || DEFAULT_API_VERSION; + return ( + controllerVersion.version || + this.config.apiVersion || + DEFAULT_API_VERSION + ); } return this.config.apiVersion || DEFAULT_API_VERSION; diff --git a/src/common/interfaces/response.interface.ts b/src/common/interfaces/response.interface.ts index 2818349..6a56408 100644 --- a/src/common/interfaces/response.interface.ts +++ b/src/common/interfaces/response.interface.ts @@ -1,6 +1,6 @@ /** * API Response Standardization Interfaces - * + * * Provides consistent response structures for all API endpoints. * Supports success responses, error responses, pagination, and metadata. */ diff --git a/src/common/pipes/transform.pipe.ts b/src/common/pipes/transform.pipe.ts index 663684c..0baf063 100644 --- a/src/common/pipes/transform.pipe.ts +++ b/src/common/pipes/transform.pipe.ts @@ -1,6 +1,6 @@ /** * Transform Pipe - * + * * Transform and filter sensitive data from request/response. * Used for data sanitization and filtering. */ @@ -96,12 +96,12 @@ export class TransformPipe implements PipeTransform { */ private filterSensitiveData(data: any): any { if (Array.isArray(data)) { - return data.map(item => this.filterSensitiveData(item)); + return data.map((item) => this.filterSensitiveData(item)); } if (typeof data === 'object' && data !== null) { const filtered: any = {}; - + for (const [key, value] of Object.entries(data)) { if (this.isSensitiveField(key)) { // Apply mask or removal @@ -109,7 +109,11 @@ export class TransformPipe implements PipeTransform { filtered[key] = this.maskValue(value); } // Skip sensitive fields (don't include them) - } else if (this.config.recursive && typeof value === 'object' && value !== null) { + } else if ( + this.config.recursive && + typeof value === 'object' && + value !== null + ) { filtered[key] = this.filterSensitiveData(value); } else { filtered[key] = value; @@ -127,19 +131,17 @@ export class TransformPipe implements PipeTransform { */ private isSensitiveField(key: string): boolean { const lowerKey = key.toLowerCase(); - + // Check if include list is provided if (this.config.include && this.config.include.length > 0) { - return this.config.include.some(field => - field.toLowerCase() === lowerKey + return this.config.include.some( + (field) => field.toLowerCase() === lowerKey, ); } // Check exclude list const excludeList = this.config.exclude || DEFAULT_SENSITIVE_FIELDS; - return excludeList.some(field => - field.toLowerCase() === lowerKey - ); + return excludeList.some((field) => field.toLowerCase() === lowerKey); } /** @@ -149,7 +151,11 @@ export class TransformPipe implements PipeTransform { const maskChar = this.config.maskChar || '*'; if (typeof value === 'string' && value.length > 0) { // Keep first and last character, mask middle - return value[0] + maskChar.repeat(Math.min(value.length - 2, 8)) + value[value.length - 1]; + return ( + value[0] + + maskChar.repeat(Math.min(value.length - 2, 8)) + + value[value.length - 1] + ); } return maskChar.repeat(8); } @@ -160,9 +166,14 @@ export class TransformPipe implements PipeTransform { */ export const Sensitive = (fieldName: string) => { return (target: any, key: string) => { - const sensitiveFields = Reflect.getMetadata('sensitive_fields', target.constructor) || []; + const sensitiveFields = + Reflect.getMetadata('sensitive_fields', target.constructor) || []; sensitiveFields.push(fieldName); - Reflect.defineMetadata('sensitive_fields', sensitiveFields, target.constructor); + Reflect.defineMetadata( + 'sensitive_fields', + sensitiveFields, + target.constructor, + ); }; }; @@ -178,12 +189,12 @@ export const createSensitiveDataFilter = ( maskInsteadOfRemove, recursive: true, }); - + return (data: any) => { if (!data || typeof data !== 'object') { return data; } - + return filter.transform(data, { type: 'body' } as ArgumentMetadata); }; }; @@ -220,7 +231,7 @@ export const toFilteredArray = >( maskInsteadOfRemove?: boolean; }, ): T[] => { - return data.map(item => toFilteredResponse(item, options)); + return data.map((item) => toFilteredResponse(item, options)); }; /** diff --git a/src/common/providers/config.provider.ts b/src/common/providers/config.provider.ts index e2220f1..98bcd60 100644 --- a/src/common/providers/config.provider.ts +++ b/src/common/providers/config.provider.ts @@ -1,6 +1,6 @@ /** * Config Provider - * + * * Custom provider for configuration management with validation, * environment-specific overrides, and type safety. */ @@ -211,7 +211,10 @@ export class ConfigProvider implements OnModuleInit { if (errors.length > 0) { const errorMessage = errors - .map(e => `${e.property}: ${Object.values(e.constraints || {}).join(', ')}`) + .map( + (e) => + `${e.property}: ${Object.values(e.constraints || {}).join(', ')}`, + ) .join('; '); this.logger.error(`Configuration validation failed: ${errorMessage}`); @@ -255,7 +258,7 @@ export class ConfigProvider implements OnModuleInit { */ get(key: string, defaultValue?: T): T { const value = this.configService.get(key); - return value ?? defaultValue as T; + return value ?? defaultValue; } /** diff --git a/src/common/providers/database.provider.ts b/src/common/providers/database.provider.ts index 0b55dee..48f1e63 100644 --- a/src/common/providers/database.provider.ts +++ b/src/common/providers/database.provider.ts @@ -1,6 +1,6 @@ /** * Database Provider - * + * * Custom provider for database connections with connection pooling, * health checks, and proper lifecycle management. */ @@ -79,14 +79,14 @@ export class DatabaseProvider implements OnModuleInit, OnModuleDestroy { */ async onModuleInit(): Promise { this.logger.log('Initializing database provider...'); - + // Verify connection const isConnected = await this.isConnected(); if (!isConnected) { this.logger.error('Database connection not established'); throw new Error('Database connection failed'); } - + this.logger.log('Database provider initialized successfully'); } @@ -130,7 +130,7 @@ export class DatabaseProvider implements OnModuleInit, OnModuleDestroy { */ async getHealth(): Promise { const isConnected = await this.isConnected(); - + return { connected: isConnected, type: this.dataSource.options.type as string, diff --git a/src/common/providers/logger.provider.ts b/src/common/providers/logger.provider.ts index d87b856..becbca5 100644 --- a/src/common/providers/logger.provider.ts +++ b/src/common/providers/logger.provider.ts @@ -1,6 +1,6 @@ /** * Logger Provider - * + * * Custom provider for structured logging with context support, * different log levels, and performance tracking. */ @@ -13,13 +13,7 @@ import { Optional, Inject, } from '@nestjs/common'; -import { - createLogger, - Logger, - LogLevel, - format, - transports, -} from 'winston'; +import { createLogger, Logger, LogLevel, format, transports } from 'winston'; /** * Logger provider options @@ -149,7 +143,7 @@ export class LoggerProvider implements LoggerService { * Log error */ error(message: string, trace?: string, context?: string): void { - this.logger.error(message, { + this.logger.error(message, { context: context || this.context, trace, }); @@ -199,7 +193,7 @@ export class LoggerProvider implements LoggerService { meta?: Record, context?: string, ): void { - this.logger.log(level, message, { + this.logger.log(level, message, { context: context || this.context, ...meta, }); @@ -208,11 +202,7 @@ export class LoggerProvider implements LoggerService { /** * Log performance timing */ - logPerformance( - operation: string, - duration: number, - context?: string, - ): void { + logPerformance(operation: string, duration: number, context?: string): void { this.logger.info(`Performance: ${operation} took ${duration}ms`, { context: context || this.context, duration, @@ -240,7 +230,7 @@ export const createLoggerProvider = ( export const InjectLoggerProvider = (context?: string) => { return { provide: LOGGER_PROVIDER, - useFactory: (options?: LoggerProviderOptions) => + useFactory: (options?: LoggerProviderOptions) => new LoggerProvider(options, context), }; }; @@ -275,7 +265,7 @@ export const withPerformanceTracking = ( context?: string, ) => { const startTime = Date.now(); - + return { complete: () => { const duration = Date.now() - startTime; diff --git a/src/common/utils/pagination.util.ts b/src/common/utils/pagination.util.ts index 27d01fe..565382b 100644 --- a/src/common/utils/pagination.util.ts +++ b/src/common/utils/pagination.util.ts @@ -1,6 +1,6 @@ /** * Pagination Utility - * + * * Provides pagination helpers for API responses. */ @@ -19,7 +19,7 @@ export const MAX_LIMIT = 100; /** * Generate pagination metadata - * + * * @param page - Current page number * @param limit - Items per page * @param total - Total number of items @@ -31,7 +31,7 @@ export const getPaginationMeta = ( total: number, ): PaginationMeta => { const totalPages = Math.ceil(total / limit); - + return { page, limit, @@ -44,7 +44,7 @@ export const getPaginationMeta = ( /** * Generate pagination links - * + * * @param baseUrl - Base URL for the endpoint * @param page - Current page number * @param limit - Items per page @@ -58,7 +58,7 @@ export const getPaginationLinks = ( total: number, ): PaginationLinks => { const totalPages = Math.ceil(total / limit); - + // Build query string const buildUrl = (p: number): string => { const url = new URL(baseUrl); @@ -78,11 +78,13 @@ export const getPaginationLinks = ( /** * Parse pagination query parameters - * + * * @param query - Pagination query parameters * @returns Normalized pagination parameters */ -export const parsePaginationQuery = (query: Partial): { +export const parsePaginationQuery = ( + query: Partial, +): { page: number; limit: number; } => { @@ -97,7 +99,7 @@ export const parsePaginationQuery = (query: Partial): { /** * Calculate pagination skip value for database queries - * + * * @param page - Current page number * @param limit - Items per page * @returns Skip value for database query @@ -108,7 +110,7 @@ export const getSkipValue = (page: number, limit: number): number => { /** * Paginate array of items - * + * * @param items - Array of items to paginate * @param page - Current page number * @param limit - Items per page @@ -125,7 +127,7 @@ export const paginateArray = ( const total = items.length; const startIndex = (page - 1) * limit; const endIndex = startIndex + limit; - + const data = items.slice(startIndex, endIndex); const pagination = getPaginationMeta(page, limit, total); @@ -134,27 +136,33 @@ export const paginateArray = ( /** * Get pagination query string - * + * * @param page - Page number * @param limit - Items per page * @returns Query string */ -export const getPaginationQueryString = (page: number, limit: number): string => { +export const getPaginationQueryString = ( + page: number, + limit: number, +): string => { return `page=${page}&limit=${limit}`; }; /** * Calculate offset and limit for cursor-based pagination - * + * * @param cursor - Cursor string (usually base64 encoded) * @param limit - Items per page * @returns Offset value */ -export const getCursorOffset = (cursor: string | undefined, limit: number): number => { +export const getCursorOffset = ( + cursor: string | undefined, + limit: number, +): number => { if (!cursor) { return 0; } - + try { const decoded = atob(cursor); const parsed = JSON.parse(decoded); @@ -166,7 +174,7 @@ export const getCursorOffset = (cursor: string | undefined, limit: number): numb /** * Generate cursor for next page - * + * * @param offset - Current offset * @param limit - Items per page * @returns Base64 encoded cursor @@ -178,7 +186,7 @@ export const generateCursor = (offset: number, limit: number): string => { /** * Sort array of objects - * + * * @param items - Array of items to sort * @param sortField - Field to sort by * @param order - Sort order (ASC or DESC) @@ -192,9 +200,9 @@ export const sortItems = ( return [...items].sort((a, b) => { const aVal = a[sortField]; const bVal = b[sortField]; - + if (aVal === bVal) return 0; - + const comparison = aVal < bVal ? -1 : 1; return order === 'ASC' ? comparison : -comparison; }); @@ -202,7 +210,7 @@ export const sortItems = ( /** * Filter items based on search query - * + * * @param items - Array of items to filter * @param search - Search query * @param fields - Fields to search in @@ -214,10 +222,10 @@ export const filterItems = ( fields: (keyof T)[], ): T[] => { if (!search) return items; - + const lowerSearch = search.toLowerCase(); - return items.filter(item => - fields.some(field => { + return items.filter((item) => + fields.some((field) => { const value = item[field]; if (typeof value === 'string') { return value.toLowerCase().includes(lowerSearch); diff --git a/src/config/database.config.ts b/src/config/database.config.ts index 0430804..f75d33d 100644 --- a/src/config/database.config.ts +++ b/src/config/database.config.ts @@ -3,6 +3,8 @@ import { TypeOrmModuleOptions } from '@nestjs/typeorm'; import { ForecastData } from '../forecasting/entities/forecast-data.entity'; import { MultisigWallet } from '../multisig/entities/multisig-wallet.entity'; import { Signature } from '../multisig/entities/signature.entity'; +import { MarketSetting } from '../settings/entities/market-setting.entity'; +import { UserPreference } from '../settings/entities/user-preference.entity'; export default registerAs( 'database', @@ -13,7 +15,13 @@ export default registerAs( username: process.env.DB_USERNAME || 'root', password: process.env.DB_PASSWORD || '', database: process.env.DB_DATABASE || 'currentdao', - entities: [ForecastData, MultisigWallet, Signature], + entities: [ + ForecastData, + MultisigWallet, + Signature, + MarketSetting, + UserPreference, + ], synchronize: process.env.NODE_ENV !== 'production', logging: process.env.NODE_ENV === 'development', autoLoadEntities: true, diff --git a/src/cross-border/currency/currency-service.ts b/src/cross-border/currency/currency-service.ts index efdcd25..79bf666 100644 --- a/src/cross-border/currency/currency-service.ts +++ b/src/cross-border/currency/currency-service.ts @@ -346,11 +346,11 @@ export class CurrencyService { const usdToKey = `USD-${toCurrency}`; if (this.exchangeRates.has(directKey)) { - return this.exchangeRates.get(directKey)!.rate; + return this.exchangeRates.get(directKey).rate; } if (this.exchangeRates.has(reverseKey)) { - const reverseRate = this.exchangeRates.get(reverseKey)!.rate; + const reverseRate = this.exchangeRates.get(reverseKey).rate; return 1 / reverseRate; } @@ -358,8 +358,8 @@ export class CurrencyService { this.exchangeRates.has(usdFromKey) && this.exchangeRates.has(usdToKey) ) { - const fromRate = this.exchangeRates.get(usdFromKey)!.rate; - const toRate = this.exchangeRates.get(usdToKey)!.rate; + const fromRate = this.exchangeRates.get(usdFromKey).rate; + const toRate = this.exchangeRates.get(usdToKey).rate; return toRate / fromRate; } @@ -399,7 +399,7 @@ export class CurrencyService { const key = `${fromCurrency}-${toCurrency}`; if (this.exchangeRates.has(key)) { - rates.push(this.exchangeRates.get(key)!); + rates.push(this.exchangeRates.get(key)); } return rates; @@ -430,7 +430,7 @@ export class CurrencyService { validateCurrencyCode(code: string): boolean { return ( this.supportedCurrencies.has(code) && - this.supportedCurrencies.get(code)!.isActive + this.supportedCurrencies.get(code).isActive ); } diff --git a/src/cross-border/reporting/regulatory-report.service.ts b/src/cross-border/reporting/regulatory-report.service.ts index be0fe17..2170491 100644 --- a/src/cross-border/reporting/regulatory-report.service.ts +++ b/src/cross-border/reporting/regulatory-report.service.ts @@ -435,7 +435,7 @@ export class RegulatoryReportService { } const totalTime = completedTransactions.reduce((sum, t) => { - return sum + (t.processedAt!.getTime() - t.createdAt.getTime()); + return sum + (t.processedAt.getTime() - t.createdAt.getTime()); }, 0); return totalTime / completedTransactions.length; diff --git a/src/cross-border/tariffs/customs-service.ts b/src/cross-border/tariffs/customs-service.ts index 8ca4302..43b12fd 100644 --- a/src/cross-border/tariffs/customs-service.ts +++ b/src/cross-border/tariffs/customs-service.ts @@ -228,7 +228,7 @@ export class CustomsService { if (!this.customsRules.has(key)) { this.customsRules.set(key, []); } - this.customsRules.get(key)!.push(rule); + this.customsRules.get(key).push(rule); } this.logger.log( diff --git a/src/energy/config/swagger.config.ts b/src/energy/config/swagger.config.ts index 14d1d49..2d084e4 100644 --- a/src/energy/config/swagger.config.ts +++ b/src/energy/config/swagger.config.ts @@ -3,7 +3,9 @@ import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; export function setupSwagger(app) { const config = new DocumentBuilder() .setTitle('Energy Trading API') - .setDescription('Comprehensive RESTful API for energy trading operations including listings, bids, and trade management') + .setDescription( + 'Comprehensive RESTful API for energy trading operations including listings, bids, and trade management', + ) .setVersion('1.0.0') .addTag('energy', 'Energy trading operations') .addBearerAuth( @@ -37,7 +39,10 @@ export function setupSwagger(app) { .addLicense('MIT', 'https://opensource.org/licenses/MIT') .addExternalDoc('API Documentation', 'https://docs.currentdao.com/api') .addExternalDoc('Postman Collection', 'https://docs.currentdao.com/postman') - .addExternalDoc('OpenAPI Specification', 'https://docs.currentdao.com/openapi.json') + .addExternalDoc( + 'OpenAPI Specification', + 'https://docs.currentdao.com/openapi.json', + ) .build(); const document = SwaggerModule.createDocument(app, config, { @@ -79,7 +84,8 @@ export function setupSwagger(app) { export const swaggerConfig = { title: 'Energy Trading API', - description: 'Comprehensive RESTful API for energy trading operations including listings, bids, and trade management', + description: + 'Comprehensive RESTful API for energy trading operations including listings, bids, and trade management', version: '1.0.0', termsOfService: 'https://currentdao.com/terms', contact: { @@ -201,7 +207,8 @@ export const swaggerConfig = { tags: [ { name: 'energy', - description: 'Energy trading operations including listings, bids, and trades', + description: + 'Energy trading operations including listings, bids, and trades', }, { name: 'listings', @@ -229,7 +236,8 @@ export const swaggerConfig = { get: { tags: ['energy', 'listings'], summary: 'Browse energy listings with pagination and filters', - description: 'Retrieve a paginated list of energy listings with optional filtering by various criteria', + description: + 'Retrieve a paginated list of energy listings with optional filtering by various criteria', operationId: 'getListings', parameters: [ { @@ -247,7 +255,15 @@ export const swaggerConfig = { description: 'Filter by energy type', schema: { type: 'string', - enum: ['solar', 'wind', 'hydro', 'nuclear', 'fossil', 'biomass', 'geothermal'], + enum: [ + 'solar', + 'wind', + 'hydro', + 'nuclear', + 'fossil', + 'biomass', + 'geothermal', + ], }, }, { diff --git a/src/energy/dto/create-listing.dto.ts b/src/energy/dto/create-listing.dto.ts index 0331e27..933fd69 100644 --- a/src/energy/dto/create-listing.dto.ts +++ b/src/energy/dto/create-listing.dto.ts @@ -1,7 +1,23 @@ -import { IsString, IsNumber, IsEnum, IsOptional, IsBoolean, IsArray, IsObject, Min, Max, ValidateNested, IsDateString } from 'class-validator'; +import { + IsString, + IsNumber, + IsEnum, + IsOptional, + IsBoolean, + IsArray, + IsObject, + Min, + Max, + ValidateNested, + IsDateString, +} from 'class-validator'; import { Type } from 'class-transformer'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { ListingType, EnergyType, DeliveryType } from '../entities/energy-listing.entity'; +import { + ListingType, + EnergyType, + DeliveryType, +} from '../entities/energy-listing.entity'; export class LocationDto { @ApiProperty({ example: 40.7128 }) @@ -10,7 +26,7 @@ export class LocationDto { @Max(90) latitude: number; - @ApiProperty({ example: -74.0060 }) + @ApiProperty({ example: -74.006 }) @IsNumber() @Min(-180) @Max(180) @@ -118,7 +134,9 @@ export class ContractTermsDto { @Min(0) terminationNotice?: number; - @ApiPropertyOptional({ example: ['late_delivery_penalty', 'quality_penalty'] }) + @ApiPropertyOptional({ + example: ['late_delivery_penalty', 'quality_penalty'], + }) @IsOptional() @IsArray() @IsString({ each: true }) @@ -197,7 +215,9 @@ export class MetadataDto { @Max(100) efficiency?: number; - @ApiPropertyOptional({ example: ['monthly_maintenance', 'quarterly_inspection'] }) + @ApiPropertyOptional({ + example: ['monthly_maintenance', 'quarterly_inspection'], + }) @IsOptional() @IsArray() @IsString({ each: true }) @@ -221,7 +241,10 @@ export class CreateListingDto { @IsString() title: string; - @ApiPropertyOptional({ example: 'High-quality solar energy from certified solar farm with excellent reliability record' }) + @ApiPropertyOptional({ + example: + 'High-quality solar energy from certified solar farm with excellent reliability record', + }) @IsOptional() @IsString() description?: string; @@ -239,18 +262,18 @@ export class CreateListingDto { @Min(0.01) quantity: number; - @ApiProperty({ example: 0.0850 }) + @ApiProperty({ example: 0.085 }) @IsNumber() @Min(0) price: number; - @ApiPropertyOptional({ example: 0.0800 }) + @ApiPropertyOptional({ example: 0.08 }) @IsOptional() @IsNumber() @Min(0) minPrice?: number; - @ApiPropertyOptional({ example: 0.0900 }) + @ApiPropertyOptional({ example: 0.09 }) @IsOptional() @IsNumber() @Min(0) diff --git a/src/energy/dto/execute-trade.dto.ts b/src/energy/dto/execute-trade.dto.ts index c3f6825..804188f 100644 --- a/src/energy/dto/execute-trade.dto.ts +++ b/src/energy/dto/execute-trade.dto.ts @@ -1,4 +1,14 @@ -import { IsString, IsNumber, IsEnum, IsOptional, IsBoolean, IsArray, IsObject, ValidateNested, IsDateString } from 'class-validator'; +import { + IsString, + IsNumber, + IsEnum, + IsOptional, + IsBoolean, + IsArray, + IsObject, + ValidateNested, + IsDateString, +} from 'class-validator'; import { Type } from 'class-transformer'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { TradeType } from '../entities/trade.entity'; @@ -117,7 +127,9 @@ export class ContractTermsDto { @IsString() supportLevel?: string; - @ApiPropertyOptional({ example: ['late_delivery_penalty', 'quality_penalty'] }) + @ApiPropertyOptional({ + example: ['late_delivery_penalty', 'quality_penalty'], + }) @IsOptional() @IsArray() @IsString({ each: true }) @@ -140,7 +152,10 @@ export class QualityAssuranceDto { @IsDateString() inspectionDate?: string; - @ApiPropertyOptional({ enum: ['pass', 'fail', 'conditional'], example: 'pass' }) + @ApiPropertyOptional({ + enum: ['pass', 'fail', 'conditional'], + example: 'pass', + }) @IsOptional() @IsEnum(['pass', 'fail', 'conditional']) inspectionResult?: 'pass' | 'fail' | 'conditional'; @@ -218,7 +233,10 @@ export class MilestoneDto { @IsDateString() completedDate?: string; - @ApiPropertyOptional({ enum: ['pending', 'in_progress', 'completed', 'failed'], example: 'completed' }) + @ApiPropertyOptional({ + enum: ['pending', 'in_progress', 'completed', 'failed'], + example: 'completed', + }) @IsOptional() @IsEnum(['pending', 'in_progress', 'completed', 'failed']) status?: 'pending' | 'in_progress' | 'completed' | 'failed'; @@ -307,7 +325,9 @@ export class ExecuteTradeDto { @Type(() => MilestoneDto) milestones?: MilestoneDto[]; - @ApiPropertyOptional({ example: 'Urgent delivery required for critical infrastructure' }) + @ApiPropertyOptional({ + example: 'Urgent delivery required for critical infrastructure', + }) @IsOptional() @IsString() notes?: string; diff --git a/src/energy/dto/place-bid.dto.ts b/src/energy/dto/place-bid.dto.ts index 23cb1ef..11d79a3 100644 --- a/src/energy/dto/place-bid.dto.ts +++ b/src/energy/dto/place-bid.dto.ts @@ -1,4 +1,14 @@ -import { IsString, IsNumber, IsEnum, IsOptional, IsBoolean, IsArray, IsObject, ValidateNested, IsDateString } from 'class-validator'; +import { + IsString, + IsNumber, + IsEnum, + IsOptional, + IsBoolean, + IsArray, + IsObject, + ValidateNested, + IsDateString, +} from 'class-validator'; import { Type } from 'class-transformer'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { BidType } from '../entities/bid.entity'; @@ -124,7 +134,10 @@ export class MetadataDto { @IsString() source?: string; - @ApiPropertyOptional({ enum: ['low', 'medium', 'high', 'critical'], example: 'high' }) + @ApiPropertyOptional({ + enum: ['low', 'medium', 'high', 'critical'], + example: 'high', + }) @IsOptional() @IsEnum(['low', 'medium', 'high', 'critical']) urgency?: 'low' | 'medium' | 'high' | 'critical'; @@ -172,7 +185,9 @@ export class PlaceBidDto { @IsEnum(BidType) type?: BidType; - @ApiPropertyOptional({ example: 'We offer competitive pricing with reliable delivery schedule' }) + @ApiPropertyOptional({ + example: 'We offer competitive pricing with reliable delivery schedule', + }) @IsOptional() @IsString() message?: string; diff --git a/src/energy/energy.controller.ts b/src/energy/energy.controller.ts index af94dbb..8b82e78 100644 --- a/src/energy/energy.controller.ts +++ b/src/energy/energy.controller.ts @@ -10,10 +10,20 @@ import { UseGuards, Request, HttpStatus, - HttpCode + HttpCode, } from '@nestjs/common'; -import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiQuery } from '@nestjs/swagger'; -import { EnergyService, ListingFilter, PaginationOptions } from './energy.service'; +import { + ApiTags, + ApiOperation, + ApiResponse, + ApiParam, + ApiQuery, +} from '@nestjs/swagger'; +import { + EnergyService, + ListingFilter, + PaginationOptions, +} from './energy.service'; import { CreateListingDto } from './dto/create-listing.dto'; import { UpdateListingDto } from './dto/update-listing.dto'; import { PlaceBidDto } from './dto/place-bid.dto'; @@ -27,20 +37,35 @@ import { AuthGuard } from './guards/auth.guard'; @Controller('api/energy') @UseGuards(AuthGuard) export class EnergyController { - constructor(private readonly energyService: EnergyService) { } + constructor(private readonly energyService: EnergyService) {} @Post('listings') @ApiOperation({ summary: 'Create new energy listing' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Listing created successfully', type: EnergyListing }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Invalid input data' }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Listing created successfully', + type: EnergyListing, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Invalid input data', + }) @ApiResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized' }) - async createListing(@Body() createListingDto: CreateListingDto, @Request() req): Promise { + async createListing( + @Body() createListingDto: CreateListingDto, + @Request() req, + ): Promise { return this.energyService.createListing(createListingDto, req.user.id); } @Get('listings') - @ApiOperation({ summary: 'Browse energy listings with pagination and filters' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Listings retrieved successfully' }) + @ApiOperation({ + summary: 'Browse energy listings with pagination and filters', + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Listings retrieved successfully', + }) @ApiQuery({ name: 'type', required: false, enum: ['buy', 'sell'] }) @ApiQuery({ name: 'energyType', required: false }) @ApiQuery({ name: 'status', required: false }) @@ -54,15 +79,30 @@ export class EnergyController { @ApiQuery({ name: 'page', required: false, type: Number, example: 1 }) @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 }) @ApiQuery({ name: 'sortBy', required: false, example: 'createdAt' }) - @ApiQuery({ name: 'sortOrder', required: false, enum: ['ASC', 'DESC'], example: 'DESC' }) - async getListings(@Query() filter: ListingFilter, @Query() pagination: PaginationOptions) { + @ApiQuery({ + name: 'sortOrder', + required: false, + enum: ['ASC', 'DESC'], + example: 'DESC', + }) + async getListings( + @Query() filter: ListingFilter, + @Query() pagination: PaginationOptions, + ) { return this.energyService.getListings(filter, pagination); } @Get('listings/:id') @ApiOperation({ summary: 'Get specific listing details' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Listing retrieved successfully', type: EnergyListing }) - @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Listing not found' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Listing retrieved successfully', + type: EnergyListing, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Listing not found', + }) @ApiParam({ name: 'id', description: 'Listing ID' }) async getListingById(@Param('id') id: string): Promise { return this.energyService.getListingById(id); @@ -70,15 +110,28 @@ export class EnergyController { @Put('listings/:id') @ApiOperation({ summary: 'Update listing (owner only)' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Listing updated successfully', type: EnergyListing }) - @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Listing not found' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to update this listing' }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Cannot update listing in current state' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Listing updated successfully', + type: EnergyListing, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Listing not found', + }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to update this listing', + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Cannot update listing in current state', + }) @ApiParam({ name: 'id', description: 'Listing ID' }) async updateListing( @Param('id') id: string, @Body() updateListingDto: UpdateListingDto, - @Request() req + @Request() req, ): Promise { return this.energyService.updateListing(id, updateListingDto, req.user.id); } @@ -86,53 +139,115 @@ export class EnergyController { @Delete('listings/:id') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: 'Cancel listing (owner only)' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Listing cancelled successfully', type: EnergyListing }) - @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Listing not found' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to cancel this listing' }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Cannot cancel listing in current state' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Listing cancelled successfully', + type: EnergyListing, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Listing not found', + }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to cancel this listing', + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Cannot cancel listing in current state', + }) @ApiParam({ name: 'id', description: 'Listing ID' }) - async cancelListing(@Param('id') id: string, @Request() req): Promise { + async cancelListing( + @Param('id') id: string, + @Request() req, + ): Promise { return this.energyService.cancelListing(id, req.user.id); } @Post('bids') @ApiOperation({ summary: 'Place bid on listing' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Bid placed successfully', type: Bid }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Invalid bid data or listing not available' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Cannot bid on own listing' }) - @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Listing not found' }) - async placeBid(@Body() placeBidDto: PlaceBidDto, @Request() req): Promise { + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Bid placed successfully', + type: Bid, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Invalid bid data or listing not available', + }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Cannot bid on own listing', + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Listing not found', + }) + async placeBid( + @Body() placeBidDto: PlaceBidDto, + @Request() req, + ): Promise { return this.energyService.placeBid(placeBidDto, req.user.id); } @Get('bids') @ApiOperation({ summary: "Get user's bids" }) - @ApiResponse({ status: HttpStatus.OK, description: 'User bids retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'User bids retrieved successfully', + }) @ApiQuery({ name: 'page', required: false, type: Number, example: 1 }) @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 }) @ApiQuery({ name: 'sortBy', required: false, example: 'createdAt' }) - @ApiQuery({ name: 'sortOrder', required: false, enum: ['ASC', 'DESC'], example: 'DESC' }) + @ApiQuery({ + name: 'sortOrder', + required: false, + enum: ['ASC', 'DESC'], + example: 'DESC', + }) async getBidsByUser(@Query() pagination: PaginationOptions, @Request() req) { return this.energyService.getBidsByUser(req.user.id, pagination); } @Get('listings/:listingId/bids') @ApiOperation({ summary: 'Get bids for a listing (owner only)' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Listing bids retrieved successfully' }) - @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Listing not found' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to view bids for this listing' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Listing bids retrieved successfully', + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Listing not found', + }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to view bids for this listing', + }) @ApiParam({ name: 'listingId', description: 'Listing ID' }) - async getBidsForListing(@Param('listingId') listingId: string, @Request() req): Promise { + async getBidsForListing( + @Param('listingId') listingId: string, + @Request() req, + ): Promise { return this.energyService.getBidsForListing(listingId, req.user.id); } @Post('bids/:bidId/accept') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: 'Accept bid (listing owner only)' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Bid accepted successfully', type: Bid }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Bid accepted successfully', + type: Bid, + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Bid not found' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to accept this bid' }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Cannot accept bid in current state' }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to accept this bid', + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Cannot accept bid in current state', + }) @ApiParam({ name: 'bidId', description: 'Bid ID' }) async acceptBid(@Param('bidId') bidId: string, @Request() req): Promise { return this.energyService.acceptBid(bidId, req.user.id); @@ -141,15 +256,25 @@ export class EnergyController { @Post('bids/:bidId/reject') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: 'Reject bid (listing owner only)' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Bid rejected successfully', type: Bid }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Bid rejected successfully', + type: Bid, + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Bid not found' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to reject this bid' }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Cannot reject bid in current state' }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to reject this bid', + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Cannot reject bid in current state', + }) @ApiParam({ name: 'bidId', description: 'Bid ID' }) async rejectBid( @Param('bidId') bidId: string, @Body() body: { reason?: string }, - @Request() req + @Request() req, ): Promise { return this.energyService.rejectBid(bidId, req.user.id, body.reason); } @@ -157,30 +282,63 @@ export class EnergyController { @Post('bids/:bidId/withdraw') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: 'Withdraw bid (bid owner only)' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Bid withdrawn successfully', type: Bid }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Bid withdrawn successfully', + type: Bid, + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Bid not found' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to withdraw this bid' }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Cannot withdraw bid in current state' }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to withdraw this bid', + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Cannot withdraw bid in current state', + }) @ApiParam({ name: 'bidId', description: 'Bid ID' }) - async withdrawBid(@Param('bidId') bidId: string, @Request() req): Promise { + async withdrawBid( + @Param('bidId') bidId: string, + @Request() req, + ): Promise { return this.energyService.withdrawBid(bidId, req.user.id); } @Post('trades/execute') @ApiOperation({ summary: 'Execute matched trade' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Trade executed successfully', type: Trade }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Cannot execute trade in current state' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to execute this trade' }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Trade executed successfully', + type: Trade, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Cannot execute trade in current state', + }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to execute this trade', + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Bid not found' }) - async executeTrade(@Body() executeTradeDto: ExecuteTradeDto, @Request() req): Promise { + async executeTrade( + @Body() executeTradeDto: ExecuteTradeDto, + @Request() req, + ): Promise { return this.energyService.executeTrade(executeTradeDto, req.user.id); } @Get('trades/:id') @ApiOperation({ summary: 'Get trade status' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Trade retrieved successfully', type: Trade }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Trade retrieved successfully', + type: Trade, + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Trade not found' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to view this trade' }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to view this trade', + }) @ApiParam({ name: 'id', description: 'Trade ID' }) async getTradeById(@Param('id') id: string, @Request() req): Promise { return this.energyService.getTradeById(id, req.user.id); @@ -188,34 +346,63 @@ export class EnergyController { @Get('trades') @ApiOperation({ summary: "Get user's trades" }) - @ApiResponse({ status: HttpStatus.OK, description: 'User trades retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'User trades retrieved successfully', + }) @ApiQuery({ name: 'page', required: false, type: Number, example: 1 }) @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 }) @ApiQuery({ name: 'sortBy', required: false, example: 'createdAt' }) - @ApiQuery({ name: 'sortOrder', required: false, enum: ['ASC', 'DESC'], example: 'DESC' }) - async getTradesByUser(@Query() pagination: PaginationOptions, @Request() req) { + @ApiQuery({ + name: 'sortOrder', + required: false, + enum: ['ASC', 'DESC'], + example: 'DESC', + }) + async getTradesByUser( + @Query() pagination: PaginationOptions, + @Request() req, + ) { return this.energyService.getTradesByUser(req.user.id, pagination); } @Put('trades/:id/status') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: 'Update trade status' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Trade status updated successfully', type: Trade }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Trade status updated successfully', + type: Trade, + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Trade not found' }) - @ApiResponse({ status: HttpStatus.FORBIDDEN, description: 'Not authorized to update this trade' }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Invalid status transition' }) + @ApiResponse({ + status: HttpStatus.FORBIDDEN, + description: 'Not authorized to update this trade', + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Invalid status transition', + }) @ApiParam({ name: 'id', description: 'Trade ID' }) async updateTradeStatus( @Param('id') id: string, @Body() body: { status: string; reason?: string }, - @Request() req + @Request() req, ): Promise { - return this.energyService.updateTradeStatus(id, body.status as any, req.user.id, body.reason); + return this.energyService.updateTradeStatus( + id, + body.status as any, + req.user.id, + body.reason, + ); } @Get('orderbook') @ApiOperation({ summary: 'Get order book functionality' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Order book retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Order book retrieved successfully', + }) @ApiQuery({ name: 'energyType', required: false }) @ApiQuery({ name: 'minPrice', required: false, type: Number }) @ApiQuery({ name: 'maxPrice', required: false, type: Number }) @@ -230,8 +417,14 @@ export class EnergyController { @Get('listings/:id/analytics') @ApiOperation({ summary: 'Get listing analytics' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Analytics retrieved successfully' }) - @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Listing not found' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Analytics retrieved successfully', + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Listing not found', + }) @ApiParam({ name: 'id', description: 'Listing ID' }) async getListingAnalytics(@Param('id') id: string): Promise { const listing = await this.energyService.getListingById(id); @@ -249,26 +442,42 @@ export class EnergyController { @Get('dashboard') @ApiOperation({ summary: 'Get user dashboard data' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Dashboard data retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Dashboard data retrieved successfully', + }) async getDashboard(@Request() req): Promise { const userId = req.user.id; const [userListings, userBids, userTrades] = await Promise.all([ - this.energyService.getListings({ createdBy: userId }, { page: 1, limit: 100 }), + this.energyService.getListings( + { createdBy: userId }, + { page: 1, limit: 100 }, + ), this.energyService.getBidsByUser(userId, { page: 1, limit: 100 }), this.energyService.getTradesByUser(userId, { page: 1, limit: 100 }), ]); - const activeListings = userListings.data.filter(listing => listing.status === 'active'); - const pendingBids = userBids.data.filter(bid => bid.status === 'pending'); - const activeTrades = userTrades.data.filter(trade => - trade.status === 'pending' || trade.status === 'confirmed' || trade.status === 'in_progress' + const activeListings = userListings.data.filter( + (listing) => listing.status === 'active', + ); + const pendingBids = userBids.data.filter((bid) => bid.status === 'pending'); + const activeTrades = userTrades.data.filter( + (trade) => + trade.status === 'pending' || + trade.status === 'confirmed' || + trade.status === 'in_progress', ); - const totalValue = userListings.data.reduce((sum, listing) => sum + (listing.quantity * listing.price), 0); - const avgListingPrice = userListings.data.length > 0 - ? userListings.data.reduce((sum, listing) => sum + listing.price, 0) / userListings.data.length - : 0; + const totalValue = userListings.data.reduce( + (sum, listing) => sum + listing.quantity * listing.price, + 0, + ); + const avgListingPrice = + userListings.data.length > 0 + ? userListings.data.reduce((sum, listing) => sum + listing.price, 0) / + userListings.data.length + : 0; return { summary: { @@ -287,54 +496,81 @@ export class EnergyController { recentTrades: userTrades.data.slice(0, 5), }, performance: { - listingViews: userListings.data.reduce((sum, listing) => sum + listing.viewCount, 0), - bidSuccessRate: userBids.data.length > 0 - ? (userBids.data.filter(bid => bid.status === 'accepted').length / userBids.data.length) * 100 - : 0, - tradeCompletionRate: userTrades.data.length > 0 - ? (userTrades.data.filter(trade => trade.status === 'completed').length / userTrades.data.length) * 100 - : 0, + listingViews: userListings.data.reduce( + (sum, listing) => sum + listing.viewCount, + 0, + ), + bidSuccessRate: + userBids.data.length > 0 + ? (userBids.data.filter((bid) => bid.status === 'accepted').length / + userBids.data.length) * + 100 + : 0, + tradeCompletionRate: + userTrades.data.length > 0 + ? (userTrades.data.filter((trade) => trade.status === 'completed') + .length / + userTrades.data.length) * + 100 + : 0, }, }; } @Get('statistics') @ApiOperation({ summary: 'Get platform statistics' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Statistics retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Statistics retrieved successfully', + }) async getStatistics(): Promise { const [allListings, orderBook] = await Promise.all([ this.energyService.getListings({}, { page: 1, limit: 1000 }), this.energyService.getOrderBook({}), ]); - const listingsByType = allListings.data.reduce((acc, listing) => { - acc[listing.type] = (acc[listing.type] || 0) + 1; - return acc; - }, {} as Record); - - const listingsByEnergyType = allListings.data.reduce((acc, listing) => { - acc[listing.energyType] = (acc[listing.energyType] || 0) + 1; - return acc; - }, {} as Record); - - const avgPriceByEnergyType = allListings.data.reduce((acc, listing) => { - if (!acc[listing.energyType]) { - acc[listing.energyType] = { total: 0, count: 0 }; - } - acc[listing.energyType].total += listing.price; - acc[listing.energyType].count += 1; - return acc; - }, {} as Record); - - const avgPriceByType = Object.entries(avgPriceByEnergyType).reduce((acc, [energyType, data]) => { - acc[energyType] = data.total / data.count; - return acc; - }, {} as Record); + const listingsByType = allListings.data.reduce( + (acc, listing) => { + acc[listing.type] = (acc[listing.type] || 0) + 1; + return acc; + }, + {} as Record, + ); + + const listingsByEnergyType = allListings.data.reduce( + (acc, listing) => { + acc[listing.energyType] = (acc[listing.energyType] || 0) + 1; + return acc; + }, + {} as Record, + ); + + const avgPriceByEnergyType = allListings.data.reduce( + (acc, listing) => { + if (!acc[listing.energyType]) { + acc[listing.energyType] = { total: 0, count: 0 }; + } + acc[listing.energyType].total += listing.price; + acc[listing.energyType].count += 1; + return acc; + }, + {} as Record, + ); + + const avgPriceByType = Object.entries(avgPriceByEnergyType).reduce( + (acc, [energyType, data]) => { + acc[energyType] = data.total / data.count; + return acc; + }, + {} as Record, + ); return { overview: { totalListings: allListings.total, - activeListings: allListings.data.filter(listing => listing.status === 'active').length, + activeListings: allListings.data.filter( + (listing) => listing.status === 'active', + ).length, totalBuyOrders: orderBook.summary.totalBuyOrders, totalSellOrders: orderBook.summary.totalSellOrders, totalBuyQuantity: orderBook.summary.totalBuyQuantity, @@ -350,7 +586,9 @@ export class EnergyController { avgBuyPrice: orderBook.summary.avgBuyPrice, avgSellPrice: orderBook.summary.avgSellPrice, priceVolatility: this.calculatePriceVolatility(allListings.data), - marketDepth: orderBook.summary.totalBuyQuantity + orderBook.summary.totalSellQuantity, + marketDepth: + orderBook.summary.totalBuyQuantity + + orderBook.summary.totalSellQuantity, }, }; } @@ -358,9 +596,11 @@ export class EnergyController { private calculatePriceVolatility(listings: EnergyListing[]): number { if (listings.length < 2) return 0; - const prices = listings.map(listing => listing.price); + const prices = listings.map((listing) => listing.price); const mean = prices.reduce((sum, price) => sum + price, 0) / prices.length; - const variance = prices.reduce((sum, price) => sum + Math.pow(price - mean, 2), 0) / prices.length; + const variance = + prices.reduce((sum, price) => sum + Math.pow(price - mean, 2), 0) / + prices.length; const standardDeviation = Math.sqrt(variance); return (standardDeviation / mean) * 100; diff --git a/src/energy/energy.module.ts b/src/energy/energy.module.ts index cd3e271..21e43bf 100644 --- a/src/energy/energy.module.ts +++ b/src/energy/energy.module.ts @@ -20,4 +20,4 @@ import { APP_FILTER } from '@nestjs/core'; ], exports: [EnergyService], }) -export class EnergyModule { } +export class EnergyModule {} diff --git a/src/energy/energy.service.ts b/src/energy/energy.service.ts index be91ad5..96d6839 100644 --- a/src/energy/energy.service.ts +++ b/src/energy/energy.service.ts @@ -1,9 +1,31 @@ -import { Injectable, Logger, NotFoundException, ForbiddenException, BadRequestException } from '@nestjs/common'; +import { + Injectable, + Logger, + NotFoundException, + ForbiddenException, + BadRequestException, +} from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository, DataSource, Between, LessThan, MoreThan, FindManyOptions } from 'typeorm'; -import { EnergyListing, ListingStatus, ListingType } from './entities/energy-listing.entity'; +import { + Repository, + DataSource, + Between, + LessThan, + MoreThan, + FindManyOptions, +} from 'typeorm'; +import { + EnergyListing, + ListingStatus, + ListingType, +} from './entities/energy-listing.entity'; import { Bid, BidStatus } from './entities/bid.entity'; -import { Trade, TradeStatus, PaymentStatus, DeliveryStatus } from './entities/trade.entity'; +import { + Trade, + TradeStatus, + PaymentStatus, + DeliveryStatus, +} from './entities/trade.entity'; import { CreateListingDto } from './dto/create-listing.dto'; import { UpdateListingDto } from './dto/update-listing.dto'; import { PlaceBidDto } from './dto/place-bid.dto'; @@ -60,7 +82,10 @@ export class EnergyService { private readonly dataSource: DataSource, ) {} - async createListing(createListingDto: CreateListingDto, userId: string): Promise { + async createListing( + createListingDto: CreateListingDto, + userId: string, + ): Promise { this.logger.log(`Creating new energy listing for user: ${userId}`); const listing = this.listingRepository.create({ @@ -88,7 +113,7 @@ export class EnergyService { } const savedListing = await this.listingRepository.save(listing); - + this.logger.log(`Created listing: ${savedListing.id}`); return savedListing; } @@ -97,9 +122,12 @@ export class EnergyService { filter: ListingFilter = {}, pagination: PaginationOptions = { page: 1, limit: 10 }, ): Promise> { - this.logger.log(`Fetching listings with filter: ${JSON.stringify(filter)}, pagination: ${JSON.stringify(pagination)}`); + this.logger.log( + `Fetching listings with filter: ${JSON.stringify(filter)}, pagination: ${JSON.stringify(pagination)}`, + ); - const queryBuilder = this.listingRepository.createQueryBuilder('listing') + const queryBuilder = this.listingRepository + .createQueryBuilder('listing') .leftJoinAndSelect('listing.bids', 'bids') .leftJoinAndSelect('listing.trades', 'trades'); @@ -108,52 +136,74 @@ export class EnergyService { } if (filter.energyType) { - queryBuilder.andWhere('listing.energyType = :energyType', { energyType: filter.energyType }); + queryBuilder.andWhere('listing.energyType = :energyType', { + energyType: filter.energyType, + }); } if (filter.status) { - queryBuilder.andWhere('listing.status = :status', { status: filter.status }); + queryBuilder.andWhere('listing.status = :status', { + status: filter.status, + }); } if (filter.minPrice) { - queryBuilder.andWhere('listing.price >= :minPrice', { minPrice: filter.minPrice }); + queryBuilder.andWhere('listing.price >= :minPrice', { + minPrice: filter.minPrice, + }); } if (filter.maxPrice) { - queryBuilder.andWhere('listing.price <= :maxPrice', { maxPrice: filter.maxPrice }); + queryBuilder.andWhere('listing.price <= :maxPrice', { + maxPrice: filter.maxPrice, + }); } if (filter.minQuantity) { - queryBuilder.andWhere('listing.quantity >= :minQuantity', { minQuantity: filter.minQuantity }); + queryBuilder.andWhere('listing.quantity >= :minQuantity', { + minQuantity: filter.minQuantity, + }); } if (filter.maxQuantity) { - queryBuilder.andWhere('listing.quantity <= :maxQuantity', { maxQuantity: filter.maxQuantity }); + queryBuilder.andWhere('listing.quantity <= :maxQuantity', { + maxQuantity: filter.maxQuantity, + }); } if (filter.createdBy) { - queryBuilder.andWhere('listing.createdBy = :createdBy', { createdBy: filter.createdBy }); + queryBuilder.andWhere('listing.createdBy = :createdBy', { + createdBy: filter.createdBy, + }); } if (filter.isFeatured !== undefined) { - queryBuilder.andWhere('listing.isFeatured = :isFeatured', { isFeatured: filter.isFeatured }); + queryBuilder.andWhere('listing.isFeatured = :isFeatured', { + isFeatured: filter.isFeatured, + }); } if (filter.isVerified !== undefined) { - queryBuilder.andWhere('listing.isVerified = :isVerified', { isVerified: filter.isVerified }); + queryBuilder.andWhere('listing.isVerified = :isVerified', { + isVerified: filter.isVerified, + }); } if (filter.expiresAfter) { - queryBuilder.andWhere('listing.expiresAt >= :expiresAfter', { expiresAfter: filter.expiresAfter }); + queryBuilder.andWhere('listing.expiresAt >= :expiresAfter', { + expiresAfter: filter.expiresAfter, + }); } if (filter.expiresBefore) { - queryBuilder.andWhere('listing.expiresAt <= :expiresBefore', { expiresBefore: filter.expiresBefore }); + queryBuilder.andWhere('listing.expiresAt <= :expiresBefore', { + expiresBefore: filter.expiresBefore, + }); } if (filter.location) { queryBuilder.andWhere( - '(6371 * acos(cos(radians(:latitude)) * cos(radians(listing.location->>\'latitude\')) * cos(radians(listing.location->>\'longitude\') - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(listing.location->>\'latitude\')))) <= :radius', + "(6371 * acos(cos(radians(:latitude)) * cos(radians(listing.location->>'latitude')) * cos(radians(listing.location->>'longitude') - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(listing.location->>'latitude')))) <= :radius", { latitude: filter.location.latitude, longitude: filter.location.longitude, @@ -199,15 +249,24 @@ export class EnergyService { return listing; } - async updateListing(id: string, updateListingDto: UpdateListingDto, userId: string): Promise { + async updateListing( + id: string, + updateListingDto: UpdateListingDto, + userId: string, + ): Promise { const listing = await this.getListingById(id); if (listing.createdBy !== userId) { throw new ForbiddenException('You can only update your own listings'); } - if (listing.status === ListingStatus.FILLED || listing.status === ListingStatus.CANCELLED) { - throw new BadRequestException('Cannot update listing that is filled or cancelled'); + if ( + listing.status === ListingStatus.FILLED || + listing.status === ListingStatus.CANCELLED + ) { + throw new BadRequestException( + 'Cannot update listing that is filled or cancelled', + ); } Object.assign(listing, updateListingDto); @@ -230,7 +289,7 @@ export class EnergyService { } const updatedListing = await this.listingRepository.save(listing); - + this.logger.log(`Updated listing: ${id} by user: ${userId}`); return updatedListing; } @@ -243,7 +302,9 @@ export class EnergyService { } if (listing.status === ListingStatus.FILLED) { - throw new BadRequestException('Cannot cancel listing that is already filled'); + throw new BadRequestException( + 'Cannot cancel listing that is already filled', + ); } if (listing.status === ListingStatus.CANCELLED) { @@ -255,15 +316,17 @@ export class EnergyService { listing.updatedBy = userId; const cancelledListing = await this.listingRepository.save(listing); - + await this.rejectAllBidsForListing(id, userId); - + this.logger.log(`Cancelled listing: ${id} by user: ${userId}`); return cancelledListing; } async placeBid(placeBidDto: PlaceBidDto, userId: string): Promise { - this.logger.log(`Placing bid on listing: ${placeBidDto.listingId} by user: ${userId}`); + this.logger.log( + `Placing bid on listing: ${placeBidDto.listingId} by user: ${userId}`, + ); const listing = await this.getListingById(placeBidDto.listingId); @@ -280,23 +343,39 @@ export class EnergyService { } if (placeBidDto.quantity > listing.quantity) { - throw new BadRequestException('Bid quantity cannot exceed listing quantity'); + throw new BadRequestException( + 'Bid quantity cannot exceed listing quantity', + ); } if (listing.minPrice && placeBidDto.price < listing.minPrice) { - throw new BadRequestException(`Bid price cannot be below minimum price: ${listing.minPrice}`); + throw new BadRequestException( + `Bid price cannot be below minimum price: ${listing.minPrice}`, + ); } if (listing.maxPrice && placeBidDto.price > listing.maxPrice) { - throw new BadRequestException(`Bid price cannot exceed maximum price: ${listing.maxPrice}`); + throw new BadRequestException( + `Bid price cannot exceed maximum price: ${listing.maxPrice}`, + ); } - if (listing.requirements?.minimumBidQuantity && placeBidDto.quantity < listing.requirements.minimumBidQuantity) { - throw new BadRequestException(`Bid quantity must be at least: ${listing.requirements.minimumBidQuantity}`); + if ( + listing.requirements?.minimumBidQuantity && + placeBidDto.quantity < listing.requirements.minimumBidQuantity + ) { + throw new BadRequestException( + `Bid quantity must be at least: ${listing.requirements.minimumBidQuantity}`, + ); } - if (listing.requirements?.maximumBidQuantity && placeBidDto.quantity > listing.requirements.maximumBidQuantity) { - throw new BadRequestException(`Bid quantity cannot exceed: ${listing.requirements.maximumBidQuantity}`); + if ( + listing.requirements?.maximumBidQuantity && + placeBidDto.quantity > listing.requirements.maximumBidQuantity + ) { + throw new BadRequestException( + `Bid quantity cannot exceed: ${listing.requirements.maximumBidQuantity}`, + ); } const existingBid = await this.bidRepository.findOne({ @@ -308,7 +387,9 @@ export class EnergyService { }); if (existingBid) { - throw new BadRequestException('You already have a pending bid on this listing'); + throw new BadRequestException( + 'You already have a pending bid on this listing', + ); } const bid = this.bidRepository.create({ @@ -327,14 +408,20 @@ export class EnergyService { await this.incrementBidCount(placeBidDto.listingId); - this.logger.log(`Placed bid: ${savedBid.id} on listing: ${placeBidDto.listingId}`); + this.logger.log( + `Placed bid: ${savedBid.id} on listing: ${placeBidDto.listingId}`, + ); return savedBid; } - async getBidsByUser(userId: string, pagination: PaginationOptions = { page: 1, limit: 10 }): Promise> { + async getBidsByUser( + userId: string, + pagination: PaginationOptions = { page: 1, limit: 10 }, + ): Promise> { this.logger.log(`Fetching bids for user: ${userId}`); - const queryBuilder = this.bidRepository.createQueryBuilder('bid') + const queryBuilder = this.bidRepository + .createQueryBuilder('bid') .leftJoinAndSelect('bid.listing', 'listing') .where('bid.bidderId = :userId', { userId }); @@ -364,7 +451,9 @@ export class EnergyService { const listing = await this.getListingById(listingId); if (listing.createdBy !== userId) { - throw new ForbiddenException('You can only view bids for your own listings'); + throw new ForbiddenException( + 'You can only view bids for your own listings', + ); } return this.bidRepository.find({ @@ -385,7 +474,9 @@ export class EnergyService { } if (bid.listing.createdBy !== userId) { - throw new ForbiddenException('You can only accept bids for your own listings'); + throw new ForbiddenException( + 'You can only accept bids for your own listings', + ); } if (bid.status !== BidStatus.PENDING) { @@ -396,7 +487,7 @@ export class EnergyService { throw new BadRequestException('Listing is no longer active'); } - return await this.dataSource.transaction(async manager => { + return await this.dataSource.transaction(async (manager) => { bid.status = BidStatus.ACCEPTED; bid.acceptedAt = new Date(); bid.respondedBy = userId; @@ -413,7 +504,11 @@ export class EnergyService { }); } - async rejectBid(bidId: string, userId: string, reason?: string): Promise { + async rejectBid( + bidId: string, + userId: string, + reason?: string, + ): Promise { const bid = await this.bidRepository.findOne({ where: { id: bidId }, relations: ['listing'], @@ -424,7 +519,9 @@ export class EnergyService { } if (bid.listing.createdBy !== userId) { - throw new ForbiddenException('You can only reject bids for your own listings'); + throw new ForbiddenException( + 'You can only reject bids for your own listings', + ); } if (bid.status !== BidStatus.PENDING) { @@ -446,7 +543,7 @@ export class EnergyService { }); const rejectedBid = await this.bidRepository.save(bid); - + this.logger.log(`Rejected bid: ${bidId} for listing: ${bid.listingId}`); return rejectedBid; } @@ -471,15 +568,20 @@ export class EnergyService { bid.updatedBy = userId; const withdrawnBid = await this.bidRepository.save(bid); - + await this.decrementBidCount(bid.listingId); - + this.logger.log(`Withdrew bid: ${bidId} by user: ${userId}`); return withdrawnBid; } - async executeTrade(executeTradeDto: ExecuteTradeDto, userId: string): Promise { - this.logger.log(`Executing trade for bid: ${executeTradeDto.bidId} by user: ${userId}`); + async executeTrade( + executeTradeDto: ExecuteTradeDto, + userId: string, + ): Promise { + this.logger.log( + `Executing trade for bid: ${executeTradeDto.bidId} by user: ${userId}`, + ); const bid = await this.bidRepository.findOne({ where: { id: executeTradeDto.bidId }, @@ -487,7 +589,9 @@ export class EnergyService { }); if (!bid) { - throw new NotFoundException(`Bid with ID ${executeTradeDto.bidId} not found`); + throw new NotFoundException( + `Bid with ID ${executeTradeDto.bidId} not found`, + ); } if (bid.status !== BidStatus.ACCEPTED) { @@ -497,8 +601,13 @@ export class EnergyService { const isBuyer = bid.listing.type === ListingType.SELL; const isSeller = bid.listing.type === ListingType.BUY; - if ((isBuyer && bid.bidderId !== userId) || (isSeller && bid.listing.createdBy !== userId)) { - throw new ForbiddenException('You are not authorized to execute this trade'); + if ( + (isBuyer && bid.bidderId !== userId) || + (isSeller && bid.listing.createdBy !== userId) + ) { + throw new ForbiddenException( + 'You are not authorized to execute this trade', + ); } const existingTrade = await this.tradeRepository.findOne({ @@ -509,7 +618,7 @@ export class EnergyService { throw new BadRequestException('Trade already exists for this bid'); } - const finalPrice = executeTradeDto.negotiatedDiscount + const finalPrice = executeTradeDto.negotiatedDiscount ? bid.price * (1 - executeTradeDto.negotiatedDiscount) : bid.price; @@ -552,38 +661,48 @@ export class EnergyService { if (executeTradeDto.paymentDetails?.paymentSchedule) { trade.paymentDetails = { ...executeTradeDto.paymentDetails, - paymentSchedule: executeTradeDto.paymentDetails.paymentSchedule.map(schedule => ({ - ...schedule, - dueDate: new Date(schedule.dueDate), - })), + paymentSchedule: executeTradeDto.paymentDetails.paymentSchedule.map( + (schedule) => ({ + ...schedule, + dueDate: new Date(schedule.dueDate), + }), + ), }; } if (executeTradeDto.contractTerms?.termsAcceptedAt) { trade.contractTerms = { ...executeTradeDto.contractTerms, - termsAcceptedAt: new Date(executeTradeDto.contractTerms.termsAcceptedAt), + termsAcceptedAt: new Date( + executeTradeDto.contractTerms.termsAcceptedAt, + ), }; } if (executeTradeDto.qualityAssurance?.inspectionDate) { trade.qualityAssurance = { ...executeTradeDto.qualityAssurance, - inspectionDate: new Date(executeTradeDto.qualityAssurance.inspectionDate), + inspectionDate: new Date( + executeTradeDto.qualityAssurance.inspectionDate, + ), }; } if (executeTradeDto.milestones) { - trade.milestones = executeTradeDto.milestones.map(milestone => ({ + trade.milestones = executeTradeDto.milestones.map((milestone) => ({ ...milestone, dueDate: new Date(milestone.dueDate), - completedDate: milestone.completedDate ? new Date(milestone.completedDate) : undefined, + completedDate: milestone.completedDate + ? new Date(milestone.completedDate) + : undefined, })); } const savedTrade = await this.tradeRepository.save(trade); - this.logger.log(`Executed trade: ${savedTrade.id} for bid: ${executeTradeDto.bidId}`); + this.logger.log( + `Executed trade: ${savedTrade.id} for bid: ${executeTradeDto.bidId}`, + ); return savedTrade; } @@ -598,16 +717,22 @@ export class EnergyService { } if (trade.buyerId !== userId && trade.sellerId !== userId) { - throw new ForbiddenException('You can only view trades you are involved in'); + throw new ForbiddenException( + 'You can only view trades you are involved in', + ); } return trade; } - async getTradesByUser(userId: string, pagination: PaginationOptions = { page: 1, limit: 10 }): Promise> { + async getTradesByUser( + userId: string, + pagination: PaginationOptions = { page: 1, limit: 10 }, + ): Promise> { this.logger.log(`Fetching trades for user: ${userId}`); - const queryBuilder = this.tradeRepository.createQueryBuilder('trade') + const queryBuilder = this.tradeRepository + .createQueryBuilder('trade') .leftJoinAndSelect('trade.listing', 'listing') .leftJoinAndSelect('trade.bid', 'bid') .where('trade.buyerId = :userId OR trade.sellerId = :userId', { userId }); @@ -634,12 +759,19 @@ export class EnergyService { }; } - async updateTradeStatus(id: string, status: TradeStatus, userId: string, reason?: string): Promise { + async updateTradeStatus( + id: string, + status: TradeStatus, + userId: string, + reason?: string, + ): Promise { const trade = await this.getTradeById(id, userId); const validTransitions = this.getValidStatusTransitions(trade.status); if (!validTransitions.includes(status)) { - throw new BadRequestException(`Cannot transition from ${trade.status} to ${status}`); + throw new BadRequestException( + `Cannot transition from ${trade.status} to ${status}`, + ); } const previousStatus = trade.status; @@ -678,7 +810,9 @@ export class EnergyService { const updatedTrade = await this.tradeRepository.save(trade); - this.logger.log(`Updated trade status: ${id} to ${status} by user: ${userId}`); + this.logger.log( + `Updated trade status: ${id} to ${status} by user: ${userId}`, + ); return updatedTrade; } @@ -699,20 +833,40 @@ export class EnergyService { const sellFilter = { ...filter, type: ListingType.SELL }; const [buyOrders, sellOrders] = await Promise.all([ - this.getListings(buyFilter, { page: 1, limit: 100, sortBy: 'price', sortOrder: 'DESC' }), - this.getListings(sellFilter, { page: 1, limit: 100, sortBy: 'price', sortOrder: 'ASC' }), + this.getListings(buyFilter, { + page: 1, + limit: 100, + sortBy: 'price', + sortOrder: 'DESC', + }), + this.getListings(sellFilter, { + page: 1, + limit: 100, + sortBy: 'price', + sortOrder: 'ASC', + }), ]); - const totalBuyQuantity = buyOrders.data.reduce((sum, order) => sum + order.quantity, 0); - const totalSellQuantity = sellOrders.data.reduce((sum, order) => sum + order.quantity, 0); - - const avgBuyPrice = buyOrders.data.length > 0 - ? buyOrders.data.reduce((sum, order) => sum + order.price, 0) / buyOrders.data.length - : 0; - - const avgSellPrice = sellOrders.data.length > 0 - ? sellOrders.data.reduce((sum, order) => sum + order.price, 0) / sellOrders.data.length - : 0; + const totalBuyQuantity = buyOrders.data.reduce( + (sum, order) => sum + order.quantity, + 0, + ); + const totalSellQuantity = sellOrders.data.reduce( + (sum, order) => sum + order.quantity, + 0, + ); + + const avgBuyPrice = + buyOrders.data.length > 0 + ? buyOrders.data.reduce((sum, order) => sum + order.price, 0) / + buyOrders.data.length + : 0; + + const avgSellPrice = + sellOrders.data.length > 0 + ? sellOrders.data.reduce((sum, order) => sum + order.price, 0) / + sellOrders.data.length + : 0; const spread = avgSellPrice - avgBuyPrice; @@ -743,7 +897,10 @@ export class EnergyService { await this.listingRepository.decrement({ id: listingId }, 'bidCount', 1); } - private async rejectAllBidsForListing(listingId: string, userId: string): Promise { + private async rejectAllBidsForListing( + listingId: string, + userId: string, + ): Promise { const pendingBids = await this.bidRepository.find({ where: { listingId, status: BidStatus.PENDING }, }); @@ -756,10 +913,14 @@ export class EnergyService { } } - private async rejectOtherBidsForListing(listingId: string, acceptedBidId: string, manager: Repository): Promise { + private async rejectOtherBidsForListing( + listingId: string, + acceptedBidId: string, + manager: Repository, + ): Promise { const otherBids = await manager.find({ - where: { - listingId, + where: { + listingId, status: BidStatus.PENDING, id: Not(acceptedBidId), }, @@ -776,10 +937,18 @@ export class EnergyService { const transitions: Record = { [TradeStatus.PENDING]: [TradeStatus.CONFIRMED, TradeStatus.CANCELLED], [TradeStatus.CONFIRMED]: [TradeStatus.IN_PROGRESS, TradeStatus.CANCELLED], - [TradeStatus.IN_PROGRESS]: [TradeStatus.COMPLETED, TradeStatus.DISPUTED, TradeStatus.CANCELLED], + [TradeStatus.IN_PROGRESS]: [ + TradeStatus.COMPLETED, + TradeStatus.DISPUTED, + TradeStatus.CANCELLED, + ], [TradeStatus.COMPLETED]: [TradeStatus.REFUNDED], [TradeStatus.CANCELLED]: [], - [TradeStatus.DISPUTED]: [TradeStatus.COMPLETED, TradeStatus.CANCELLED, TradeStatus.REFUNDED], + [TradeStatus.DISPUTED]: [ + TradeStatus.COMPLETED, + TradeStatus.CANCELLED, + TradeStatus.REFUNDED, + ], [TradeStatus.REFUNDED]: [], }; diff --git a/src/energy/entities/bid.entity.ts b/src/energy/entities/bid.entity.ts index 4703e18..d12784d 100644 --- a/src/energy/entities/bid.entity.ts +++ b/src/energy/entities/bid.entity.ts @@ -1,4 +1,12 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + ManyToOne, + JoinColumn, +} from 'typeorm'; import { EnergyListing, ListingType } from './energy-listing.entity'; export enum BidStatus { @@ -130,7 +138,13 @@ export class Bid { @Column({ name: 'auto_accept', default: false }) autoAccept: boolean; - @Column({ name: 'auto_reject_threshold', type: 'decimal', precision: 3, scale: 2, nullable: true }) + @Column({ + name: 'auto_reject_threshold', + type: 'decimal', + precision: 3, + scale: 2, + nullable: true, + }) autoRejectThreshold?: number; @Column({ name: 'expires_at', type: 'datetime', nullable: true }) @@ -190,7 +204,9 @@ export class Bid { @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; - @ManyToOne(() => EnergyListing, listing => listing.bids, { onDelete: 'CASCADE' }) + @ManyToOne(() => EnergyListing, (listing) => listing.bids, { + onDelete: 'CASCADE', + }) @JoinColumn({ name: 'listing_id' }) listing: EnergyListing; diff --git a/src/energy/entities/energy-listing.entity.ts b/src/energy/entities/energy-listing.entity.ts index d751f0f..3aa1d0c 100644 --- a/src/energy/entities/energy-listing.entity.ts +++ b/src/energy/entities/energy-listing.entity.ts @@ -1,4 +1,13 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, OneToMany, JoinColumn } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + ManyToOne, + OneToMany, + JoinColumn, +} from 'typeorm'; export enum ListingType { BUY = 'buy', @@ -185,10 +194,22 @@ export class EnergyListing { @Column({ name: 'is_premium', default: false }) isPremium: boolean; - @Column({ name: 'visibility_score', type: 'decimal', precision: 3, scale: 2, default: 1.0 }) + @Column({ + name: 'visibility_score', + type: 'decimal', + precision: 3, + scale: 2, + default: 1.0, + }) visibilityScore: number; - @Column({ name: 'match_score', type: 'decimal', precision: 3, scale: 2, nullable: true }) + @Column({ + name: 'match_score', + type: 'decimal', + precision: 3, + scale: 2, + nullable: true, + }) matchScore?: number; @Column({ type: 'json', nullable: true }) @@ -212,9 +233,9 @@ export class EnergyListing { @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; - @OneToMany(() => Bid, bid => bid.listing) + @OneToMany(() => Bid, (bid) => bid.listing) bids: Bid[]; - @OneToMany(() => Trade, trade => trade.listing) + @OneToMany(() => Trade, (trade) => trade.listing) trades: Trade[]; } diff --git a/src/energy/entities/trade.entity.ts b/src/energy/entities/trade.entity.ts index 4cd1a43..889977f 100644 --- a/src/energy/entities/trade.entity.ts +++ b/src/energy/entities/trade.entity.ts @@ -1,4 +1,12 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + ManyToOne, + JoinColumn, +} from 'typeorm'; import { EnergyListing } from './energy-listing.entity'; import { Bid } from './bid.entity'; @@ -296,13 +304,31 @@ export class Trade { @Column({ name: 'dispute_resolution', nullable: true }) disputeResolution?: string; - @Column({ name: 'refund_amount', type: 'decimal', precision: 15, scale: 2, nullable: true }) + @Column({ + name: 'refund_amount', + type: 'decimal', + precision: 15, + scale: 2, + nullable: true, + }) refundAmount?: number; - @Column({ name: 'penalty_amount', type: 'decimal', precision: 15, scale: 2, nullable: true }) + @Column({ + name: 'penalty_amount', + type: 'decimal', + precision: 15, + scale: 2, + nullable: true, + }) penaltyAmount?: number; - @Column({ name: 'bonus_amount', type: 'decimal', precision: 15, scale: 2, nullable: true }) + @Column({ + name: 'bonus_amount', + type: 'decimal', + precision: 15, + scale: 2, + nullable: true, + }) bonusAmount?: number; @CreateDateColumn({ name: 'created_at' }) @@ -311,7 +337,9 @@ export class Trade { @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; - @ManyToOne(() => EnergyListing, listing => listing.trades, { onDelete: 'CASCADE' }) + @ManyToOne(() => EnergyListing, (listing) => listing.trades, { + onDelete: 'CASCADE', + }) @JoinColumn({ name: 'listing_id' }) listing: EnergyListing; diff --git a/src/energy/filters/http-exception.filter.ts b/src/energy/filters/http-exception.filter.ts index 3cb2d88..aedbd89 100644 --- a/src/energy/filters/http-exception.filter.ts +++ b/src/energy/filters/http-exception.filter.ts @@ -42,7 +42,9 @@ export class HttpExceptionFilter implements ExceptionFilter { if (exceptionResponse.details && Array.isArray(exceptionResponse.details)) { errorResponse.details = exceptionResponse.details.map((detail: any) => ({ field: detail.property || detail.field, - message: detail.constraints ? Object.values(detail.constraints).join(', ') : detail.message, + message: detail.constraints + ? Object.values(detail.constraints).join(', ') + : detail.message, value: detail.value, })); } @@ -60,7 +62,11 @@ export class HttpExceptionFilter implements ExceptionFilter { response.status(status).json(errorResponse); } - private logError(exception: HttpException, request: Request, errorResponse: any) { + private logError( + exception: HttpException, + request: Request, + errorResponse: any, + ) { const { method, url, ip, headers } = request; const userAgent = headers['user-agent'] || 'Unknown'; const userId = (request as any).user?.id || 'Anonymous'; @@ -78,30 +84,21 @@ export class HttpExceptionFilter implements ExceptionFilter { }; if (exception.getStatus() >= 500) { - this.logger.error( - `Server Error: ${method} ${url}`, - { - ...logData, - stack: exception.stack, - response: errorResponse, - }, - ); + this.logger.error(`Server Error: ${method} ${url}`, { + ...logData, + stack: exception.stack, + response: errorResponse, + }); } else if (exception.getStatus() >= 400) { - this.logger.warn( - `Client Error: ${method} ${url}`, - { - ...logData, - response: errorResponse, - }, - ); + this.logger.warn(`Client Error: ${method} ${url}`, { + ...logData, + response: errorResponse, + }); } else { - this.logger.log( - `HTTP Exception: ${method} ${url}`, - { - ...logData, - response: errorResponse, - }, - ); + this.logger.log(`HTTP Exception: ${method} ${url}`, { + ...logData, + response: errorResponse, + }); } } } diff --git a/src/energy/guards/auth.guard.ts b/src/energy/guards/auth.guard.ts index 861c676..fbfda84 100644 --- a/src/energy/guards/auth.guard.ts +++ b/src/energy/guards/auth.guard.ts @@ -7,7 +7,7 @@ export class AuthGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const request = context.switchToHttp().getRequest(); - + const token = this.extractTokenFromHeader(request); if (!token) { return false; diff --git a/src/forecasting/ensemble/ensemble-methods.service.ts b/src/forecasting/ensemble/ensemble-methods.service.ts index 0a3219c..2167032 100644 --- a/src/forecasting/ensemble/ensemble-methods.service.ts +++ b/src/forecasting/ensemble/ensemble-methods.service.ts @@ -507,7 +507,7 @@ export class EnsembleMethodsService { // Use provided weights const weights: Record = {}; forecasts.forEach((forecast, i) => { - weights[forecast.model] = config.weights![i]; + weights[forecast.model] = config.weights[i]; }); return weights; } diff --git a/src/fraud/dto/fraud-alert.dto.ts b/src/fraud/dto/fraud-alert.dto.ts index d1911b6..dd42402 100644 --- a/src/fraud/dto/fraud-alert.dto.ts +++ b/src/fraud/dto/fraud-alert.dto.ts @@ -14,7 +14,11 @@ import { MaxLength, } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { FraudType, FraudSeverity, FraudCaseStatus } from '../entities/fraud-case.entity'; +import { + FraudType, + FraudSeverity, + FraudCaseStatus, +} from '../entities/fraud-case.entity'; // ─── Re-export enums for convenience ──────────────────────────────────────── export { FraudType, FraudSeverity, FraudCaseStatus }; @@ -38,7 +42,9 @@ export class AnalyzeTradeDto { @IsString() market: string; - @ApiProperty({ description: 'Asset type (e.g., electricity, gas, carbon_credit)' }) + @ApiProperty({ + description: 'Asset type (e.g., electricity, gas, carbon_credit)', + }) @IsString() assetType: string; @@ -83,7 +89,10 @@ export class AnalyzeTradeDto { // ─── Batch Trade Analysis ──────────────────────────────────────────────────── export class AnalyzeTradesBatchDto { - @ApiProperty({ type: [AnalyzeTradeDto], description: 'Array of trades to analyze' }) + @ApiProperty({ + type: [AnalyzeTradeDto], + description: 'Array of trades to analyze', + }) @IsArray() trades: AnalyzeTradeDto[]; } diff --git a/src/fraud/fraud-detection.controller.ts b/src/fraud/fraud-detection.controller.ts index 6a19a72..a1759b0 100644 --- a/src/fraud/fraud-detection.controller.ts +++ b/src/fraud/fraud-detection.controller.ts @@ -75,7 +75,9 @@ export class FraudDetectionController { // ─── Case Management ───────────────────────────────────────────────────── @Get('cases') - @ApiOperation({ summary: 'Get fraud cases with optional filters (paginated)' }) + @ApiOperation({ + summary: 'Get fraud cases with optional filters (paginated)', + }) @ApiResponse({ status: 200, description: 'Paginated fraud cases' }) async getCases(@Query() queryDto: FraudReportQueryDto) { return this.reportingService.queryCases(queryDto); @@ -83,7 +85,10 @@ export class FraudDetectionController { @Get('cases/ref/:caseId') @ApiOperation({ summary: 'Get a fraud case by human-readable case ID' }) - @ApiParam({ name: 'caseId', description: 'Case ID (e.g. FRAUD-20250328-ABCD1234)' }) + @ApiParam({ + name: 'caseId', + description: 'Case ID (e.g. FRAUD-20250328-ABCD1234)', + }) async getCaseByCaseId(@Param('caseId') caseId: string) { return this.reportingService.getCaseByCaseId(caseId); } @@ -98,7 +103,11 @@ export class FraudDetectionController { @Query('page') page = 1, @Query('limit') limit = 20, ) { - return this.reportingService.getCasesByTrader(traderId, Number(page), Number(limit)); + return this.reportingService.getCasesByTrader( + traderId, + Number(page), + Number(limit), + ); } @Get('cases/:id') @@ -125,7 +134,10 @@ export class FraudDetectionController { @Post('reports/sar/:caseId/generate') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: 'Manually generate SAR for a specific case' }) - @ApiParam({ name: 'caseId', description: 'Case ID (FRAUD-XXXXXXXX-XXXXXXXX)' }) + @ApiParam({ + name: 'caseId', + description: 'Case ID (FRAUD-XXXXXXXX-XXXXXXXX)', + }) @ApiResponse({ status: 200, description: 'SAR generated successfully' }) async generateSar(@Param('caseId') caseId: string) { return this.reportingService.generateSARById(caseId); @@ -150,7 +162,9 @@ export class FraudDetectionController { } @Get('monitoring/status') - @ApiOperation({ summary: 'Get current monitoring status and active sessions' }) + @ApiOperation({ + summary: 'Get current monitoring status and active sessions', + }) async getMonitoringStatus() { return this.monitorService.getMonitoringStatus(); } @@ -179,7 +193,10 @@ export class FraudDetectionController { @ApiOperation({ summary: 'Unblock a trader' }) async unblockTrader(@Body('traderId') traderId: string) { const removed = this.preventionService.unblockTrader(traderId); - return { message: removed ? 'Trader unblocked' : 'Trader not found in blocklist', traderId }; + return { + message: removed ? 'Trader unblocked' : 'Trader not found in blocklist', + traderId, + }; } @Get('prevention/blocked') @@ -228,7 +245,9 @@ export class FraudDetectionController { // ─── Pattern Catalogue ──────────────────────────────────────────────────── @Get('patterns') - @ApiOperation({ summary: 'Get catalogue of all 50+ registered fraud patterns' }) + @ApiOperation({ + summary: 'Get catalogue of all 50+ registered fraud patterns', + }) @ApiResponse({ status: 200, description: 'Pattern definitions' }) async getPatterns() { return { diff --git a/src/fraud/ml/fraud-ml.service.spec.ts b/src/fraud/ml/fraud-ml.service.spec.ts index b18a3e8..1163e35 100644 --- a/src/fraud/ml/fraud-ml.service.spec.ts +++ b/src/fraud/ml/fraud-ml.service.spec.ts @@ -85,7 +85,9 @@ describe('FraudMlService', () => { }; const result = await service.analyzeTrade(normalTrade); - expect([FraudSeverity.LOW, FraudSeverity.MEDIUM]).toContain(result.severity); + expect([FraudSeverity.LOW, FraudSeverity.MEDIUM]).toContain( + result.severity, + ); }); it('should return higher score for high-volume anomaly', async () => { @@ -182,7 +184,9 @@ describe('FraudMlService', () => { traderId: `trader-${i % 10}`, })); - const results = await Promise.all(trades.map((t) => service.analyzeTrade(t))); + const results = await Promise.all( + trades.map((t) => service.analyzeTrade(t)), + ); expect(results).toHaveLength(100); expect(results.every((r) => r.score >= 0)).toBe(true); }); diff --git a/src/fraud/ml/fraud-ml.service.ts b/src/fraud/ml/fraud-ml.service.ts index 37d65f0..04d5f4e 100644 --- a/src/fraud/ml/fraud-ml.service.ts +++ b/src/fraud/ml/fraud-ml.service.ts @@ -103,12 +103,22 @@ export class FraudMlService { this.logger.warn(`ML analysis exceeded 100ms: ${processingTimeMs}ms`); } - return { score, severity, features, topContributors, evidence, processingTimeMs }; + return { + score, + severity, + features, + topContributors, + evidence, + processingTimeMs, + }; } // ─── Feature Extraction ────────────────────────────────────────────────── - private extractFeatures(tradeDto: AnalyzeTradeDto, baseline: TraderBaseline): MlFeatures { + private extractFeatures( + tradeDto: AnalyzeTradeDto, + baseline: TraderBaseline, + ): MlFeatures { return { volumeAnomaly: this.computeVolumeAnomaly(tradeDto.quantity, baseline), frequencyAnomaly: this.computeFrequencyAnomaly(baseline), @@ -116,21 +126,29 @@ export class FraudMlService { orderToTradeRatio: this.computeOrderToTradeRatio(baseline), roundTripScore: this.computeRoundTripScore(tradeDto), velocityScore: this.computeVelocityScore(baseline), - counterpartyConcentration: this.computeCounterpartyConcentration(tradeDto), + counterpartyConcentration: + this.computeCounterpartyConcentration(tradeDto), timePatternAnomaly: this.computeTimePatternAnomaly(tradeDto), marketImpactScore: this.computeMarketImpact(tradeDto, baseline), - cancellationRate: baseline.avgOrderToTradeRatio > 0 - ? Math.min(1, baseline.avgOrderToTradeRatio) - : 0, + cancellationRate: + baseline.avgOrderToTradeRatio > 0 + ? Math.min(1, baseline.avgOrderToTradeRatio) + : 0, }; } - private computeVolumeAnomaly(quantity: number, baseline: TraderBaseline): number { + private computeVolumeAnomaly( + quantity: number, + baseline: TraderBaseline, + ): number { if (baseline.tradeCount < this.MIN_TRADES_FOR_BASELINE) return 0.1; if (baseline.avgVolume === 0) return 0.1; const ratio = quantity / baseline.avgVolume; // Normalise: ratio of 1 → 0, ratio of MULTIPLIER → 1.0 - return Math.min(1, Math.max(0, (ratio - 1) / (this.VOLUME_ANOMALY_MULTIPLIER - 1))); + return Math.min( + 1, + Math.max(0, (ratio - 1) / (this.VOLUME_ANOMALY_MULTIPLIER - 1)), + ); } private computeFrequencyAnomaly(baseline: TraderBaseline): number { @@ -161,7 +179,10 @@ export class FraudMlService { private computeRoundTripScore(tradeDto: AnalyzeTradeDto): number { // Simplified: look for back-and-forth trades with same counterparty // In production, this would query recent trades from DB - if (tradeDto.counterpartyId && tradeDto.counterpartyId === tradeDto.traderId) { + if ( + tradeDto.counterpartyId && + tradeDto.counterpartyId === tradeDto.traderId + ) { return 1.0; // Self-trade } // Placeholder — real impl queries recent opposite trades @@ -171,7 +192,10 @@ export class FraudMlService { private computeVelocityScore(baseline: TraderBaseline): number { const recentFrequency = baseline.avgFrequency; // Burst trading: normalized 0-1 - return Math.min(1, recentFrequency / this.FREQUENCY_ANOMALY_MULTIPLIER / 10); + return Math.min( + 1, + recentFrequency / this.FREQUENCY_ANOMALY_MULTIPLIER / 10, + ); } private computeCounterpartyConcentration(tradeDto: AnalyzeTradeDto): number { @@ -189,7 +213,10 @@ export class FraudMlService { return 0.05; } - private computeMarketImpact(tradeDto: AnalyzeTradeDto, baseline: TraderBaseline): number { + private computeMarketImpact( + tradeDto: AnalyzeTradeDto, + baseline: TraderBaseline, + ): number { // Estimate if this trade could move the market const relativeSize = tradeDto.quantity / Math.max(baseline.avgVolume, 1); return Math.min(1, relativeSize / 10); @@ -203,9 +230,9 @@ export class FraudMlService { */ private computeAnomalyScore(features: MlFeatures): number { const weights: Record = { - roundTripScore: 0.20, // Wash trading — highest weight + roundTripScore: 0.2, // Wash trading — highest weight volumeAnomaly: 0.18, - cancellationRate: 0.15, // Spoofing / layering + cancellationRate: 0.15, // Spoofing / layering frequencyAnomaly: 0.13, orderToTradeRatio: 0.12, priceImpactScore: 0.08, @@ -229,7 +256,7 @@ export class FraudMlService { private scoreToSeverity(score: number): FraudSeverity { if (score >= 0.85) return FraudSeverity.CRITICAL; if (score >= 0.65) return FraudSeverity.HIGH; - if (score >= 0.40) return FraudSeverity.MEDIUM; + if (score >= 0.4) return FraudSeverity.MEDIUM; return FraudSeverity.LOW; } @@ -253,7 +280,8 @@ export class FraudMlService { if (features.roundTripScore > 0.5) { items.push({ type: 'round_trip_detection', - description: 'Potential round-trip / wash trade detected with same counterparty', + description: + 'Potential round-trip / wash trade detected with same counterparty', value: features.roundTripScore, timestamp: now, }); @@ -263,7 +291,10 @@ export class FraudMlService { items.push({ type: 'volume_anomaly', description: `Trade volume ${tradeDto.quantity} is ${(tradeDto.quantity / Math.max(baseline.avgVolume, 1)).toFixed(1)}x above trader baseline`, - value: { tradeVolume: tradeDto.quantity, baselineAvg: baseline.avgVolume }, + value: { + tradeVolume: tradeDto.quantity, + baselineAvg: baseline.avgVolume, + }, timestamp: now, }); } @@ -271,7 +302,8 @@ export class FraudMlService { if (features.cancellationRate > 0.5) { items.push({ type: 'high_cancellation_rate', - description: 'Trader exhibits high order cancellation rate consistent with spoofing', + description: + 'Trader exhibits high order cancellation rate consistent with spoofing', value: features.cancellationRate, timestamp: now, }); @@ -302,7 +334,7 @@ export class FraudMlService { private async getOrCreateBaseline(traderId: string): Promise { if (this.traderBaselines.has(traderId)) { - return this.traderBaselines.get(traderId)!; + return this.traderBaselines.get(traderId); } // Attempt to seed from historical data @@ -333,9 +365,14 @@ export class FraudMlService { features: MlFeatures, ): void { const alpha = 0.1; // EMA decay factor - baseline.avgVolume = (1 - alpha) * baseline.avgVolume + alpha * tradeDto.quantity; - baseline.avgFrequency = (1 - alpha) * baseline.avgFrequency + alpha * (baseline.avgFrequency + 0.1); - baseline.avgPriceDeviation = (1 - alpha) * baseline.avgPriceDeviation + alpha * features.priceImpactScore; + baseline.avgVolume = + (1 - alpha) * baseline.avgVolume + alpha * tradeDto.quantity; + baseline.avgFrequency = + (1 - alpha) * baseline.avgFrequency + + alpha * (baseline.avgFrequency + 0.1); + baseline.avgPriceDeviation = + (1 - alpha) * baseline.avgPriceDeviation + + alpha * features.priceImpactScore; baseline.tradeCount += 1; baseline.lastUpdated = new Date(); } diff --git a/src/fraud/monitoring/real-time-monitor.service.spec.ts b/src/fraud/monitoring/real-time-monitor.service.spec.ts index 2d08e1f..54cc5d4 100644 --- a/src/fraud/monitoring/real-time-monitor.service.spec.ts +++ b/src/fraud/monitoring/real-time-monitor.service.spec.ts @@ -5,7 +5,11 @@ import { PatternRecognitionService } from '../patterns/pattern-recognition.servi import { SuspiciousActivityService } from '../reporting/suspicious-activity.service'; import { FraudPreventionService } from '../prevention/fraud-prevention.service'; import { getRepositoryToken } from '@nestjs/typeorm'; -import { FraudCaseEntity, FraudCaseStatus, FraudSeverity } from '../entities/fraud-case.entity'; +import { + FraudCaseEntity, + FraudCaseStatus, + FraudSeverity, +} from '../entities/fraud-case.entity'; import { AnalyzeTradeDto } from '../dto/fraud-alert.dto'; describe('RealTimeMonitorService', () => { @@ -16,7 +20,9 @@ describe('RealTimeMonitorService', () => { findOne: jest.fn().mockResolvedValue(null), findAndCount: jest.fn().mockResolvedValue([[], 0]), create: jest.fn().mockImplementation((d) => d), - save: jest.fn().mockImplementation((d) => Promise.resolve({ ...d, id: 'case-id-1' })), + save: jest + .fn() + .mockImplementation((d) => Promise.resolve({ ...d, id: 'case-id-1' })), update: jest.fn().mockResolvedValue({ affected: 1 }), count: jest.fn().mockResolvedValue(0), }; @@ -53,7 +59,12 @@ describe('RealTimeMonitorService', () => { }; const mockPreventionService = { - preTradeCheck: jest.fn().mockResolvedValue({ allowed: true, riskScore: 0, reasons: [], recommendedAction: 'allow' }), + preTradeCheck: jest.fn().mockResolvedValue({ + allowed: true, + riskScore: 0, + reasons: [], + recommendedAction: 'allow', + }), blockTrader: jest.fn(), unblockTrader: jest.fn().mockReturnValue(true), isTraderBlocked: jest.fn().mockReturnValue(false), @@ -81,7 +92,10 @@ describe('RealTimeMonitorService', () => { const module: TestingModule = await Test.createTestingModule({ providers: [ RealTimeMonitorService, - { provide: getRepositoryToken(FraudCaseEntity), useValue: mockRepository }, + { + provide: getRepositoryToken(FraudCaseEntity), + useValue: mockRepository, + }, { provide: FraudMlService, useValue: mockMlService }, { provide: PatternRecognitionService, useValue: mockPatternService }, { provide: SuspiciousActivityService, useValue: mockReportingService }, @@ -150,12 +164,26 @@ describe('RealTimeMonitorService', () => { severity: FraudSeverity.CRITICAL, features: {}, topContributors: ['roundTripScore'], - evidence: [{ type: 'self_trade', description: 'Test', value: 1, timestamp: new Date() }], + evidence: [ + { + type: 'self_trade', + description: 'Test', + value: 1, + timestamp: new Date(), + }, + ], processingTimeMs: 5, }); mockPatternService.analyzePatterns.mockReturnValueOnce([ - { patternId: 'WT-001', patternName: 'Self-Trade', category: 'wash_trading', matched: true, confidence: 0.99, evidence: '' }, + { + patternId: 'WT-001', + patternName: 'Self-Trade', + category: 'wash_trading', + matched: true, + confidence: 0.99, + evidence: '', + }, ]); mockPatternService.inferFraudTypes.mockReturnValueOnce(['wash_trading']); @@ -193,7 +221,9 @@ describe('RealTimeMonitorService', () => { service.startTraderMonitoring('trader-dup'); service.startTraderMonitoring('trader-dup'); const status = service.getMonitoringStatus() as any; - const count = status.monitoredTraders.filter((t: string) => t === 'trader-dup').length; + const count = status.monitoredTraders.filter( + (t: string) => t === 'trader-dup', + ).length; expect(count).toBe(1); }); }); diff --git a/src/fraud/monitoring/real-time-monitor.service.ts b/src/fraud/monitoring/real-time-monitor.service.ts index a35877d..991fc59 100644 --- a/src/fraud/monitoring/real-time-monitor.service.ts +++ b/src/fraud/monitoring/real-time-monitor.service.ts @@ -2,7 +2,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Cron } from '@nestjs/schedule'; -import { FraudCaseEntity, FraudCaseStatus, FraudSeverity } from '../entities/fraud-case.entity'; +import { + FraudCaseEntity, + FraudCaseStatus, + FraudSeverity, +} from '../entities/fraud-case.entity'; import { FraudMlService } from '../ml/fraud-ml.service'; import { PatternRecognitionService } from '../patterns/pattern-recognition.service'; import { SuspiciousActivityService } from '../reporting/suspicious-activity.service'; @@ -54,7 +58,9 @@ export class RealTimeMonitorService { * Primary entry point: analyse a trade through the full pipeline. * Target: <100ms processing time. */ - async analyzeIncomingTrade(tradeDto: AnalyzeTradeDto): Promise { + async analyzeIncomingTrade( + tradeDto: AnalyzeTradeDto, + ): Promise { const startTime = Date.now(); this.logger.debug(`Analyzing incoming trade: ${tradeDto.tradeId}`); @@ -70,7 +76,9 @@ export class RealTimeMonitorService { // 2. Pattern matching const patterns = this.patternService.analyzePatterns(tradeDto, { - recentTrades: context.recentTrades.filter((t) => t.tradeId !== tradeDto.tradeId), + recentTrades: context.recentTrades.filter( + (t) => t.tradeId !== tradeDto.tradeId, + ), }); const matchedPatterns = patterns.filter((p) => p.matched); @@ -187,9 +195,12 @@ export class RealTimeMonitorService { /** Scheduled every 15s — fulfils the <30s flagging requirement */ @Cron('*/15 * * * * *') async processMonitoringCycle(): Promise { - if (this.pendingTrades.length === 0 && this.monitoredTraders.size === 0) return; + if (this.pendingTrades.length === 0 && this.monitoredTraders.size === 0) + return; - this.logger.debug(`Monitoring cycle: ${this.pendingTrades.length} queued trades`); + this.logger.debug( + `Monitoring cycle: ${this.pendingTrades.length} queued trades`, + ); // Drain the batch queue — these are trades submitted for async monitoring const batch = this.pendingTrades.splice(0, 100); @@ -233,13 +244,18 @@ export class RealTimeMonitorService { await this.fraudCaseRepository.update(c.id, { status: FraudCaseStatus.ESCALATED, }); - this.logger.warn(`CRITICAL case escalated: ${c.caseId} — trader ${c.traderId}`); + this.logger.warn( + `CRITICAL case escalated: ${c.caseId} — trader ${c.traderId}`, + ); } } // ─── Private Helpers ───────────────────────────────────────────────────── - private async sweepTrader(traderId: string, session: MonitoredTrader): Promise { + private async sweepTrader( + traderId: string, + session: MonitoredTrader, + ): Promise { const timeSinceCheck = Date.now() - session.lastChecked.getTime(); if (timeSinceCheck < this.MONITORING_INTERVAL_MS) return; @@ -266,7 +282,7 @@ export class RealTimeMonitorService { this.startTraderMonitoring(tradeDto.traderId); } - const session = this.monitoredTraders.get(tradeDto.traderId)!; + const session = this.monitoredTraders.get(tradeDto.traderId); session.recentTrades.push(tradeDto); // Sliding window — trim oldest @@ -282,20 +298,26 @@ export class RealTimeMonitorService { } private getTraderContext(traderId: string): MonitoredTrader { - return this.monitoredTraders.get(traderId) ?? { - traderId, - startedAt: new Date(), - recentTrades: [], - alertCount: 0, - lastChecked: new Date(), - }; + return ( + this.monitoredTraders.get(traderId) ?? { + traderId, + startedAt: new Date(), + recentTrades: [], + alertCount: 0, + lastChecked: new Date(), + } + ); } - private combineScores(mlScore: number, matchedPatterns: { confidence: number }[]): number { + private combineScores( + mlScore: number, + matchedPatterns: { confidence: number }[], + ): number { if (matchedPatterns.length === 0) return mlScore; const avgPatternScore = - matchedPatterns.reduce((s, p) => s + p.confidence, 0) / matchedPatterns.length; + matchedPatterns.reduce((s, p) => s + p.confidence, 0) / + matchedPatterns.length; // Weighted ensemble: 60% ML, 40% patterns const combined = mlScore * 0.6 + avgPatternScore * 0.4; @@ -309,12 +331,12 @@ export class RealTimeMonitorService { private scoreToSeverity(score: number): FraudSeverity { if (score >= 0.85) return FraudSeverity.CRITICAL; if (score >= 0.65) return FraudSeverity.HIGH; - if (score >= 0.40) return FraudSeverity.MEDIUM; + if (score >= 0.4) return FraudSeverity.MEDIUM; return FraudSeverity.LOW; } private getRecommendedAction(severity: FraudSeverity, score: number): string { - if (severity === FraudSeverity.CRITICAL || score >= 0.90) { + if (severity === FraudSeverity.CRITICAL || score >= 0.9) { return 'BLOCK_TRADE: Immediate block and escalate to compliance'; } if (severity === FraudSeverity.HIGH) { @@ -365,13 +387,17 @@ export class RealTimeMonitorService { tradeValue: tradeDto.tradeValue, regulatoryReported: false, preventionApplied: severity === FraudSeverity.CRITICAL, - preventionAction: severity === FraudSeverity.CRITICAL ? 'auto_block' : null, + preventionAction: + severity === FraudSeverity.CRITICAL ? 'auto_block' : null, }); const saved = await this.fraudCaseRepository.save(fraudCase); // Auto-generate SAR for HIGH/CRITICAL - if (severity === FraudSeverity.HIGH || severity === FraudSeverity.CRITICAL) { + if ( + severity === FraudSeverity.HIGH || + severity === FraudSeverity.CRITICAL + ) { await this.reportingService.generateSAR(saved); } diff --git a/src/fraud/patterns/pattern-recognition.service.spec.ts b/src/fraud/patterns/pattern-recognition.service.spec.ts index cb1ce79..9488560 100644 --- a/src/fraud/patterns/pattern-recognition.service.spec.ts +++ b/src/fraud/patterns/pattern-recognition.service.spec.ts @@ -65,7 +65,9 @@ describe('PatternRecognitionService', () => { it('should sort results by confidence descending', () => { const results = service.analyzePatterns(baseTrade); for (let i = 0; i < results.length - 1; i++) { - expect(results[i].confidence).toBeGreaterThanOrEqual(results[i + 1].confidence); + expect(results[i].confidence).toBeGreaterThanOrEqual( + results[i + 1].confidence, + ); } }); @@ -181,7 +183,14 @@ describe('PatternRecognitionService', () => { describe('inferFraudTypes', () => { it('should infer WASH_TRADING from wash trading patterns', () => { const washPatterns = [ - { patternId: 'WT-001', patternName: 'Self-Trade', category: 'wash_trading', matched: true, confidence: 0.99, evidence: '' }, + { + patternId: 'WT-001', + patternName: 'Self-Trade', + category: 'wash_trading', + matched: true, + confidence: 0.99, + evidence: '', + }, ]; const types = service.inferFraudTypes(washPatterns); @@ -190,7 +199,14 @@ describe('PatternRecognitionService', () => { it('should infer SPOOFING from spoofing patterns', () => { const spooferPatterns = [ - { patternId: 'SP-001', patternName: 'Classic Spoofing', category: 'spoofing', matched: true, confidence: 0.72, evidence: '' }, + { + patternId: 'SP-001', + patternName: 'Classic Spoofing', + category: 'spoofing', + matched: true, + confidence: 0.72, + evidence: '', + }, ]; const types = service.inferFraudTypes(spooferPatterns); @@ -204,12 +220,28 @@ describe('PatternRecognitionService', () => { it('should deduplicate fraud types', () => { const patterns = [ - { patternId: 'WT-001', patternName: 'Self-Trade', category: 'wash_trading', matched: true, confidence: 0.99, evidence: '' }, - { patternId: 'WT-002', patternName: 'Mirror Order', category: 'wash_trading', matched: true, confidence: 0.85, evidence: '' }, + { + patternId: 'WT-001', + patternName: 'Self-Trade', + category: 'wash_trading', + matched: true, + confidence: 0.99, + evidence: '', + }, + { + patternId: 'WT-002', + patternName: 'Mirror Order', + category: 'wash_trading', + matched: true, + confidence: 0.85, + evidence: '', + }, ]; const types = service.inferFraudTypes(patterns); - const uniqueWashTrading = types.filter((t) => t === FraudType.WASH_TRADING); + const uniqueWashTrading = types.filter( + (t) => t === FraudType.WASH_TRADING, + ); expect(uniqueWashTrading).toHaveLength(1); }); }); diff --git a/src/fraud/patterns/pattern-recognition.service.ts b/src/fraud/patterns/pattern-recognition.service.ts index 1a352d2..e0550d1 100644 --- a/src/fraud/patterns/pattern-recognition.service.ts +++ b/src/fraud/patterns/pattern-recognition.service.ts @@ -10,7 +10,10 @@ interface PatternDefinition { name: string; category: string; description: string; - detector: (trade: AnalyzeTradeDto, context: PatternContext) => PatternMatchResult; + detector: ( + trade: AnalyzeTradeDto, + context: PatternContext, + ) => PatternMatchResult; } interface PatternContext { @@ -25,7 +28,9 @@ export class PatternRecognitionService { constructor() { this.patterns = this.registerPatterns(); - this.logger.log(`Pattern recognition engine initialized with ${this.patterns.length} patterns`); + this.logger.log( + `Pattern recognition engine initialized with ${this.patterns.length} patterns`, + ); } /** @@ -140,7 +145,8 @@ export class PatternRecognitionService { id: 'WT-004', name: 'Prearranged Trade', category: 'wash_trading', - description: 'Trades executed at non-competitive prices, suggesting pre-arrangement', + description: + 'Trades executed at non-competitive prices, suggesting pre-arrangement', detector: (t) => { // Flag extreme price outliers (>20% from expected) const priceAnomaly = t.price > 10000 || t.price < 0.01; @@ -158,18 +164,22 @@ export class PatternRecognitionService { id: 'WT-005', name: 'Accommodation Trade', category: 'wash_trading', - description: 'Round-lot trades at regular intervals between same parties', + description: + 'Round-lot trades at regular intervals between same parties', detector: (t, ctx) => { - const sameCounterpartyTrades = ctx.recentTrades?.filter( - (rt) => rt.counterpartyId === t.counterpartyId, - ).length ?? 0; + const sameCounterpartyTrades = + ctx.recentTrades?.filter( + (rt) => rt.counterpartyId === t.counterpartyId, + ).length ?? 0; const matched = sameCounterpartyTrades >= 3; return { patternId: 'WT-005', patternName: 'Accommodation Trade', category: 'wash_trading', matched, - confidence: matched ? Math.min(0.9, sameCounterpartyTrades * 0.2) : 0, + confidence: matched + ? Math.min(0.9, sameCounterpartyTrades * 0.2) + : 0, evidence: `${sameCounterpartyTrades} trades with same counterparty in window`, }; }, @@ -180,7 +190,8 @@ export class PatternRecognitionService { id: 'SP-001', name: 'Classic Spoofing', category: 'spoofing', - description: 'Large order placed then quickly cancelled to mislead market', + description: + 'Large order placed then quickly cancelled to mislead market', detector: (t) => { const isLargeOrder = t.quantity > 10000; const isIoc = t.timeInForce === 'IOC'; @@ -199,7 +210,8 @@ export class PatternRecognitionService { id: 'SP-002', name: 'Iceberg Spoofing', category: 'spoofing', - description: 'Hidden large orders used to manipulate visible order book', + description: + 'Hidden large orders used to manipulate visible order book', detector: (t) => { const ratio = t.tradeValue / Math.max(t.quantity * t.price, 1); const anomalousRatio = ratio > 1.5 || ratio < 0.5; @@ -219,9 +231,10 @@ export class PatternRecognitionService { category: 'spoofing', description: 'Multiple cancel-replace cycles on the same order', detector: (t, ctx) => { - const cancelCount = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId && rt.timeInForce === 'IOC', - ).length ?? 0; + const cancelCount = + ctx.recentTrades?.filter( + (rt) => rt.traderId === t.traderId && rt.timeInForce === 'IOC', + ).length ?? 0; const matched = cancelCount >= 5; return { patternId: 'SP-003', @@ -237,11 +250,12 @@ export class PatternRecognitionService { id: 'SP-004', name: 'Quote Stuffing', category: 'spoofing', - description: 'Rapid order placement and cancellation to slow competing systems', + description: + 'Rapid order placement and cancellation to slow competing systems', detector: (t, ctx) => { - const tradeRate = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId, - ).length ?? 0; + const tradeRate = + ctx.recentTrades?.filter((rt) => rt.traderId === t.traderId) + .length ?? 0; const matched = tradeRate > 50; return { patternId: 'SP-004', @@ -259,7 +273,8 @@ export class PatternRecognitionService { category: 'spoofing', description: 'Creating false momentum with large directional orders', detector: (t) => { - const isBigDirectional = t.quantity > 5000 && t.orderType === 'market'; + const isBigDirectional = + t.quantity > 5000 && t.orderType === 'market'; return { patternId: 'SP-005', patternName: 'Momentum Spoofing', @@ -276,18 +291,25 @@ export class PatternRecognitionService { id: 'LY-001', name: 'Multi-Level Order Stacking', category: 'layering', - description: 'Multiple limit orders stacked at different prices to create false depth', + description: + 'Multiple limit orders stacked at different prices to create false depth', detector: (t, ctx) => { - const sameDirectionOrders = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId && rt.side === t.side && rt.orderType === 'limit', - ).length ?? 0; + const sameDirectionOrders = + ctx.recentTrades?.filter( + (rt) => + rt.traderId === t.traderId && + rt.side === t.side && + rt.orderType === 'limit', + ).length ?? 0; const matched = sameDirectionOrders >= 4; return { patternId: 'LY-001', patternName: 'Multi-Level Order Stacking', category: 'layering', matched, - confidence: matched ? Math.min(0.82, sameDirectionOrders * 0.15) : 0, + confidence: matched + ? Math.min(0.82, sameDirectionOrders * 0.15) + : 0, evidence: `${sameDirectionOrders} stacked limit orders in same direction`, }; }, @@ -296,11 +318,13 @@ export class PatternRecognitionService { id: 'LY-002', name: 'Momentum Ignition', category: 'layering', - description: 'Triggering momentum in one direction then reversing position', + description: + 'Triggering momentum in one direction then reversing position', detector: (t, ctx) => { - const oppositeRecentTrades = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId && rt.side !== t.side, - ).length ?? 0; + const oppositeRecentTrades = + ctx.recentTrades?.filter( + (rt) => rt.traderId === t.traderId && rt.side !== t.side, + ).length ?? 0; const matched = oppositeRecentTrades >= 2 && t.tradeValue > 100_000; return { patternId: 'LY-002', @@ -316,9 +340,11 @@ export class PatternRecognitionService { id: 'LY-003', name: 'Order Book Painting', category: 'layering', - description: 'Creating artificial order book depth to attract other traders', + description: + 'Creating artificial order book depth to attract other traders', detector: (t) => { - const isLimitWithHighRatio = t.orderType === 'limit' && t.quantity > 8000; + const isLimitWithHighRatio = + t.orderType === 'limit' && t.quantity > 8000; return { patternId: 'LY-003', patternName: 'Order Book Painting', @@ -335,11 +361,12 @@ export class PatternRecognitionService { id: 'MM-001', name: 'Painting the Tape', category: 'market_manipulation', - description: 'Series of transactions creating artificial market activity', + description: + 'Series of transactions creating artificial market activity', detector: (t, ctx) => { - const traderActivity = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId, - ).length ?? 0; + const traderActivity = + ctx.recentTrades?.filter((rt) => rt.traderId === t.traderId) + .length ?? 0; const matched = traderActivity > 20 && t.tradeValue < 1000; return { patternId: 'MM-001', @@ -360,7 +387,8 @@ export class PatternRecognitionService { const isCloseTime = t.tradeTimestamp ? new Date(t.tradeTimestamp).getUTCHours() >= 15 : false; - const isLargeMarket = t.orderType === 'market' && t.tradeValue > 500_000; + const isLargeMarket = + t.orderType === 'market' && t.tradeValue > 500_000; const matched = isCloseTime && isLargeMarket; return { patternId: 'MM-002', @@ -378,9 +406,10 @@ export class PatternRecognitionService { category: 'market_manipulation', description: 'Artificially inflating asset price then selling', detector: (t, ctx) => { - const buyOrders = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId && rt.side === 'buy', - ).length ?? 0; + const buyOrders = + ctx.recentTrades?.filter( + (rt) => rt.traderId === t.traderId && rt.side === 'buy', + ).length ?? 0; const isSelling = t.side === 'sell' && t.tradeValue > 200_000; const matched = buyOrders >= 5 && isSelling; return { @@ -399,9 +428,10 @@ export class PatternRecognitionService { category: 'market_manipulation', description: 'Coordinated selling to drive down prices then covering', detector: (t, ctx) => { - const sellOrders = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId && rt.side === 'sell', - ).length ?? 0; + const sellOrders = + ctx.recentTrades?.filter( + (rt) => rt.traderId === t.traderId && rt.side === 'sell', + ).length ?? 0; const isBuying = t.side === 'buy' && sellOrders >= 5; return { patternId: 'MM-004', @@ -417,7 +447,8 @@ export class PatternRecognitionService { id: 'MM-005', name: 'Banging the Open', category: 'market_manipulation', - description: 'Aggressive trading at market open to set the day\'s direction', + description: + "Aggressive trading at market open to set the day's direction", detector: (t) => { const isOpenTime = t.tradeTimestamp ? new Date(t.tradeTimestamp).getUTCHours() <= 9 @@ -442,9 +473,10 @@ export class PatternRecognitionService { category: 'front_running', description: 'Trading ahead of a known large order', detector: (t, ctx) => { - const followedByLarge = ctx.recentTrades?.some( - (rt) => rt.side === t.side && rt.tradeValue > t.tradeValue * 5, - ) ?? false; + const followedByLarge = + ctx.recentTrades?.some( + (rt) => rt.side === t.side && rt.tradeValue > t.tradeValue * 5, + ) ?? false; return { patternId: 'FR-001', patternName: 'Classic Front Running', @@ -459,7 +491,8 @@ export class PatternRecognitionService { id: 'FR-002', name: 'Latency Arbitrage', category: 'front_running', - description: 'Exploiting speed advantage to trade ahead of slower participants', + description: + 'Exploiting speed advantage to trade ahead of slower participants', detector: (t) => { const isIOC = t.timeInForce === 'IOC'; const isMarket = t.orderType === 'market'; @@ -470,7 +503,8 @@ export class PatternRecognitionService { category: 'front_running', matched, confidence: matched ? 0.5 : 0, - evidence: 'IOC market order with large quantity suggests latency exploitation', + evidence: + 'IOC market order with large quantity suggests latency exploitation', }; }, }, @@ -480,7 +514,8 @@ export class PatternRecognitionService { id: 'CM-001', name: 'Cross-Market Spoofing', category: 'cross_market', - description: 'Spoofing in one market to benefit position in correlated market', + description: + 'Spoofing in one market to benefit position in correlated market', detector: (t) => { const isLarge = t.tradeValue > 2_000_000; const isMixed = t.market && t.market.includes('-'); @@ -501,7 +536,9 @@ export class PatternRecognitionService { category: 'cross_market', description: 'Multiple accounts acting in concert to manipulate prices', detector: (t, ctx) => { - const uniqueTraders = new Set(ctx.recentTrades?.map((rt) => rt.traderId)).size; + const uniqueTraders = new Set( + ctx.recentTrades?.map((rt) => rt.traderId), + ).size; const matched = uniqueTraders >= 3 && t.tradeValue > 500_000; return { patternId: 'CM-002', @@ -517,7 +554,8 @@ export class PatternRecognitionService { id: 'CM-003', name: 'Arbitrage Abuse', category: 'cross_market', - description: 'Exploiting artificial price differences created through manipulation', + description: + 'Exploiting artificial price differences created through manipulation', detector: (t) => { const suspiciouslyProfitable = t.price < 0.5 || t.price > 5000; return { @@ -536,11 +574,12 @@ export class PatternRecognitionService { id: 'VA-001', name: 'Order Burst', category: 'velocity', - description: 'Sudden burst of orders far exceeding trader\'s normal pattern', + description: + "Sudden burst of orders far exceeding trader's normal pattern", detector: (t, ctx) => { - const recentCount = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId, - ).length ?? 0; + const recentCount = + ctx.recentTrades?.filter((rt) => rt.traderId === t.traderId) + .length ?? 0; const matched = recentCount > 30; return { patternId: 'VA-001', @@ -556,11 +595,13 @@ export class PatternRecognitionService { id: 'VA-002', name: 'Cancel-Replace Storm', category: 'velocity', - description: 'Rapid sequence of order modifications overwhelming the matching engine', + description: + 'Rapid sequence of order modifications overwhelming the matching engine', detector: (t, ctx) => { - const iocCount = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId && rt.timeInForce === 'IOC', - ).length ?? 0; + const iocCount = + ctx.recentTrades?.filter( + (rt) => rt.traderId === t.traderId && rt.timeInForce === 'IOC', + ).length ?? 0; const matched = iocCount > 15; return { patternId: 'VA-002', @@ -578,12 +619,13 @@ export class PatternRecognitionService { category: 'velocity', description: 'Rapid sell-off causing flash crash conditions', detector: (t, ctx) => { - const largeSellCount = ctx.recentTrades?.filter( - (rt) => - rt.traderId === t.traderId && - rt.side === 'sell' && - rt.tradeValue > 100_000, - ).length ?? 0; + const largeSellCount = + ctx.recentTrades?.filter( + (rt) => + rt.traderId === t.traderId && + rt.side === 'sell' && + rt.tradeValue > 100_000, + ).length ?? 0; const matched = largeSellCount >= 3 && t.side === 'sell'; return { patternId: 'VA-003', @@ -601,7 +643,8 @@ export class PatternRecognitionService { id: 'IT-001', name: 'Pre-Announcement Trading', category: 'insider_trading', - description: 'Unusual trading activity immediately before major announcements', + description: + 'Unusual trading activity immediately before major announcements', detector: (t) => { // Flag unusually large directional trades const isLargeDirectional = @@ -620,19 +663,23 @@ export class PatternRecognitionService { id: 'IT-002', name: 'Information Advantage Exploitation', category: 'insider_trading', - description: 'Consistent profitability pattern suggesting non-public information', + description: + 'Consistent profitability pattern suggesting non-public information', detector: (t, ctx) => { - const consistentDirection = ctx.recentTrades?.every( - (rt) => rt.traderId === t.traderId && rt.side === t.side, - ) ?? false; - const matched = consistentDirection && (ctx.recentTrades?.length ?? 0) >= 5; + const consistentDirection = + ctx.recentTrades?.every( + (rt) => rt.traderId === t.traderId && rt.side === t.side, + ) ?? false; + const matched = + consistentDirection && (ctx.recentTrades?.length ?? 0) >= 5; return { patternId: 'IT-002', patternName: 'Information Advantage Exploitation', category: 'insider_trading', matched, confidence: matched ? 0.5 : 0, - evidence: 'Consistent same-direction trading across all recent trades', + evidence: + 'Consistent same-direction trading across all recent trades', }; }, }, @@ -642,9 +689,12 @@ export class PatternRecognitionService { id: 'EN-001', name: 'Capacity Hoarding', category: 'energy_specific', - description: 'Acquiring transmission capacity with no intention to use it', + description: + 'Acquiring transmission capacity with no intention to use it', detector: (t) => { - const isCapacity = t.assetType?.includes('capacity') || t.assetType?.includes('transmission'); + const isCapacity = + t.assetType?.includes('capacity') || + t.assetType?.includes('transmission'); const isLarge = t.quantity > 50000; const matched = !!isCapacity && isLarge; return { @@ -683,7 +733,8 @@ export class PatternRecognitionService { description: 'Double counting or fabrication of carbon credits', detector: (t) => { const isCarbonCredit = t.assetType?.toLowerCase().includes('carbon'); - const isSuspiciousVolume = t.quantity % 1000 === 0 && t.quantity > 10_000; + const isSuspiciousVolume = + t.quantity % 1000 === 0 && t.quantity > 10_000; const matched = !!isCarbonCredit && isSuspiciousVolume; return { patternId: 'EN-003', @@ -701,7 +752,8 @@ export class PatternRecognitionService { category: 'energy_specific', description: 'Deliberately creating transmission congestion for profit', detector: (t) => { - const isCrossRegion = t.market?.includes('/') || t.market?.includes('-'); + const isCrossRegion = + t.market?.includes('/') || t.market?.includes('-'); const isLarge = t.tradeValue > 1_000_000; const matched = !!isCrossRegion && isLarge; return { @@ -718,19 +770,23 @@ export class PatternRecognitionService { id: 'EN-005', name: 'Withholding Capacity', category: 'energy_specific', - description: 'Artificially withholding energy supply to drive up prices', + description: + 'Artificially withholding energy supply to drive up prices', detector: (t, ctx) => { - const priorSells = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId && rt.side === 'sell', - ).length ?? 0; - const isWithholding = priorSells === 0 && t.side === 'buy' && t.tradeValue > 500_000; + const priorSells = + ctx.recentTrades?.filter( + (rt) => rt.traderId === t.traderId && rt.side === 'sell', + ).length ?? 0; + const isWithholding = + priorSells === 0 && t.side === 'buy' && t.tradeValue > 500_000; return { patternId: 'EN-005', patternName: 'Withholding Capacity', category: 'energy_specific', matched: isWithholding, confidence: isWithholding ? 0.45 : 0, - evidence: 'Large buy with no recent sell activity suggests capacity withholding', + evidence: + 'Large buy with no recent sell activity suggests capacity withholding', }; }, }, @@ -740,10 +796,13 @@ export class PatternRecognitionService { id: 'RF-001', name: 'Threshold Avoidance', category: 'regulatory', - description: 'Structuring trades just below reporting thresholds (structuring)', + description: + 'Structuring trades just below reporting thresholds (structuring)', detector: (t) => { const REPORTING_THRESHOLD = 10_000; - const isJustBelow = t.tradeValue > REPORTING_THRESHOLD * 0.85 && t.tradeValue < REPORTING_THRESHOLD; + const isJustBelow = + t.tradeValue > REPORTING_THRESHOLD * 0.85 && + t.tradeValue < REPORTING_THRESHOLD; return { patternId: 'RF-001', patternName: 'Threshold Avoidance', @@ -758,11 +817,13 @@ export class PatternRecognitionService { id: 'RF-002', name: 'Smurfing', category: 'regulatory', - description: 'Breaking large transactions into small ones to avoid reporting', + description: + 'Breaking large transactions into small ones to avoid reporting', detector: (t, ctx) => { - const smallTrades = ctx.recentTrades?.filter( - (rt) => rt.traderId === t.traderId && rt.tradeValue < 5000, - ).length ?? 0; + const smallTrades = + ctx.recentTrades?.filter( + (rt) => rt.traderId === t.traderId && rt.tradeValue < 5000, + ).length ?? 0; const matched = smallTrades >= 10; return { patternId: 'RF-002', @@ -799,7 +860,8 @@ export class PatternRecognitionService { id: 'AL-001', name: 'Pinging', category: 'algorithmic', - description: 'Small orders to detect hidden large orders (order detection)', + description: + 'Small orders to detect hidden large orders (order detection)', detector: (t) => { const isTinyIoc = t.quantity < 10 && t.timeInForce === 'IOC'; return { @@ -816,10 +878,14 @@ export class PatternRecognitionService { id: 'AL-002', name: 'Algorithmic Collusion', category: 'algorithmic', - description: 'Multiple algorithmic traders coordinating to manipulate prices', + description: + 'Multiple algorithmic traders coordinating to manipulate prices', detector: (t, ctx) => { - const uniqueAlgos = new Set(ctx.recentTrades?.map((rt) => rt.traderId)).size; - const allSmall = ctx.recentTrades?.every((rt) => rt.quantity < 100) ?? false; + const uniqueAlgos = new Set( + ctx.recentTrades?.map((rt) => rt.traderId), + ).size; + const allSmall = + ctx.recentTrades?.every((rt) => rt.quantity < 100) ?? false; const matched = uniqueAlgos >= 5 && allSmall; return { patternId: 'AL-002', @@ -837,16 +903,21 @@ export class PatternRecognitionService { category: 'algorithmic', description: 'Manual spoof triggering algorithmic responses for profit', detector: (t, ctx) => { - const hasReversal = ctx.recentTrades?.some( - (rt) => rt.traderId === t.traderId && rt.side !== t.side && rt.quantity > t.quantity * 2, - ) ?? false; + const hasReversal = + ctx.recentTrades?.some( + (rt) => + rt.traderId === t.traderId && + rt.side !== t.side && + rt.quantity > t.quantity * 2, + ) ?? false; return { patternId: 'AL-003', patternName: 'Spoofing-Triggered Algo', category: 'algorithmic', matched: hasReversal, confidence: hasReversal ? 0.6 : 0, - evidence: 'Large order reversal pattern consistent with spoofing-triggered algo', + evidence: + 'Large order reversal pattern consistent with spoofing-triggered algo', }; }, }, diff --git a/src/fraud/prevention/fraud-prevention.service.spec.ts b/src/fraud/prevention/fraud-prevention.service.spec.ts index a148e2d..088c440 100644 --- a/src/fraud/prevention/fraud-prevention.service.spec.ts +++ b/src/fraud/prevention/fraud-prevention.service.spec.ts @@ -61,7 +61,9 @@ describe('FraudPreventionService', () => { expect(result.allowed).toBe(false); expect(result.recommendedAction).toBe('block'); - expect(result.reasons.some((r) => r.includes('ML fraud score'))).toBe(true); + expect(result.reasons.some((r) => r.includes('ML fraud score'))).toBe( + true, + ); }); it('should recommend review for score between 0.65 and 0.85', async () => { @@ -80,7 +82,9 @@ describe('FraudPreventionService', () => { const result = await service.preTradeCheck(selfTradeCheck, 0.1); expect(result.allowed).toBe(false); - expect(result.reasons.some((r) => r.toLowerCase().includes('self'))).toBe(true); + expect(result.reasons.some((r) => r.toLowerCase().includes('self'))).toBe( + true, + ); }); it('should allow whitelisted trader regardless of score', async () => { @@ -92,7 +96,11 @@ describe('FraudPreventionService', () => { }); it('should block trader on blocklist', async () => { - service.blockTrader(baseCheck.traderId, 'Manual block', FraudSeverity.HIGH); + service.blockTrader( + baseCheck.traderId, + 'Manual block', + FraudSeverity.HIGH, + ); const result = await service.preTradeCheck(baseCheck, 0.1); expect(result.allowed).toBe(false); @@ -119,7 +127,10 @@ describe('FraudPreventionService', () => { it('should track total check count in stats', async () => { for (let i = 0; i < 5; i++) { - await service.preTradeCheck({ ...baseCheck, traderId: `trader-${i}` }, 0.1); + await service.preTradeCheck( + { ...baseCheck, traderId: `trader-${i}` }, + 0.1, + ); } const stats = service.getPreventionStats() as any; diff --git a/src/fraud/prevention/fraud-prevention.service.ts b/src/fraud/prevention/fraud-prevention.service.ts index 80dc7e0..e588909 100644 --- a/src/fraud/prevention/fraud-prevention.service.ts +++ b/src/fraud/prevention/fraud-prevention.service.ts @@ -1,11 +1,12 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { FraudCaseEntity, FraudCaseStatus, FraudSeverity } from '../entities/fraud-case.entity'; import { - PreTradeCheckDto, - PreTradeCheckResult, -} from '../dto/fraud-alert.dto'; + FraudCaseEntity, + FraudCaseStatus, + FraudSeverity, +} from '../entities/fraud-case.entity'; +import { PreTradeCheckDto, PreTradeCheckResult } from '../dto/fraud-alert.dto'; export interface BlockedTrader { traderId: string; @@ -72,17 +73,28 @@ export class FraudPreventionService { // 1. Whitelist bypass for trusted entities if (this.whitelist.has(traderId)) { this.stats.whitelistedPassed++; - return { allowed: true, riskScore: 0, reasons: ['Whitelisted trader'], recommendedAction: 'allow' }; + return { + allowed: true, + riskScore: 0, + reasons: ['Whitelisted trader'], + recommendedAction: 'allow', + }; } // 2. Check blocklist const blockEntry = this.blockedTraders.get(traderId); if (blockEntry) { - const isExpired = blockEntry.expiresAt && blockEntry.expiresAt < new Date(); + const isExpired = + blockEntry.expiresAt && blockEntry.expiresAt < new Date(); if (!isExpired) { reasons.push(`Trader blocked: ${blockEntry.reason}`); this.recordPrevention(traderId, tradeValue ?? 0); - return { allowed: false, riskScore: 1.0, reasons, recommendedAction: 'block' }; + return { + allowed: false, + riskScore: 1.0, + reasons, + recommendedAction: 'block', + }; } else { // Auto-unblock expired entries this.blockedTraders.delete(traderId); @@ -92,36 +104,69 @@ export class FraudPreventionService { // 3. Rate limit check const isRateLimited = this.checkRateLimit(traderId); if (isRateLimited) { - reasons.push(`Rate limit exceeded: >${this.RATE_LIMIT_PER_MINUTE} trades/min`); + reasons.push( + `Rate limit exceeded: >${this.RATE_LIMIT_PER_MINUTE} trades/min`, + ); this.recordPrevention(traderId, tradeValue ?? 0); - return { allowed: false, riskScore: 0.9, reasons, recommendedAction: 'block' }; + return { + allowed: false, + riskScore: 0.9, + reasons, + recommendedAction: 'block', + }; } // 4. ML score gate if (mlScore !== undefined) { if (mlScore >= this.BLOCK_THRESHOLD) { - reasons.push(`ML fraud score ${mlScore.toFixed(3)} exceeds block threshold ${this.BLOCK_THRESHOLD}`); + reasons.push( + `ML fraud score ${mlScore.toFixed(3)} exceeds block threshold ${this.BLOCK_THRESHOLD}`, + ); this.recordPrevention(traderId, tradeValue ?? 0); - return { allowed: false, riskScore: mlScore, reasons, recommendedAction: 'block' }; + return { + allowed: false, + riskScore: mlScore, + reasons, + recommendedAction: 'block', + }; } if (mlScore >= this.REVIEW_THRESHOLD) { - reasons.push(`ML fraud score ${mlScore.toFixed(3)} requires manual review`); - return { allowed: true, riskScore: mlScore, reasons, recommendedAction: 'review' }; + reasons.push( + `ML fraud score ${mlScore.toFixed(3)} requires manual review`, + ); + return { + allowed: true, + riskScore: mlScore, + reasons, + recommendedAction: 'review', + }; } } // 5. Large trade value threshold if (tradeValue > 50_000_000) { - reasons.push(`Trade value $${tradeValue.toLocaleString()} exceeds large-trade threshold`); - return { allowed: true, riskScore: 0.5, reasons, recommendedAction: 'review' }; + reasons.push( + `Trade value $${tradeValue.toLocaleString()} exceeds large-trade threshold`, + ); + return { + allowed: true, + riskScore: 0.5, + reasons, + recommendedAction: 'review', + }; } // 6. Self-trade prevention if (checkDto.counterpartyId && checkDto.counterpartyId === traderId) { reasons.push('Self-trade detected: buyer and seller are the same entity'); this.recordPrevention(traderId, tradeValue ?? 0); - return { allowed: false, riskScore: 1.0, reasons, recommendedAction: 'block' }; + return { + allowed: false, + riskScore: 1.0, + reasons, + recommendedAction: 'block', + }; } // 7. Check prior fraud case history @@ -131,7 +176,12 @@ export class FraudPreventionService { if (priorCases >= 3) { reasons.push(`Trader has ${priorCases} open fraud cases`); - return { allowed: false, riskScore: 0.8, reasons, recommendedAction: 'block' }; + return { + allowed: false, + riskScore: 0.8, + reasons, + recommendedAction: 'block', + }; } this.updateRateCount(traderId); @@ -211,7 +261,9 @@ export class FraudPreventionService { getPreventionStats(): object { const blockRate = this.stats.totalChecks > 0 - ? parseFloat((this.stats.blockedTrades / this.stats.totalChecks).toFixed(4)) + ? parseFloat( + (this.stats.blockedTrades / this.stats.totalChecks).toFixed(4), + ) : 0; return { diff --git a/src/fraud/reporting/suspicious-activity.service.spec.ts b/src/fraud/reporting/suspicious-activity.service.spec.ts index e5d195a..6530652 100644 --- a/src/fraud/reporting/suspicious-activity.service.spec.ts +++ b/src/fraud/reporting/suspicious-activity.service.spec.ts @@ -24,7 +24,14 @@ describe('SuspiciousActivityService', () => { mlScore: 0.82, patternMatched: 'Self-Trade Detection', patternsTriggered: ['WT-001', 'WT-002'], - evidence: [{ type: 'self_trade', description: 'Self-trade detected', value: 1, timestamp: new Date() }], + evidence: [ + { + type: 'self_trade', + description: 'Self-trade detected', + value: 1, + timestamp: new Date(), + }, + ], tradeData: { market: 'EU-ETS', quantity: 1000 }, mlFeatures: {}, regulatoryReported: false, @@ -50,7 +57,9 @@ describe('SuspiciousActivityService', () => { update: jest.fn().mockResolvedValue({ affected: 1 }), count: jest.fn().mockResolvedValue(5), create: jest.fn().mockImplementation((d) => d), - save: jest.fn().mockImplementation((d) => Promise.resolve({ ...d, id: 'new-id' })), + save: jest + .fn() + .mockImplementation((d) => Promise.resolve({ ...d, id: 'new-id' })), }; beforeEach(async () => { @@ -115,7 +124,10 @@ describe('SuspiciousActivityService', () => { }); it('should mandate CRITICAL reporting obligation for critical cases', async () => { - const criticalCase = { ...mockFraudCase, severity: FraudSeverity.CRITICAL }; + const criticalCase = { + ...mockFraudCase, + severity: FraudSeverity.CRITICAL, + }; const sar = await service.generateSAR(criticalCase); expect(sar.reportingObligation).toContain('MANDATORY'); }); @@ -158,7 +170,10 @@ describe('SuspiciousActivityService', () => { it('should apply minMlScore filter', async () => { mockRepository.findAndCount.mockResolvedValueOnce([ - [{ ...mockFraudCase, mlScore: 0.9 }, { ...mockFraudCase, mlScore: 0.3 }], + [ + { ...mockFraudCase, mlScore: 0.9 }, + { ...mockFraudCase, mlScore: 0.3 }, + ], 2, ]); @@ -230,12 +245,12 @@ describe('SuspiciousActivityService', () => { it('should return metrics with all required fields', async () => { mockRepository.count .mockResolvedValueOnce(100) // total - .mockResolvedValueOnce(30) // open - .mockResolvedValueOnce(60) // resolved - .mockResolvedValueOnce(5) // false positives + .mockResolvedValueOnce(30) // open + .mockResolvedValueOnce(60) // resolved + .mockResolvedValueOnce(5) // false positives .mockResolvedValueOnce(10); // critical - const metrics = await service.getMetrics() as any; + const metrics = (await service.getMetrics()) as any; expect(metrics.totalCases).toBeDefined(); expect(metrics.openCases).toBeDefined(); @@ -253,14 +268,17 @@ describe('SuspiciousActivityService', () => { .mockResolvedValueOnce(100) // total .mockResolvedValueOnce(30) .mockResolvedValueOnce(60) - .mockResolvedValueOnce(5) // false positives = 5/100 = 0.05 + .mockResolvedValueOnce(5) // false positives = 5/100 = 0.05 .mockResolvedValueOnce(10); mockRepository.find.mockResolvedValueOnce( - Array.from({ length: 100 }, () => ({ ...mockFraudCase, mlScore: 0.75 })), + Array.from({ length: 100 }, () => ({ + ...mockFraudCase, + mlScore: 0.75, + })), ); - const metrics = await service.getMetrics() as any; + const metrics = (await service.getMetrics()) as any; expect(metrics.falsePositiveRate).toBeLessThanOrEqual(0.05); // <5% requirement }); }); diff --git a/src/fraud/reporting/suspicious-activity.service.ts b/src/fraud/reporting/suspicious-activity.service.ts index 881e753..140554d 100644 --- a/src/fraud/reporting/suspicious-activity.service.ts +++ b/src/fraud/reporting/suspicious-activity.service.ts @@ -8,7 +8,10 @@ import { FraudSeverity, FraudType, } from '../entities/fraud-case.entity'; -import { FraudReportQueryDto, InvestigationUpdateDto } from '../dto/fraud-alert.dto'; +import { + FraudReportQueryDto, + InvestigationUpdateDto, +} from '../dto/fraud-alert.dto'; import { v4 as uuidv4 } from 'uuid'; export interface SarReport { @@ -62,27 +65,37 @@ export class SuspiciousActivityService { tradeData: fraudCase.tradeData ?? {}, mlScore: Number(fraudCase.mlScore), patternsMatched: fraudCase.patternsTriggered ?? [], - reportingObligation: this.determineReportingObligation(fraudCase.severity), - regulatoryBodies: this.getApplicableRegulators(fraudCase.market ?? '', fraudCase.fraudType), + reportingObligation: this.determineReportingObligation( + fraudCase.severity, + ), + regulatoryBodies: this.getApplicableRegulators( + fraudCase.market ?? '', + fraudCase.fraudType, + ), }; // Persist SAR reference back to the case await this.fraudCaseRepository.update(fraudCase.id, { sarReference, regulatoryReported: fraudCase.severity === FraudSeverity.CRITICAL, - status: fraudCase.severity === FraudSeverity.CRITICAL - ? FraudCaseStatus.REGULATORY_REPORTED - : fraudCase.status, + status: + fraudCase.severity === FraudSeverity.CRITICAL + ? FraudCaseStatus.REGULATORY_REPORTED + : fraudCase.status, }); - this.logger.log(`SAR generated: ${sarReference} for case ${fraudCase.caseId}`); + this.logger.log( + `SAR generated: ${sarReference} for case ${fraudCase.caseId}`, + ); return sar; } /** Generate SAR by case ID */ async generateSARById(caseId: string): Promise { - const fraudCase = await this.fraudCaseRepository.findOne({ where: { caseId } }); + const fraudCase = await this.fraudCaseRepository.findOne({ + where: { caseId }, + }); if (!fraudCase) return null; return this.generateSAR(fraudCase); } @@ -110,7 +123,8 @@ export class SuspiciousActivityService { if (severity) where['severity'] = severity; if (status) where['status'] = status; if (traderId) where['traderId'] = traderId; - if (regulatoryReported !== undefined) where['regulatoryReported'] = regulatoryReported; + if (regulatoryReported !== undefined) + where['regulatoryReported'] = regulatoryReported; if (startDate && endDate) { where['createdAt'] = Between(new Date(startDate), new Date(endDate)); @@ -156,9 +170,11 @@ export class SuspiciousActivityService { status: update.status, }; - if (update.investigationNotes) updates.investigationNotes = update.investigationNotes; + if (update.investigationNotes) + updates.investigationNotes = update.investigationNotes; if (update.assignedTo) updates.assignedTo = update.assignedTo; - if (update.falsePositiveReason) updates.falsePositiveReason = update.falsePositiveReason; + if (update.falsePositiveReason) + updates.falsePositiveReason = update.falsePositiveReason; if (update.resolvedBy) updates.resolvedBy = update.resolvedBy; if ( @@ -176,7 +192,11 @@ export class SuspiciousActivityService { } /** Get all cases for a specific trader */ - async getCasesByTrader(traderId: string, page = 1, limit = 20): Promise { + async getCasesByTrader( + traderId: string, + page = 1, + limit = 20, + ): Promise { const [data, total] = await this.fraudCaseRepository.findAndCount({ where: { traderId }, order: { createdAt: 'DESC' }, @@ -190,14 +210,27 @@ export class SuspiciousActivityService { // ─── Metrics & Dashboard ───────────────────────────────────────────────── async getMetrics(): Promise { - const [totalCases, openCases, resolvedCases, falsePositives, criticalCases] = - await Promise.all([ - this.fraudCaseRepository.count(), - this.fraudCaseRepository.count({ where: { status: FraudCaseStatus.OPEN } }), - this.fraudCaseRepository.count({ where: { status: FraudCaseStatus.RESOLVED } }), - this.fraudCaseRepository.count({ where: { status: FraudCaseStatus.FALSE_POSITIVE } }), - this.fraudCaseRepository.count({ where: { severity: FraudSeverity.CRITICAL } }), - ]); + const [ + totalCases, + openCases, + resolvedCases, + falsePositives, + criticalCases, + ] = await Promise.all([ + this.fraudCaseRepository.count(), + this.fraudCaseRepository.count({ + where: { status: FraudCaseStatus.OPEN }, + }), + this.fraudCaseRepository.count({ + where: { status: FraudCaseStatus.RESOLVED }, + }), + this.fraudCaseRepository.count({ + where: { status: FraudCaseStatus.FALSE_POSITIVE }, + }), + this.fraudCaseRepository.count({ + where: { severity: FraudSeverity.CRITICAL }, + }), + ]); const allCases = await this.fraudCaseRepository.find({ take: 1000 }); const avgMlScore = @@ -222,12 +255,14 @@ export class SuspiciousActivityService { } // Average resolution time - const resolvedWithTime = allCases.filter((c) => c.resolvedAt && c.createdAt); + const resolvedWithTime = allCases.filter( + (c) => c.resolvedAt && c.createdAt, + ); const avgResolutionHours = resolvedWithTime.length > 0 ? resolvedWithTime.reduce( (s, c) => - s + (c.resolvedAt!.getTime() - c.createdAt.getTime()) / 3_600_000, + s + (c.resolvedAt.getTime() - c.createdAt.getTime()) / 3_600_000, 0, ) / resolvedWithTime.length : 0; @@ -266,7 +301,9 @@ export class SuspiciousActivityService { await this.generateSAR(fraudCase); } - this.logger.log(`Daily SAR sweep complete: processed ${unreported.length} cases`); + this.logger.log( + `Daily SAR sweep complete: processed ${unreported.length} cases`, + ); } /** Weekly compliance report */ @@ -305,15 +342,22 @@ export class SuspiciousActivityService { } } - private getApplicableRegulators(market: string, fraudType: FraudType): string[] { + private getApplicableRegulators( + market: string, + fraudType: FraudType, + ): string[] { const regulators: string[] = ['FinCEN', 'CFTC']; - if (market.includes('EU') || market.includes('ETS')) regulators.push('ACER', 'ESMA'); - if (market.includes('PJM') || market.includes('ERCOT')) regulators.push('FERC', 'NERC'); - if (market.includes('GB') || market.includes('UK')) regulators.push('Ofgem', 'FCA'); + if (market.includes('EU') || market.includes('ETS')) + regulators.push('ACER', 'ESMA'); + if (market.includes('PJM') || market.includes('ERCOT')) + regulators.push('FERC', 'NERC'); + if (market.includes('GB') || market.includes('UK')) + regulators.push('Ofgem', 'FCA'); if (fraudType === FraudType.INSIDER_TRADING) regulators.push('SEC'); - if (fraudType === FraudType.MARKET_MANIPULATION) regulators.push('CFTC', 'FCA'); + if (fraudType === FraudType.MARKET_MANIPULATION) + regulators.push('CFTC', 'FCA'); return [...new Set(regulators)]; } diff --git a/src/gas/algorithms/fee-prediction.algorithm.ts b/src/gas/algorithms/fee-prediction.algorithm.ts index dcb85b5..dc4e876 100644 --- a/src/gas/algorithms/fee-prediction.algorithm.ts +++ b/src/gas/algorithms/fee-prediction.algorithm.ts @@ -34,13 +34,19 @@ export class FeePredictionAlgorithm { private static readonly MIN_SAMPLES_FOR_PREDICTION = 3; private static readonly FALLBACK_BASE_FEE = 100; - private static readonly PRIORITY_MULTIPLIERS: Record = { + private static readonly PRIORITY_MULTIPLIERS: Record< + GasPriorityLevel, + number + > = { [GasPriorityLevel.LOW]: 0.9, [GasPriorityLevel.MEDIUM]: 1.1, [GasPriorityLevel.HIGH]: 1.3, }; - private static readonly CONFIRMATION_LEDGERS: Record = { + private static readonly CONFIRMATION_LEDGERS: Record< + GasPriorityLevel, + number + > = { [GasPriorityLevel.LOW]: 10, [GasPriorityLevel.MEDIUM]: 5, [GasPriorityLevel.HIGH]: 2, @@ -72,8 +78,7 @@ export class FeePredictionAlgorithm { private async recentSamples(network: ContractNetwork): Promise { const since = new Date( - Date.now() - - FeePredictionAlgorithm.SAMPLE_WINDOW_HOURS * 60 * 60 * 1000, + Date.now() - FeePredictionAlgorithm.SAMPLE_WINDOW_HOURS * 60 * 60 * 1000, ); const rows = await this.gasUsageRepository diff --git a/src/gas/batching/batching.service.spec.ts b/src/gas/batching/batching.service.spec.ts index 59a3cfa..d478038 100644 --- a/src/gas/batching/batching.service.spec.ts +++ b/src/gas/batching/batching.service.spec.ts @@ -63,7 +63,9 @@ describe('BatchingService', () => { const plan = service.planBatches(ops); - expect(plan.estimatedBatchedCost).toBeLessThan(plan.estimatedIndividualCost); + expect(plan.estimatedBatchedCost).toBeLessThan( + plan.estimatedIndividualCost, + ); expect(plan.savingsStroops).toBeGreaterThan(0); expect(plan.savingsPercentage).toBeGreaterThan(0); }); diff --git a/src/gas/gas-estimator.service.ts b/src/gas/gas-estimator.service.ts index eecdd44..09f7723 100644 --- a/src/gas/gas-estimator.service.ts +++ b/src/gas/gas-estimator.service.ts @@ -10,7 +10,10 @@ import { } from './dto/gas-estimate.dto'; import { GasOptimizerService } from './optimizer/gas-optimizer.service'; import { SorobanClientService } from '../contracts/soroban-client.service'; -import { ContractNetwork, ContractType } from '../contracts/entities/contract.entity'; +import { + ContractNetwork, + ContractType, +} from '../contracts/entities/contract.entity'; @Injectable() export class GasEstimatorService { @@ -63,13 +66,16 @@ export class GasEstimatorService { } } - const { optimizedFee, estimatedConfirmationLedgers, batchingRecommendation } = - await this.optimizer.optimiseFee( - request.network, - minResourceFee, - priority, - request.includeBatchingRecommendation ?? false, - ); + const { + optimizedFee, + estimatedConfirmationLedgers, + batchingRecommendation, + } = await this.optimizer.optimiseFee( + request.network, + minResourceFee, + priority, + request.includeBatchingRecommendation ?? false, + ); const estimationDurationMs = Date.now() - start; @@ -97,9 +103,7 @@ export class GasEstimatorService { windowHours: number = 24, ): Promise { const periodEnd = new Date(); - const periodStart = new Date( - Date.now() - windowHours * 60 * 60 * 1000, - ); + const periodStart = new Date(Date.now() - windowHours * 60 * 60 * 1000); const rows = await this.gasUsageRepository .createQueryBuilder('gu') @@ -122,9 +126,7 @@ export class GasEstimatorService { ? fees.reduce((s, f) => s + f, 0) / totalTransactions : 0; const medianFeeStroops = - totalTransactions > 0 - ? sorted[Math.floor(totalTransactions / 2)] - : 0; + totalTransactions > 0 ? sorted[Math.floor(totalTransactions / 2)] : 0; const averageCpuInstructions = totalTransactions > 0 ? rows.reduce((s, r) => s + Number(r.cpu), 0) / totalTransactions diff --git a/src/gas/optimizer/gas-optimizer.service.ts b/src/gas/optimizer/gas-optimizer.service.ts index c118ecc..214e768 100644 --- a/src/gas/optimizer/gas-optimizer.service.ts +++ b/src/gas/optimizer/gas-optimizer.service.ts @@ -47,9 +47,7 @@ export class GasOptimizerService { baseline, ); - const optimizedFee = String( - Math.max(baseline, prediction.predictedFee), - ); + const optimizedFee = String(Math.max(baseline, prediction.predictedFee)); this.logger.debug( `Optimised fee for ${network}/${priority}: ${optimizedFee} stroops ` + diff --git a/src/gateway/auth/gateway-auth.service.spec.ts b/src/gateway/auth/gateway-auth.service.spec.ts index e771135..8eac022 100644 --- a/src/gateway/auth/gateway-auth.service.spec.ts +++ b/src/gateway/auth/gateway-auth.service.spec.ts @@ -24,7 +24,9 @@ describe('GatewayAuthService', () => { }); it('should throw UnauthorizedException if token is missing', async () => { - await expect(service.validateRequest('')).rejects.toThrow(UnauthorizedException); + await expect(service.validateRequest('')).rejects.toThrow( + UnauthorizedException, + ); }); }); diff --git a/src/gateway/auth/gateway-auth.service.ts b/src/gateway/auth/gateway-auth.service.ts index b1c82ff..8235b0e 100644 --- a/src/gateway/auth/gateway-auth.service.ts +++ b/src/gateway/auth/gateway-auth.service.ts @@ -11,14 +11,14 @@ export class GatewayAuthService { */ async validateRequest(token: string): Promise { this.logger.debug(`Validating request token: ${token}`); - + // Placeholder for actual validation logic (e.g. JWT check or API key look up) if (!token) { throw new UnauthorizedException('Missing authentication token'); } - + // In production, this would involve database lookup or external service call - return true; + return true; } /** diff --git a/src/gateway/circuit-breaker/circuit-breaker.service.spec.ts b/src/gateway/circuit-breaker/circuit-breaker.service.spec.ts index 3291463..0ef9246 100644 --- a/src/gateway/circuit-breaker/circuit-breaker.service.spec.ts +++ b/src/gateway/circuit-breaker/circuit-breaker.service.spec.ts @@ -27,7 +27,9 @@ describe('CircuitBreakerService', () => { for (let i = 0; i < 5; i++) { await service.reportFailure(); } - await expect(service.checkCircuit()).rejects.toThrow(InternalServerErrorException); + await expect(service.checkCircuit()).rejects.toThrow( + InternalServerErrorException, + ); }); }); @@ -49,7 +51,9 @@ describe('CircuitBreakerService', () => { await expect(service.checkCircuit()).resolves.not.toThrow(); } await service.reportFailure(); // 5th failure - await expect(service.checkCircuit()).rejects.toThrow(InternalServerErrorException); + await expect(service.checkCircuit()).rejects.toThrow( + InternalServerErrorException, + ); }); }); }); diff --git a/src/gateway/circuit-breaker/circuit-breaker.service.ts b/src/gateway/circuit-breaker/circuit-breaker.service.ts index 8e9ae25..fb2a245 100644 --- a/src/gateway/circuit-breaker/circuit-breaker.service.ts +++ b/src/gateway/circuit-breaker/circuit-breaker.service.ts @@ -1,4 +1,8 @@ -import { Injectable, Logger, InternalServerErrorException } from '@nestjs/common'; +import { + Injectable, + Logger, + InternalServerErrorException, +} from '@nestjs/common'; enum CircuitBreakerState { CLOSED, @@ -19,7 +23,9 @@ export class CircuitBreakerService { */ async checkCircuit(): Promise { if (this.state === CircuitBreakerState.OPEN) { - throw new InternalServerErrorException('Circuit is open, please try again later'); + throw new InternalServerErrorException( + 'Circuit is open, please try again later', + ); } } @@ -38,12 +44,14 @@ export class CircuitBreakerService { */ async reportFailure(): Promise { this.failureCount++; - this.logger.error(`Circuit Breaker status: FAILURE (Count: ${this.failureCount}/${this.threshold})`); - + this.logger.error( + `Circuit Breaker status: FAILURE (Count: ${this.failureCount}/${this.threshold})`, + ); + if (this.failureCount >= this.threshold) { this.state = CircuitBreakerState.OPEN; this.logger.error('Circuit Breaker status: OPEN'); - + // Reset state to HALF_OPEN after timeout setTimeout(() => { this.state = CircuitBreakerState.HALF_OPEN; diff --git a/src/gateway/monitoring/gateway-monitor.service.ts b/src/gateway/monitoring/gateway-monitor.service.ts index 016bb74..eb89d85 100644 --- a/src/gateway/monitoring/gateway-monitor.service.ts +++ b/src/gateway/monitoring/gateway-monitor.service.ts @@ -32,8 +32,15 @@ export class GatewayMonitorService { * @param status The response status code. * @param duration The duration of the request in milliseconds. */ - logRequest(method: string, path: string, status: number, duration: number): void { - this.logger.log(`[${method}] ${path} - Status: ${status} - Duration: ${duration}ms`); + logRequest( + method: string, + path: string, + status: number, + duration: number, + ): void { + this.logger.log( + `[${method}] ${path} - Status: ${status} - Duration: ${duration}ms`, + ); this.requestCounter.inc({ method, path, status: status.toString() }); this.responseTimeHistogram.observe({ method, path }, duration); } diff --git a/src/gateway/rate-limiting/advanced-rate-limiter.service.spec.ts b/src/gateway/rate-limiting/advanced-rate-limiter.service.spec.ts index 174bd62..88c92bd 100644 --- a/src/gateway/rate-limiting/advanced-rate-limiter.service.spec.ts +++ b/src/gateway/rate-limiting/advanced-rate-limiter.service.spec.ts @@ -9,7 +9,9 @@ describe('AdvancedRateLimiterService', () => { providers: [AdvancedRateLimiterService], }).compile(); - service = module.get(AdvancedRateLimiterService); + service = module.get( + AdvancedRateLimiterService, + ); }); it('should be defined', () => { diff --git a/src/gateway/rate-limiting/advanced-rate-limiter.service.ts b/src/gateway/rate-limiting/advanced-rate-limiter.service.ts index 2770726..d776370 100644 --- a/src/gateway/rate-limiting/advanced-rate-limiter.service.ts +++ b/src/gateway/rate-limiting/advanced-rate-limiter.service.ts @@ -22,16 +22,18 @@ export class AdvancedRateLimiterService { ttl: number = 60000, ): Promise { const key = userId ? `user:${userId}` : `ip:${ip}`; - + // In a real-world scenario, we'd use a distributed storage like Redis here. // For now, we'll implement a simple in-memory bucket for demonstration. // Given the 10k RPS requirement, this should eventually be backed by Redis. - - this.logger.debug(`Checking rate limit for ${key} (Limit: ${limit}, TTL: ${ttl}ms)`); - + + this.logger.debug( + `Checking rate limit for ${key} (Limit: ${limit}, TTL: ${ttl}ms)`, + ); + // Placeholder for actual rate limiting logic // In production, this would call Redis or another distributed cache - return true; + return true; } /** diff --git a/src/gateway/transformation/request-transformer.service.ts b/src/gateway/transformation/request-transformer.service.ts index 9aee6f3..de24f77 100644 --- a/src/gateway/transformation/request-transformer.service.ts +++ b/src/gateway/transformation/request-transformer.service.ts @@ -12,7 +12,7 @@ export class RequestTransformerService { */ transformRequest(body: any, rule: string): any { this.logger.debug(`Transforming request body with rule: ${rule}`); - + switch (rule) { case 'transformEnergyRequest': return this.energyRequestTransformation(body); @@ -29,7 +29,7 @@ export class RequestTransformerService { */ transformResponse(body: any, rule: string): any { this.logger.debug(`Transforming response body with rule: ${rule}`); - + switch (rule) { case 'transformEnergyResponse': return this.energyResponseTransformation(body); diff --git a/src/location/algorithms/distance.algorithm.ts b/src/location/algorithms/distance.algorithm.ts index b86de35..9d57e44 100644 --- a/src/location/algorithms/distance.algorithm.ts +++ b/src/location/algorithms/distance.algorithm.ts @@ -20,26 +20,30 @@ export class DistanceAlgorithm { static calculateDistance( point1: Coordinates, point2: Coordinates, - unit: 'km' | 'miles' = 'km' + unit: 'km' | 'miles' = 'km', ): DistanceResult { const lat1Rad = this.toRadians(point1.latitude); const lat2Rad = this.toRadians(point2.latitude); const deltaLatRad = this.toRadians(point2.latitude - point1.latitude); const deltaLonRad = this.toRadians(point2.longitude - point1.longitude); - const a = Math.sin(deltaLatRad / 2) * Math.sin(deltaLatRad / 2) + - Math.cos(lat1Rad) * Math.cos(lat2Rad) * - Math.sin(deltaLonRad / 2) * Math.sin(deltaLonRad / 2); + const a = + Math.sin(deltaLatRad / 2) * Math.sin(deltaLatRad / 2) + + Math.cos(lat1Rad) * + Math.cos(lat2Rad) * + Math.sin(deltaLonRad / 2) * + Math.sin(deltaLonRad / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - const radius = unit === 'km' ? this.EARTH_RADIUS_KM : this.EARTH_RADIUS_MILES; + const radius = + unit === 'km' ? this.EARTH_RADIUS_KM : this.EARTH_RADIUS_MILES; const distance = radius * c; return { distance: Math.round(distance * 100) / 100, // Round to 2 decimal places unit, - bearing: this.calculateBearing(point1, point2) + bearing: this.calculateBearing(point1, point2), }; } @@ -52,8 +56,9 @@ export class DistanceAlgorithm { const deltaLonRad = this.toRadians(point2.longitude - point1.longitude); const y = Math.sin(deltaLonRad) * Math.cos(lat2Rad); - const x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - - Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad); + const x = + Math.cos(lat1Rad) * Math.sin(lat2Rad) - + Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad); const bearing = Math.atan2(y, x); return (this.toDegrees(bearing) + 360) % 360; @@ -65,10 +70,14 @@ export class DistanceAlgorithm { static findPointsWithinRadius( centerPoint: Coordinates, points: T[], - radiusKm: number + radiusKm: number, ): T[] { - return points.filter(point => { - const distance = this.calculateDistance(centerPoint, point, 'km').distance; + return points.filter((point) => { + const distance = this.calculateDistance( + centerPoint, + point, + 'km', + ).distance; return distance <= radiusKm; }); } @@ -79,22 +88,23 @@ export class DistanceAlgorithm { */ static getBoundingBox( centerPoint: Coordinates, - radiusKm: number + radiusKm: number, ): { minLat: number; maxLat: number; minLon: number; maxLon: number; } { - const deltaLat = radiusKm / this.EARTH_RADIUS_KM * (180 / Math.PI); - const deltaLon = Math.asin(radiusKm / this.EARTH_RADIUS_KM) * (180 / Math.PI) / - Math.cos(this.toRadians(centerPoint.latitude)); + const deltaLat = (radiusKm / this.EARTH_RADIUS_KM) * (180 / Math.PI); + const deltaLon = + (Math.asin(radiusKm / this.EARTH_RADIUS_KM) * (180 / Math.PI)) / + Math.cos(this.toRadians(centerPoint.latitude)); return { minLat: centerPoint.latitude - deltaLat, maxLat: centerPoint.latitude + deltaLat, minLon: centerPoint.longitude - deltaLon, - maxLon: centerPoint.longitude + deltaLon + maxLon: centerPoint.longitude + deltaLon, }; } @@ -107,12 +117,14 @@ export class DistanceAlgorithm { const y = point.latitude; for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) { - const xi = polygon[i][0], yi = polygon[i][1]; - const xj = polygon[j][0], yj = polygon[j][1]; + const xi = polygon[i][0], + yi = polygon[i][1]; + const xj = polygon[j][0], + yj = polygon[j][1]; + + const intersect = + yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi; - const intersect = ((yi > y) !== (yj > y)) && - (x < (xj - xi) * (y - yi) / (yj - yi) + xi); - if (intersect) inside = !inside; } diff --git a/src/location/algorithms/zone-mapping.algorithm.ts b/src/location/algorithms/zone-mapping.algorithm.ts index 8399078..2fb838c 100644 --- a/src/location/algorithms/zone-mapping.algorithm.ts +++ b/src/location/algorithms/zone-mapping.algorithm.ts @@ -14,7 +14,7 @@ export class ZoneMappingAlgorithm { */ static findZoneForCoordinate( coordinate: Coordinates, - gridZones: GridZone[] + gridZones: GridZone[], ): ZoneMappingResult { let exactZone: GridZone | null = null; let nearestZone: GridZone | null = null; @@ -29,8 +29,12 @@ export class ZoneMappingAlgorithm { // Calculate distance to zone centroid for nearest zone const centroid = this.calculateZoneCentroid(zone); - const distance = DistanceAlgorithm.calculateDistance(coordinate, centroid, 'km').distance; - + const distance = DistanceAlgorithm.calculateDistance( + coordinate, + centroid, + 'km', + ).distance; + if (distance < minDistance) { minDistance = distance; nearestZone = zone; @@ -41,7 +45,7 @@ export class ZoneMappingAlgorithm { zone: exactZone, isExactMatch: exactZone !== null, nearestZone: nearestZone || undefined, - distanceToNearest: minDistance === Infinity ? undefined : minDistance + distanceToNearest: minDistance === Infinity ? undefined : minDistance, }; } @@ -51,14 +55,18 @@ export class ZoneMappingAlgorithm { static findZonesWithinRadius( coordinate: Coordinates, gridZones: GridZone[], - radiusKm: number + radiusKm: number, ): GridZone[] { const zonesWithinRadius: GridZone[] = []; for (const zone of gridZones) { const centroid = this.calculateZoneCentroid(zone); - const distance = DistanceAlgorithm.calculateDistance(coordinate, centroid, 'km').distance; - + const distance = DistanceAlgorithm.calculateDistance( + coordinate, + centroid, + 'km', + ).distance; + if (distance <= radiusKm) { zonesWithinRadius.push(zone); } @@ -110,12 +118,18 @@ export class ZoneMappingAlgorithm { /** * Check if a coordinate is within a zone's boundaries */ - private static isCoordinateInZone(coordinate: Coordinates, zone: GridZone): boolean { + private static isCoordinateInZone( + coordinate: Coordinates, + zone: GridZone, + ): boolean { const coordinates = zone.boundaries.coordinates; if (zone.boundaries.type === 'Polygon') { const polygonCoordinates = coordinates as number[][][]; - return DistanceAlgorithm.isPointInPolygon(coordinate, polygonCoordinates[0]); + return DistanceAlgorithm.isPointInPolygon( + coordinate, + polygonCoordinates[0], + ); } else if (zone.boundaries.type === 'MultiPolygon') { const multipolygonCoordinates = coordinates as number[][][][]; // Check if point is in any of the polygons @@ -144,7 +158,7 @@ export class ZoneMappingAlgorithm { return { latitude: sumLat / numPoints, - longitude: sumLon / numPoints + longitude: sumLon / numPoints, }; } @@ -176,7 +190,11 @@ export class ZoneMappingAlgorithm { if (otherZone.id === zone.id) continue; const otherCentroid = this.calculateZoneCentroid(otherZone); - const distance = DistanceAlgorithm.calculateDistance(zoneCentroid, otherCentroid, 'km').distance; + const distance = DistanceAlgorithm.calculateDistance( + zoneCentroid, + otherCentroid, + 'km', + ).distance; // Adjacent zones are typically within 50km of each other if (distance <= 50) { @@ -193,12 +211,19 @@ export class ZoneMappingAlgorithm { /** * Check if two zones share boundaries (simplified implementation) */ - private static doZonesShareBoundary(zone1: GridZone, zone2: GridZone): boolean { + private static doZonesShareBoundary( + zone1: GridZone, + zone2: GridZone, + ): boolean { // This is a simplified check - in a real implementation, // you would perform geometric intersection tests const centroid1 = this.calculateZoneCentroid(zone1); const centroid2 = this.calculateZoneCentroid(zone2); - const distance = DistanceAlgorithm.calculateDistance(centroid1, centroid2, 'km').distance; + const distance = DistanceAlgorithm.calculateDistance( + centroid1, + centroid2, + 'km', + ).distance; // If centroids are very close, zones likely share boundaries return distance < 20; // 20km threshold diff --git a/src/location/dto/location-search.dto.ts b/src/location/dto/location-search.dto.ts index c696b22..cc847f4 100644 --- a/src/location/dto/location-search.dto.ts +++ b/src/location/dto/location-search.dto.ts @@ -1,4 +1,12 @@ -import { IsOptional, IsNumber, IsString, IsEnum, IsBoolean, Min, Max } from 'class-validator'; +import { + IsOptional, + IsNumber, + IsString, + IsEnum, + IsBoolean, + Min, + Max, +} from 'class-validator'; import { Type } from 'class-transformer'; import { ApiPropertyOptional } from '@nestjs/swagger'; @@ -6,12 +14,12 @@ export enum LocationSearchSortBy { DISTANCE = 'distance', PRICE = 'price', CREATED_AT = 'createdAt', - UPDATED_AT = 'updatedAt' + UPDATED_AT = 'updatedAt', } export enum LocationSearchSortOrder { ASC = 'asc', - DESC = 'desc' + DESC = 'desc', } export class LocationSearchDto { @@ -19,7 +27,7 @@ export class LocationSearchDto { description: 'Center latitude for location-based search', example: 40.7128, minimum: -90, - maximum: 90 + maximum: 90, }) @IsOptional() @Type(() => Number) @@ -30,9 +38,9 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'Center longitude for location-based search', - example: -74.0060, + example: -74.006, minimum: -180, - maximum: 180 + maximum: 180, }) @IsOptional() @Type(() => Number) @@ -45,7 +53,7 @@ export class LocationSearchDto { description: 'Search radius in kilometers', example: 10, minimum: 0.1, - maximum: 1000 + maximum: 1000, }) @IsOptional() @Type(() => Number) @@ -56,7 +64,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'Grid zone ID to filter by', - example: 'zone-123' + example: 'zone-123', }) @IsOptional() @IsString() @@ -64,7 +72,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'Country to filter by', - example: 'United States' + example: 'United States', }) @IsOptional() @IsString() @@ -72,7 +80,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'State/region to filter by', - example: 'California' + example: 'California', }) @IsOptional() @IsString() @@ -80,7 +88,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'City to filter by', - example: 'New York' + example: 'New York', }) @IsOptional() @IsString() @@ -89,7 +97,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'Minimum regional price multiplier', example: 0.8, - minimum: 0 + minimum: 0, }) @IsOptional() @Type(() => Number) @@ -100,7 +108,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'Maximum regional price multiplier', example: 1.5, - minimum: 0 + minimum: 0, }) @IsOptional() @Type(() => Number) @@ -110,7 +118,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'Filter by privacy setting', - example: true + example: true, }) @IsOptional() @IsBoolean() @@ -119,7 +127,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'Sort results by field', enum: LocationSearchSortBy, - default: LocationSearchSortBy.DISTANCE + default: LocationSearchSortBy.DISTANCE, }) @IsOptional() @IsEnum(LocationSearchSortBy) @@ -128,7 +136,7 @@ export class LocationSearchDto { @ApiPropertyOptional({ description: 'Sort order', enum: LocationSearchSortOrder, - default: LocationSearchSortOrder.ASC + default: LocationSearchSortOrder.ASC, }) @IsOptional() @IsEnum(LocationSearchSortOrder) @@ -138,7 +146,7 @@ export class LocationSearchDto { description: 'Page number for pagination', example: 1, minimum: 1, - default: 1 + default: 1, }) @IsOptional() @Type(() => Number) @@ -151,7 +159,7 @@ export class LocationSearchDto { example: 20, minimum: 1, maximum: 100, - default: 20 + default: 20, }) @IsOptional() @Type(() => Number) @@ -166,7 +174,7 @@ export class LocationHeatmapDto { description: 'Bounding box minimum latitude', example: 40.0, minimum: -90, - maximum: 90 + maximum: 90, }) @IsOptional() @Type(() => Number) @@ -179,7 +187,7 @@ export class LocationHeatmapDto { description: 'Bounding box maximum latitude', example: 41.0, minimum: -90, - maximum: 90 + maximum: 90, }) @IsOptional() @Type(() => Number) @@ -192,7 +200,7 @@ export class LocationHeatmapDto { description: 'Bounding box minimum longitude', example: -75.0, minimum: -180, - maximum: 180 + maximum: 180, }) @IsOptional() @Type(() => Number) @@ -205,7 +213,7 @@ export class LocationHeatmapDto { description: 'Bounding box maximum longitude', example: -73.0, minimum: -180, - maximum: 180 + maximum: 180, }) @IsOptional() @Type(() => Number) @@ -219,7 +227,7 @@ export class LocationHeatmapDto { example: 50, minimum: 10, maximum: 200, - default: 50 + default: 50, }) @IsOptional() @Type(() => Number) diff --git a/src/location/entities/grid-zone.entity.ts b/src/location/entities/grid-zone.entity.ts index f05b0eb..c95a8cc 100644 --- a/src/location/entities/grid-zone.entity.ts +++ b/src/location/entities/grid-zone.entity.ts @@ -1,4 +1,11 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, +} from 'typeorm'; @Entity('grid_zones') @Index(['zoneCode']) diff --git a/src/location/entities/location.entity.ts b/src/location/entities/location.entity.ts index 74238d8..7f798f9 100644 --- a/src/location/entities/location.entity.ts +++ b/src/location/entities/location.entity.ts @@ -1,4 +1,11 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, +} from 'typeorm'; @Entity('locations') @Index(['latitude', 'longitude']) diff --git a/src/location/location.module.ts b/src/location/location.module.ts index cd49562..5bb529b 100644 --- a/src/location/location.module.ts +++ b/src/location/location.module.ts @@ -5,9 +5,7 @@ import { Location } from './entities/location.entity'; import { GridZone } from './entities/grid-zone.entity'; @Module({ - imports: [ - TypeOrmModule.forFeature([Location, GridZone]) - ], + imports: [TypeOrmModule.forFeature([Location, GridZone])], providers: [LocationService], exports: [LocationService], }) diff --git a/src/location/location.service.spec.ts b/src/location/location.service.spec.ts index 2318d18..b6b0253 100644 --- a/src/location/location.service.spec.ts +++ b/src/location/location.service.spec.ts @@ -41,8 +41,12 @@ describe('LocationService', () => { }).compile(); service = module.get(LocationService); - locationRepository = module.get>(getRepositoryToken(Location)); - gridZoneRepository = module.get>(getRepositoryToken(GridZone)); + locationRepository = module.get>( + getRepositoryToken(Location), + ); + gridZoneRepository = module.get>( + getRepositoryToken(GridZone), + ); }); it('should be defined', () => { @@ -53,7 +57,7 @@ describe('LocationService', () => { it('should create a location with valid data', async () => { const locationData = { latitude: 40.7128, - longitude: -74.0060, + longitude: -74.006, address: '123 Test St', city: 'New York', state: 'NY', @@ -70,17 +74,21 @@ describe('LocationService', () => { expect(result).toEqual(expectedLocation); expect(mockLocationRepository.create).toHaveBeenCalledWith(locationData); - expect(mockLocationRepository.save).toHaveBeenCalledWith(expectedLocation); + expect(mockLocationRepository.save).toHaveBeenCalledWith( + expectedLocation, + ); }); it('should throw error for invalid latitude', async () => { const locationData = { latitude: 91, // Invalid latitude - longitude: -74.0060, + longitude: -74.006, address: '123 Test St', }; - await expect(service.createLocation(locationData)).rejects.toThrow('Latitude must be between -90 and 90'); + await expect(service.createLocation(locationData)).rejects.toThrow( + 'Latitude must be between -90 and 90', + ); }); it('should throw error for invalid longitude', async () => { @@ -90,7 +98,9 @@ describe('LocationService', () => { address: '123 Test St', }; - await expect(service.createLocation(locationData)).rejects.toThrow('Longitude must be between -180 and 180'); + await expect(service.createLocation(locationData)).rejects.toThrow( + 'Longitude must be between -180 and 180', + ); }); }); @@ -118,7 +128,9 @@ describe('LocationService', () => { getManyAndCount: jest.fn().mockResolvedValue([mockLocations, 2]), }; - mockLocationRepository.createQueryBuilder.mockReturnValue(mockQueryBuilder); + mockLocationRepository.createQueryBuilder.mockReturnValue( + mockQueryBuilder, + ); const result = await service.searchLocations(searchDto); @@ -131,7 +143,7 @@ describe('LocationService', () => { describe('calculateDistance', () => { it('should calculate distance between two locations', async () => { - const location1 = { id: '1', latitude: 40.7128, longitude: -74.0060 }; + const location1 = { id: '1', latitude: 40.7128, longitude: -74.006 }; const location2 = { id: '2', latitude: 34.0522, longitude: -118.2437 }; mockLocationRepository.findOne @@ -150,7 +162,7 @@ describe('LocationService', () => { const location = { id: '1', latitude: 40.7128, - longitude: -74.0060, + longitude: -74.006, regionalPriceMultiplier: 1.25, }; diff --git a/src/location/location.service.ts b/src/location/location.service.ts index 4a2774b..3cd12fd 100644 --- a/src/location/location.service.ts +++ b/src/location/location.service.ts @@ -1,10 +1,20 @@ -import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; +import { + Injectable, + NotFoundException, + BadRequestException, +} from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, Between, LessThan, MoreThan } from 'typeorm'; import { Location } from './entities/location.entity'; import { GridZone } from './entities/grid-zone.entity'; -import { LocationSearchDto, LocationHeatmapDto } from './dto/location-search.dto'; -import { DistanceAlgorithm, Coordinates } from './algorithms/distance.algorithm'; +import { + LocationSearchDto, + LocationHeatmapDto, +} from './dto/location-search.dto'; +import { + DistanceAlgorithm, + Coordinates, +} from './algorithms/distance.algorithm'; import { ZoneMappingAlgorithm } from './algorithms/zone-mapping.algorithm'; @Injectable() @@ -26,15 +36,20 @@ export class LocationService { } // Auto-assign grid zone if not provided - if (!locationData.gridZoneId && locationData.latitude && locationData.longitude) { + if ( + !locationData.gridZoneId && + locationData.latitude && + locationData.longitude + ) { const zoneMapping = await this.findZoneForCoordinate({ latitude: locationData.latitude, - longitude: locationData.longitude + longitude: locationData.longitude, }); - + if (zoneMapping.zone) { locationData.gridZoneId = zoneMapping.zone.id; - locationData.regionalPriceMultiplier = zoneMapping.zone.basePriceMultiplier; + locationData.regionalPriceMultiplier = + zoneMapping.zone.basePriceMultiplier; } } @@ -45,7 +60,10 @@ export class LocationService { /** * Update an existing location */ - async updateLocation(id: string, updateData: Partial): Promise { + async updateLocation( + id: string, + updateData: Partial, + ): Promise { const location = await this.locationRepository.findOne({ where: { id } }); if (!location) { throw new NotFoundException(`Location with ID ${id} not found`); @@ -57,17 +75,20 @@ export class LocationService { } // Re-calculate grid zone if coordinates changed - if ((updateData.latitude || updateData.longitude) && - (updateData.latitude !== location.latitude || updateData.longitude !== location.longitude)) { - + if ( + (updateData.latitude || updateData.longitude) && + (updateData.latitude !== location.latitude || + updateData.longitude !== location.longitude) + ) { const zoneMapping = await this.findZoneForCoordinate({ latitude: updateData.latitude || location.latitude, - longitude: updateData.longitude || location.longitude + longitude: updateData.longitude || location.longitude, }); - + if (zoneMapping.zone) { updateData.gridZoneId = zoneMapping.zone.id; - updateData.regionalPriceMultiplier = zoneMapping.zone.basePriceMultiplier; + updateData.regionalPriceMultiplier = + zoneMapping.zone.basePriceMultiplier; } } @@ -79,11 +100,11 @@ export class LocationService { * Get location by ID */ async getLocation(id: string): Promise { - const location = await this.locationRepository.findOne({ + const location = await this.locationRepository.findOne({ where: { id }, - relations: ['gridZone'] + relations: ['gridZone'], }); - + if (!location) { throw new NotFoundException(`Location with ID ${id} not found`); } @@ -100,49 +121,56 @@ export class LocationService { page: number; limit: number; }> { - const queryBuilder = this.locationRepository.createQueryBuilder('location') + const queryBuilder = this.locationRepository + .createQueryBuilder('location') .leftJoinAndSelect('location.gridZone', 'gridZone'); // Apply filters if (searchDto.gridZoneId) { - queryBuilder.andWhere('location.gridZoneId = :gridZoneId', { - gridZoneId: searchDto.gridZoneId + queryBuilder.andWhere('location.gridZoneId = :gridZoneId', { + gridZoneId: searchDto.gridZoneId, }); } if (searchDto.country) { - queryBuilder.andWhere('location.country = :country', { - country: searchDto.country + queryBuilder.andWhere('location.country = :country', { + country: searchDto.country, }); } if (searchDto.state) { - queryBuilder.andWhere('location.state = :state', { - state: searchDto.state + queryBuilder.andWhere('location.state = :state', { + state: searchDto.state, }); } if (searchDto.city) { - queryBuilder.andWhere('location.city = :city', { - city: searchDto.city + queryBuilder.andWhere('location.city = :city', { + city: searchDto.city, }); } if (searchDto.minPriceMultiplier !== undefined) { - queryBuilder.andWhere('location.regionalPriceMultiplier >= :minPriceMultiplier', { - minPriceMultiplier: searchDto.minPriceMultiplier - }); + queryBuilder.andWhere( + 'location.regionalPriceMultiplier >= :minPriceMultiplier', + { + minPriceMultiplier: searchDto.minPriceMultiplier, + }, + ); } if (searchDto.maxPriceMultiplier !== undefined) { - queryBuilder.andWhere('location.regionalPriceMultiplier <= :maxPriceMultiplier', { - maxPriceMultiplier: searchDto.maxPriceMultiplier - }); + queryBuilder.andWhere( + 'location.regionalPriceMultiplier <= :maxPriceMultiplier', + { + maxPriceMultiplier: searchDto.maxPriceMultiplier, + }, + ); } if (searchDto.isPublic !== undefined) { queryBuilder.andWhere('location.isPublic = :isPublic', { - isPublic: searchDto.isPublic + isPublic: searchDto.isPublic, }); } @@ -150,16 +178,18 @@ export class LocationService { if (searchDto.latitude && searchDto.longitude && searchDto.radiusKm) { const boundingBox = DistanceAlgorithm.getBoundingBox( { latitude: searchDto.latitude, longitude: searchDto.longitude }, - searchDto.radiusKm + searchDto.radiusKm, ); - queryBuilder.andWhere('location.latitude BETWEEN :minLat AND :maxLat', { - minLat: boundingBox.minLat, - maxLat: boundingBox.maxLat - }).andWhere('location.longitude BETWEEN :minLon AND :maxLon', { - minLon: boundingBox.minLon, - maxLon: boundingBox.maxLon - }); + queryBuilder + .andWhere('location.latitude BETWEEN :minLat AND :maxLat', { + minLat: boundingBox.minLat, + maxLat: boundingBox.maxLat, + }) + .andWhere('location.longitude BETWEEN :minLon AND :maxLon', { + minLon: boundingBox.minLon, + maxLon: boundingBox.maxLon, + }); } // Apply sorting @@ -172,12 +202,19 @@ export class LocationService { const sortedLocations = this.sortByDistance( locations, { latitude: searchDto.latitude, longitude: searchDto.longitude }, - sortOrder + sortOrder, ); - return this.paginateResults(sortedLocations, searchDto.page, searchDto.limit); + return this.paginateResults( + sortedLocations, + searchDto.page, + searchDto.limit, + ); } else { - queryBuilder.orderBy(`location.${sortBy}`, sortOrder.toUpperCase() as 'ASC' | 'DESC'); + queryBuilder.orderBy( + `location.${sortBy}`, + sortOrder.toUpperCase() as 'ASC' | 'DESC', + ); } // Apply pagination @@ -193,7 +230,7 @@ export class LocationService { locations, total, page, - limit + limit, }; } @@ -207,13 +244,13 @@ export class LocationService { totalLocations: number; }> { const resolution = heatmapDto.resolution || 50; - + // Get bounding box const bounds = { minLat: heatmapDto.minLat || -90, maxLat: heatmapDto.maxLat || 90, minLon: heatmapDto.minLon || -180, - maxLon: heatmapDto.maxLon || 180 + maxLon: heatmapDto.maxLon || 180, }; // Get all locations within bounding box @@ -221,19 +258,34 @@ export class LocationService { where: { latitude: Between(bounds.minLat, bounds.maxLat), longitude: Between(bounds.minLon, bounds.maxLon), - isPublic: true - } + isPublic: true, + }, }); // Initialize grid - const grid = Array(resolution).fill(0).map(() => Array(resolution).fill(0)); + const grid = Array(resolution) + .fill(0) + .map(() => Array(resolution).fill(0)); // Populate grid with location density - locations.forEach(location => { - const gridX = Math.floor(((location.longitude - bounds.minLon) / (bounds.maxLon - bounds.minLon)) * resolution); - const gridY = Math.floor(((location.latitude - bounds.minLat) / (bounds.maxLat - bounds.minLat)) * resolution); - - if (gridX >= 0 && gridX < resolution && gridY >= 0 && gridY < resolution) { + locations.forEach((location) => { + const gridX = Math.floor( + ((location.longitude - bounds.minLon) / + (bounds.maxLon - bounds.minLon)) * + resolution, + ); + const gridY = Math.floor( + ((location.latitude - bounds.minLat) / + (bounds.maxLat - bounds.minLat)) * + resolution, + ); + + if ( + gridX >= 0 && + gridX < resolution && + gridY >= 0 && + gridY < resolution + ) { grid[gridY][gridX]++; } }); @@ -242,7 +294,7 @@ export class LocationService { grid, bounds, resolution, - totalLocations: locations.length + totalLocations: locations.length, }; } @@ -250,23 +302,29 @@ export class LocationService { * Find grid zone for a coordinate */ async findZoneForCoordinate(coordinate: Coordinates) { - const gridZones = await this.gridZoneRepository.find({ where: { isActive: true } }); + const gridZones = await this.gridZoneRepository.find({ + where: { isActive: true }, + }); return ZoneMappingAlgorithm.findZoneForCoordinate(coordinate, gridZones); } /** * Calculate distance between two locations */ - async calculateDistance(locationId1: string, locationId2: string, unit: 'km' | 'miles' = 'km') { + async calculateDistance( + locationId1: string, + locationId2: string, + unit: 'km' | 'miles' = 'km', + ) { const [location1, location2] = await Promise.all([ this.getLocation(locationId1), - this.getLocation(locationId2) + this.getLocation(locationId2), ]); return DistanceAlgorithm.calculateDistance( { latitude: location1.latitude, longitude: location1.longitude }, { latitude: location2.latitude, longitude: location2.longitude }, - unit + unit, ); } @@ -296,7 +354,10 @@ export class LocationService { /** * Update grid zone */ - async updateGridZone(id: string, updateData: Partial): Promise { + async updateGridZone( + id: string, + updateData: Partial, + ): Promise { const zone = await this.gridZoneRepository.findOne({ where: { id } }); if (!zone) { throw new NotFoundException(`Grid zone with ID ${id} not found`); @@ -327,27 +388,29 @@ export class LocationService { private sortByDistance( locations: Location[], centerPoint: Coordinates, - sortOrder: 'asc' | 'desc' + sortOrder: 'asc' | 'desc', ): Location[] { return locations.sort((a, b) => { - const distanceA = DistanceAlgorithm.calculateDistance( - centerPoint, - { latitude: a.latitude, longitude: a.longitude } - ).distance; - - const distanceB = DistanceAlgorithm.calculateDistance( - centerPoint, - { latitude: b.latitude, longitude: b.longitude } - ).distance; - - return sortOrder === 'asc' ? distanceA - distanceB : distanceB - distanceA; + const distanceA = DistanceAlgorithm.calculateDistance(centerPoint, { + latitude: a.latitude, + longitude: a.longitude, + }).distance; + + const distanceB = DistanceAlgorithm.calculateDistance(centerPoint, { + latitude: b.latitude, + longitude: b.longitude, + }).distance; + + return sortOrder === 'asc' + ? distanceA - distanceB + : distanceB - distanceA; }); } private paginateResults( locations: Location[], page: number = 1, - limit: number = 20 + limit: number = 20, ): { locations: Location[]; total: number; @@ -363,7 +426,7 @@ export class LocationService { locations: paginatedLocations, total, page, - limit + limit, }; } } diff --git a/src/logging/alerts/log-alert.service.ts b/src/logging/alerts/log-alert.service.ts index 753bbc3..fc3727b 100644 --- a/src/logging/alerts/log-alert.service.ts +++ b/src/logging/alerts/log-alert.service.ts @@ -19,7 +19,17 @@ export interface AlertRule { export interface AlertCondition { field: string; - operator: 'eq' | 'ne' | 'gt' | 'lt' | 'gte' | 'lte' | 'contains' | 'regex' | 'exists' | 'not_exists'; + operator: + | 'eq' + | 'ne' + | 'gt' + | 'lt' + | 'gte' + | 'lte' + | 'contains' + | 'regex' + | 'exists' + | 'not_exists'; value?: any; time_window_minutes?: number; threshold?: number; @@ -85,13 +95,13 @@ export class LogAlertService implements OnModuleInit { async onModuleInit() { this.logger.log('Initializing log alert service'); - + // Load alert rules from configuration await this.loadAlertRules(); - + // Start alert monitoring this.startAlertMonitoring(); - + this.logger.log('Log alert service initialized'); } @@ -342,16 +352,16 @@ export class LogAlertService implements OnModuleInit { async checkAlertConditions(): Promise { const now = new Date(); - + for (const [ruleId, rule] of this.alertRules.entries()) { if (!rule.enabled) continue; - + // Check cooldown if (this.isInCooldown(ruleId, now)) continue; - + // Check hourly limit if (this.exceedsHourlyLimit(ruleId, now)) continue; - + try { const shouldAlert = await this.evaluateRule(rule, now); if (shouldAlert) { @@ -365,18 +375,18 @@ export class LogAlertService implements OnModuleInit { private async evaluateRule(rule: AlertRule, now: Date): Promise { const searchQuery = this.buildSearchQueryFromRule(rule, now); - + try { const response = await this.elasticsearchService.searchLogs(searchQuery); const hitCount = response.hits?.total?.value || 0; - + // Check if any condition threshold is met for (const condition of rule.conditions) { if (condition.threshold && hitCount >= condition.threshold) { return true; } } - + return false; } catch (error) { this.logger.error(`Failed to evaluate rule ${rule.id}`, error); @@ -403,7 +413,9 @@ export class LogAlertService implements OnModuleInit { }; // Add time range if specified - const maxTimeWindow = Math.max(...rule.conditions.map(c => c.time_window_minutes || 0)); + const maxTimeWindow = Math.max( + ...rule.conditions.map((c) => c.time_window_minutes || 0), + ); if (maxTimeWindow > 0) { const startTime = new Date(now.getTime() - maxTimeWindow * 60 * 1000); query.query.bool.filter.push({ @@ -432,7 +444,9 @@ export class LogAlertService implements OnModuleInit { case 'eq': return { term: { [condition.field]: condition.value } }; case 'ne': - return { bool: { must_not: { term: { [condition.field]: condition.value } } } }; + return { + bool: { must_not: { term: { [condition.field]: condition.value } } }, + }; case 'gt': return { range: { [condition.field]: { gt: condition.value } } }; case 'lt': @@ -456,7 +470,7 @@ export class LogAlertService implements OnModuleInit { private async triggerAlert(rule: AlertRule, now: Date): Promise { const alertId = `${rule.id}_${now.getTime()}`; - + const alert: Alert = { id: alertId, rule_id: rule.id, @@ -472,19 +486,19 @@ export class LogAlertService implements OnModuleInit { // Store alert this.activeAlerts.set(alertId, alert); this.alertHistory.push(alert); - + // Update metrics this.updateAlertMetrics(alert); - + // Set cooldown this.setCooldown(rule.id, now); - + // Increment counter this.incrementAlertCounter(rule.id, now); - + // Execute actions await this.executeAlertActions(alert, rule); - + this.logger.log(`Alert triggered: ${rule.name} (${alertId})`); } @@ -492,14 +506,14 @@ export class LogAlertService implements OnModuleInit { try { const searchQuery = this.buildSearchQueryFromRule(rule, new Date()); const response = await this.elasticsearchService.searchLogs(searchQuery); - + const hits = response.hits?.hits || []; - const recentLogs = hits.slice(0, 10).map(hit => hit._source); - + const recentLogs = hits.slice(0, 10).map((hit) => hit._source); + return { total_hits: response.hits?.total?.value || 0, recent_logs: recentLogs, - time_window: `${Math.max(...rule.conditions.map(c => c.time_window_minutes || 0))} minutes`, + time_window: `${Math.max(...rule.conditions.map((c) => c.time_window_minutes || 0))} minutes`, }; } catch (error) { this.logger.error('Failed to get alert details', error); @@ -507,12 +521,15 @@ export class LogAlertService implements OnModuleInit { } } - private async executeAlertActions(alert: Alert, rule: AlertRule): Promise { + private async executeAlertActions( + alert: Alert, + rule: AlertRule, + ): Promise { const results: NotificationResult[] = []; - + for (const action of rule.actions) { if (!action.enabled) continue; - + try { const result = await this.executeAction(alert, action); results.push(result); @@ -526,11 +543,14 @@ export class LogAlertService implements OnModuleInit { }); } } - + return results; } - private async executeAction(alert: Alert, action: AlertAction): Promise { + private async executeAction( + alert: Alert, + action: AlertAction, + ): Promise { switch (action.type) { case 'email': return await this.sendEmailAlert(alert, action.config); @@ -549,11 +569,14 @@ export class LogAlertService implements OnModuleInit { } } - private async sendEmailAlert(alert: Alert, config: any): Promise { + private async sendEmailAlert( + alert: Alert, + config: any, + ): Promise { try { // Implementation would depend on your email service this.logger.log(`Email alert sent to ${config.recipients?.join(', ')}`); - + return { action_type: 'email', success: true, @@ -565,7 +588,10 @@ export class LogAlertService implements OnModuleInit { } } - private async sendSlackAlert(alert: Alert, config: any): Promise { + private async sendSlackAlert( + alert: Alert, + config: any, + ): Promise { try { const payload = { channel: config.channel || '#alerts', @@ -608,7 +634,7 @@ export class LogAlertService implements OnModuleInit { // Implementation would use fetch or http client to send to Slack webhook this.logger.log(`Slack alert sent to ${config.channel}`); - + return { action_type: 'slack', success: true, @@ -620,7 +646,10 @@ export class LogAlertService implements OnModuleInit { } } - private async sendWebhookAlert(alert: Alert, config: any): Promise { + private async sendWebhookAlert( + alert: Alert, + config: any, + ): Promise { try { const payload = { alert_id: alert.id, @@ -634,7 +663,7 @@ export class LogAlertService implements OnModuleInit { // Implementation would use fetch or http client to send webhook this.logger.log(`Webhook alert sent to ${config.url}`); - + return { action_type: 'webhook', success: true, @@ -646,7 +675,10 @@ export class LogAlertService implements OnModuleInit { } } - private async sendPagerDutyAlert(alert: Alert, config: any): Promise { + private async sendPagerDutyAlert( + alert: Alert, + config: any, + ): Promise { try { const payload = { routing_key: config.service_key, @@ -664,7 +696,7 @@ export class LogAlertService implements OnModuleInit { // Implementation would use PagerDuty API this.logger.log(`PagerDuty alert sent`); - + return { action_type: 'pagerduty', success: true, @@ -676,7 +708,10 @@ export class LogAlertService implements OnModuleInit { } } - private async sendTeamsAlert(alert: Alert, config: any): Promise { + private async sendTeamsAlert( + alert: Alert, + config: any, + ): Promise { try { const payload = { '@type': 'MessageCard', @@ -699,7 +734,7 @@ export class LogAlertService implements OnModuleInit { // Implementation would use fetch or http client to send to Teams webhook this.logger.log(`Teams alert sent`); - + return { action_type: 'teams', success: true, @@ -711,13 +746,16 @@ export class LogAlertService implements OnModuleInit { } } - private async sendSMSAlert(alert: Alert, config: any): Promise { + private async sendSMSAlert( + alert: Alert, + config: any, + ): Promise { try { const message = `CurrentDAO Alert: ${alert.message} (${alert.severity.toUpperCase()})`; - + // Implementation would use SMS service like Twilio this.logger.log(`SMS alert sent to ${config.phone_numbers?.join(', ')}`); - + return { action_type: 'sms', success: true, @@ -747,11 +785,11 @@ export class LogAlertService implements OnModuleInit { private isInCooldown(ruleId: string, now: Date): boolean { const cooldownEnd = this.alertCooldowns.get(ruleId); if (!cooldownEnd) return false; - + if (now < cooldownEnd) { return true; } - + this.alertCooldowns.delete(ruleId); return false; } @@ -759,54 +797,59 @@ export class LogAlertService implements OnModuleInit { private setCooldown(ruleId: string, now: Date): void { const rule = this.alertRules.get(ruleId); if (!rule) return; - - const cooldownEnd = new Date(now.getTime() + rule.cooldown_minutes * 60 * 1000); + + const cooldownEnd = new Date( + now.getTime() + rule.cooldown_minutes * 60 * 1000, + ); this.alertCooldowns.set(ruleId, cooldownEnd); } private exceedsHourlyLimit(ruleId: string, now: Date): boolean { const counter = this.alertCounters.get(ruleId); if (!counter) return false; - + const rule = this.alertRules.get(ruleId); if (!rule) return false; - + return counter >= rule.max_alerts_per_hour; } private incrementAlertCounter(ruleId: string, now: Date): void { const currentCount = this.alertCounters.get(ruleId) || 0; this.alertCounters.set(ruleId, currentCount + 1); - + // Reset counter after an hour - setTimeout(() => { - const count = this.alertCounters.get(ruleId) || 0; - if (count > 0) { - this.alertCounters.set(ruleId, count - 1); - } - }, 60 * 60 * 1000); + setTimeout( + () => { + const count = this.alertCounters.get(ruleId) || 0; + if (count > 0) { + this.alertCounters.set(ruleId, count - 1); + } + }, + 60 * 60 * 1000, + ); } private updateAlertMetrics(alert: Alert): void { this.alertMetrics.total_alerts++; this.alertMetrics.active_alerts++; - + // Update severity count const severity = alert.severity; - this.alertMetrics.alerts_by_severity[severity] = + this.alertMetrics.alerts_by_severity[severity] = (this.alertMetrics.alerts_by_severity[severity] || 0) + 1; - + // Update rule count const ruleId = alert.rule_id; - this.alertMetrics.alerts_by_rule[ruleId] = + this.alertMetrics.alerts_by_rule[ruleId] = (this.alertMetrics.alerts_by_rule[ruleId] || 0) + 1; - + // Update frequency trend const now = new Date(); const existingTrend = this.alertMetrics.alert_frequency_trend.find( - t => t.timestamp.getHours() === now.getHours() + (t) => t.timestamp.getHours() === now.getHours(), ); - + if (existingTrend) { existingTrend.count++; } else { @@ -815,7 +858,7 @@ export class LogAlertService implements OnModuleInit { count: 1, }); } - + // Keep only last 24 hours of trend data if (this.alertMetrics.alert_frequency_trend.length > 24) { this.alertMetrics.alert_frequency_trend.shift(); @@ -826,7 +869,7 @@ export class LogAlertService implements OnModuleInit { @Cron(CronExpression.EVERY_HOUR) async cleanupOldAlerts(): Promise { const cutoffTime = new Date(Date.now() - 24 * 60 * 60 * 1000); // 24 hours ago - + for (const [alertId, alert] of this.activeAlerts.entries()) { if (alert.triggered_at < cutoffTime) { alert.status = 'resolved'; @@ -849,12 +892,15 @@ export class LogAlertService implements OnModuleInit { this.logger.log(`Alert rule created: ${rule.name}`); } - async updateAlertRule(ruleId: string, updates: Partial): Promise { + async updateAlertRule( + ruleId: string, + updates: Partial, + ): Promise { const existingRule = this.alertRules.get(ruleId); if (!existingRule) { throw new Error(`Alert rule ${ruleId} not found`); } - + const updatedRule = { ...existingRule, ...updates }; this.alertRules.set(ruleId, updatedRule); this.logger.log(`Alert rule updated: ${ruleId}`); @@ -865,7 +911,7 @@ export class LogAlertService implements OnModuleInit { if (!deleted) { throw new Error(`Alert rule ${ruleId} not found`); } - + this.logger.log(`Alert rule deleted: ${ruleId}`); } @@ -881,16 +927,19 @@ export class LogAlertService implements OnModuleInit { return this.alertHistory.slice(-limit); } - async acknowledgeAlert(alertId: string, acknowledgedBy: string): Promise { + async acknowledgeAlert( + alertId: string, + acknowledgedBy: string, + ): Promise { const alert = this.activeAlerts.get(alertId); if (!alert) { throw new Error(`Alert ${alertId} not found`); } - + alert.status = 'acknowledged'; alert.acknowledged_by = acknowledgedBy; alert.acknowledged_at = new Date(); - + this.logger.log(`Alert acknowledged: ${alertId} by ${acknowledgedBy}`); } @@ -899,12 +948,12 @@ export class LogAlertService implements OnModuleInit { if (!alert) { throw new Error(`Alert ${alertId} not found`); } - + alert.status = 'resolved'; alert.resolved_at = new Date(); this.activeAlerts.delete(alertId); this.alertMetrics.active_alerts--; - + this.logger.log(`Alert resolved: ${alertId}`); } @@ -917,7 +966,7 @@ export class LogAlertService implements OnModuleInit { if (!rule) { throw new Error(`Alert rule ${ruleId} not found`); } - + try { const shouldAlert = await this.evaluateRule(rule, new Date()); return shouldAlert; diff --git a/src/logging/elasticsearch/elasticsearch.module.ts b/src/logging/elasticsearch/elasticsearch.module.ts index 51dbff7..99bc5a0 100644 --- a/src/logging/elasticsearch/elasticsearch.module.ts +++ b/src/logging/elasticsearch/elasticsearch.module.ts @@ -21,7 +21,8 @@ import { ElasticsearchService } from './elasticsearch.service'; maxConnections: 100, compression: 'gzip', tls: { - rejectUnauthorized: process.env.ELASTICSEARCH_VERIFY_CERTS !== 'false', + rejectUnauthorized: + process.env.ELASTICSEARCH_VERIFY_CERTS !== 'false', }, }), }), diff --git a/src/logging/elasticsearch/elasticsearch.service.ts b/src/logging/elasticsearch/elasticsearch.service.ts index 68814a9..fb83c26 100644 --- a/src/logging/elasticsearch/elasticsearch.service.ts +++ b/src/logging/elasticsearch/elasticsearch.service.ts @@ -1,7 +1,10 @@ import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { Client } from '@elastic/elasticsearch'; -import { SearchResponse, SearchHit } from '@elastic/elasticsearch/lib/api/types'; +import { + SearchResponse, + SearchHit, +} from '@elastic/elasticsearch/lib/api/types'; export interface LogEntry { timestamp: Date; @@ -45,7 +48,11 @@ export interface LogAggregation { error_rate: number; average_response_time: number; top_errors: Array<{ error_name: string; count: number }>; - slow_requests: Array<{ url: string; avg_response_time: number; count: number }>; + slow_requests: Array<{ + url: string; + avg_response_time: number; + count: number; + }>; } export interface IndexMetrics { @@ -66,10 +73,12 @@ export class ElasticsearchService implements OnModuleInit { constructor(private configService: ConfigService) { this.client = new Client({ - node: this.configService.get('ELASTICSEARCH_NODE') || 'http://localhost:9200', + node: + this.configService.get('ELASTICSEARCH_NODE') || 'http://localhost:9200', auth: { username: this.configService.get('ELASTICSEARCH_USERNAME') || 'elastic', - password: this.configService.get('ELASTICSEARCH_PASSWORD') || 'changeme', + password: + this.configService.get('ELASTICSEARCH_PASSWORD') || 'changeme', }, maxRetries: this.maxRetries, requestTimeout: this.requestTimeout, @@ -78,7 +87,8 @@ export class ElasticsearchService implements OnModuleInit { sniffInterval: 300000, compression: 'gzip', tls: { - rejectUnauthorized: this.configService.get('ELASTICSEARCH_VERIFY_CERTS') !== 'false', + rejectUnauthorized: + this.configService.get('ELASTICSEARCH_VERIFY_CERTS') !== 'false', }, }); } @@ -87,13 +97,13 @@ export class ElasticsearchService implements OnModuleInit { try { await this.client.ping(); this.logger.log('Elasticsearch connection established'); - + // Create index template if it doesn't exist await this.createIndexTemplate(); - + // Create ILM policy if it doesn't exist await this.createILMPolicy(); - + this.logger.log('Elasticsearch service initialized successfully'); } catch (error) { this.logger.error('Failed to initialize Elasticsearch service', error); @@ -103,7 +113,7 @@ export class ElasticsearchService implements OnModuleInit { private async createIndexTemplate(): Promise { const templateName = 'currentdao-logs-template'; - + try { const exists = await this.client.indices.existsIndexTemplate({ name: templateName, @@ -134,7 +144,7 @@ export class ElasticsearchService implements OnModuleInit { properties: { '@timestamp': { type: 'date' }, timestamp: { type: 'date' }, - level: { + level: { type: 'keyword', fields: { text: { @@ -196,7 +206,7 @@ export class ElasticsearchService implements OnModuleInit { private async createILMPolicy(): Promise { const policyName = 'currentdao-logs-policy'; - + try { const exists = await this.client.ilm.lifecycle.get({ policy: policyName, @@ -248,7 +258,7 @@ export class ElasticsearchService implements OnModuleInit { async indexLog(logEntry: LogEntry): Promise { try { const indexName = `${this.indexPrefix}-${new Date().toISOString().split('T')[0]}`; - + await this.client.index({ index: indexName, body: { @@ -264,7 +274,7 @@ export class ElasticsearchService implements OnModuleInit { async indexLogs(logEntries: LogEntry[]): Promise { try { - const body = logEntries.flatMap(logEntry => [ + const body = logEntries.flatMap((logEntry) => [ { index: { _index: `${this.indexPrefix}-${new Date(logEntry.timestamp).toISOString().split('T')[0]}`, @@ -297,7 +307,7 @@ export class ElasticsearchService implements OnModuleInit { async searchLogs(searchQuery: SearchQuery): Promise { try { const esQuery = this.buildElasticsearchQuery(searchQuery); - + const response = await this.client.search({ index: `${this.indexPrefix}-*`, body: esQuery, @@ -364,7 +374,7 @@ export class ElasticsearchService implements OnModuleInit { if (searchQuery.end_time) { timeRange.lte = searchQuery.end_time.toISOString(); } - + query.query.bool.filter.push({ range: { '@timestamp': timeRange }, }); @@ -378,7 +388,10 @@ export class ElasticsearchService implements OnModuleInit { } // If no query specified, match all - if (query.query.bool.must.length === 0 && query.query.bool.filter.length === 0) { + if ( + query.query.bool.must.length === 0 && + query.query.bool.filter.length === 0 + ) { query.query = { match_all: {} }; } @@ -469,9 +482,13 @@ export class ElasticsearchService implements OnModuleInit { const totalLogs = response.hits.total?.value || 0; const logsByLevel = this.parseTermsAggregation(aggregations.logs_by_level); - const logsByService = this.parseTermsAggregation(aggregations.logs_by_service); - const logsByHour = this.parseDateHistogramAggregation(aggregations.logs_by_hour); - + const logsByService = this.parseTermsAggregation( + aggregations.logs_by_service, + ); + const logsByHour = this.parseDateHistogramAggregation( + aggregations.logs_by_hour, + ); + const errorBuckets = aggregations.error_rate.buckets; const errorCount = errorBuckets.errors.doc_count; const errorRate = totalLogs > 0 ? (errorCount / totalLogs) * 100 : 0; @@ -481,12 +498,14 @@ export class ElasticsearchService implements OnModuleInit { error_name: bucket.key, count: bucket.doc_count, })); - - const slowRequests = aggregations.slow_requests.buckets.map((bucket: any) => ({ - url: bucket.key, - avg_response_time: bucket.avg_response_time.value, - count: bucket.doc_count, - })); + + const slowRequests = aggregations.slow_requests.buckets.map( + (bucket: any) => ({ + url: bucket.key, + avg_response_time: bucket.avg_response_time.value, + count: bucket.doc_count, + }), + ); return { total_logs: totalLogs, diff --git a/src/logging/logging.module.ts b/src/logging/logging.module.ts index bc26db6..c2316d7 100644 --- a/src/logging/logging.module.ts +++ b/src/logging/logging.module.ts @@ -4,6 +4,7 @@ import { ElasticsearchModule } from './elasticsearch/elasticsearch.module'; import { LogParserService } from './parsing/log-parser.service'; import { RetentionPolicyService } from './retention/retention-policy.service'; import { LogAlertService } from './alerts/log-alert.service'; +import { LoggingService } from './logging.service'; export interface LoggingConfig { elasticsearch: { @@ -26,16 +27,15 @@ export interface LoggingConfig { } @Module({ - imports: [ - ConfigModule, - ElasticsearchModule, - ], + imports: [ConfigModule, ElasticsearchModule], providers: [ + LoggingService, LogParserService, RetentionPolicyService, LogAlertService, ], exports: [ + LoggingService, ElasticsearchModule, LogParserService, RetentionPolicyService, diff --git a/src/logging/logging.service.ts b/src/logging/logging.service.ts index 2c7e2db..7681862 100644 --- a/src/logging/logging.service.ts +++ b/src/logging/logging.service.ts @@ -1,7 +1,19 @@ -import { Injectable, Logger, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { + Injectable, + Logger, + OnModuleInit, + OnModuleDestroy, +} from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; -import { ElasticsearchService, LogEntry } from './elasticsearch/elasticsearch.service'; -import { LogParserService, ParsedLogEntry, ParseResult } from './parsing/log-parser.service'; +import { + ElasticsearchService, + LogEntry, +} from './elasticsearch/elasticsearch.service'; +import { + LogParserService, + ParsedLogEntry, + ParseResult, +} from './parsing/log-parser.service'; import { LogAlertService } from './alerts/log-alert.service'; import { RetentionPolicyService } from './retention/retention-policy.service'; @@ -48,27 +60,27 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { async onModuleInit() { this.logger.log('Initializing logging service'); - + // Start periodic flush this.startPeriodicFlush(); - + // Set up process error handlers this.setupErrorHandlers(); - + this.logger.log('Logging service initialized'); } async onModuleDestroy() { this.isShuttingDown = true; - + // Clear flush timer if (this.flushTimer) { clearInterval(this.flushTimer); } - + // Flush remaining logs await this.flushLogs(); - + this.logger.log('Logging service shutdown complete'); } @@ -106,36 +118,65 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { }); } - async debug(message: string, metadata?: any, options?: LogOptions): Promise { + async debug( + message: string, + metadata?: any, + options?: LogOptions, + ): Promise { await this.log('debug', message, metadata, options); } - async info(message: string, metadata?: any, options?: LogOptions): Promise { + async info( + message: string, + metadata?: any, + options?: LogOptions, + ): Promise { await this.log('info', message, metadata, options); } - async warn(message: string, metadata?: any, options?: LogOptions): Promise { + async warn( + message: string, + metadata?: any, + options?: LogOptions, + ): Promise { await this.log('warn', message, metadata, options); } - async error(message: string, error?: any, options?: LogOptions): Promise { - const errorMetadata = error ? { - error_name: error.name || 'UnknownError', - error_message: error.message || message, - error_stack: error.stack, - ...error, - } : {}; + async error( + message: string, + error?: any, + options?: LogOptions, + ): Promise { + const errorMetadata = error + ? { + error_name: error.name || 'UnknownError', + error_message: error.message || message, + error_stack: error.stack, + ...error, + } + : {}; await this.log('error', message, errorMetadata, options); } - private async log(level: string, message: string, metadata?: any, options?: LogOptions): Promise { + private async log( + level: string, + message: string, + metadata?: any, + options?: LogOptions, + ): Promise { const logEntry: LogEntry = { timestamp: new Date(), level: options?.level || level, message, - service_name: options?.context?.service_name || this.configService.get('SERVICE_NAME') || 'currentdao-backend', - environment: options?.context?.environment || this.configService.get('NODE_ENV') || 'development', + service_name: + options?.context?.service_name || + this.configService.get('SERVICE_NAME') || + 'currentdao-backend', + environment: + options?.context?.environment || + this.configService.get('NODE_ENV') || + 'development', request_id: options?.context?.request_id, response_time: metadata?.response_time, memory_usage: metadata?.memory_usage, @@ -155,7 +196,10 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { this.logBuffer.push(logEntry); // Flush immediately if buffer is full or critical error - if (this.logBuffer.length >= this.bufferSize || (level === 'error' && options?.alert_immediately)) { + if ( + this.logBuffer.length >= this.bufferSize || + (level === 'error' && options?.alert_immediately) + ) { await this.flushLogs(); } @@ -167,7 +211,7 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { private logToConsole(level: string, message: string, metadata?: any): void { const logMessage = `[${new Date().toISOString()}] ${level.toUpperCase()}: ${message}`; - + switch (level) { case 'debug': this.logger.debug(logMessage, metadata); @@ -195,14 +239,14 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { try { // Parse logs if needed const parsedLogs: ParsedLogEntry[] = []; - + for (const log of logsToFlush) { if (log.metadata?.parse_immediately) { const result = await this.logParserService.parseLogEntry( JSON.stringify(log), - log.metadata?.context + log.metadata?.context, ); - + if (result.success && result.parsed_entry) { parsedLogs.push(result.parsed_entry); } @@ -227,10 +271,9 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { // Alert checking is handled by the alert service monitoring } } - } catch (error) { this.logger.error('Failed to flush logs to Elasticsearch', error); - + // Re-add failed logs to buffer for retry (with limit) const retryLogs = logsToFlush.slice(-10); // Keep only last 10 for retry this.logBuffer.unshift(...retryLogs); @@ -297,48 +340,59 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { statusCode: number, responseTime: number, context?: Partial, - metadata?: any + metadata?: any, ): Promise { - const level = statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'; - - await this.log(level, `HTTP ${method} ${url} - ${statusCode}`, { - request_method: method, - request_url: url, - status_code: statusCode, - response_time: responseTime, - ...metadata, - }, { - context: { - service_name: 'currentdao-backend', - environment: this.configService.get('NODE_ENV') || 'development', - ...context, + const level = + statusCode >= 500 ? 'error' : statusCode >= 400 ? 'warn' : 'info'; + + await this.log( + level, + `HTTP ${method} ${url} - ${statusCode}`, + { + request_method: method, + request_url: url, + status_code: statusCode, + response_time: responseTime, + ...metadata, }, - tags: ['http-request', `status-${statusCode}`], - parse_immediately: true, - }); + { + context: { + service_name: 'currentdao-backend', + environment: this.configService.get('NODE_ENV') || 'development', + ...context, + }, + tags: ['http-request', `status-${statusCode}`], + parse_immediately: true, + }, + ); } async logDatabaseQuery( query: string, duration: number, error?: any, - context?: Partial + context?: Partial, ): Promise { const level = error ? 'error' : duration > 1000 ? 'warn' : 'info'; - - await this.log(level, `Database query executed in ${duration}ms`, { - database_query: query, - database_duration: duration, - ...error, - }, { - context: { - service_name: 'currentdao-backend', - environment: this.configService.get('NODE_ENV') || 'development', - ...context, + + await this.log( + level, + `Database query executed in ${duration}ms`, + { + database_query: query, + database_duration: duration, + ...error, }, - tags: ['database', 'query'], - parse_immediately: true, - }); + { + context: { + service_name: 'currentdao-backend', + environment: this.configService.get('NODE_ENV') || 'development', + ...context, + }, + tags: ['database', 'query'], + parse_immediately: true, + }, + ); } async logBlockchainTransaction( @@ -347,51 +401,63 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { status: string, gasUsed?: number, error?: any, - context?: Partial + context?: Partial, ): Promise { - const level = status === 'failed' ? 'error' : status === 'pending' ? 'info' : 'info'; - - await this.log(level, `Blockchain transaction ${txHash} - ${status}`, { - tx_hash: txHash, - tx_type: txType, - tx_status: status, - gas_used: gasUsed, - ...error, - }, { - context: { - service_name: 'currentdao-backend', - environment: this.configService.get('NODE_ENV') || 'development', - blockchain_tx_hash: txHash, - ...context, + const level = + status === 'failed' ? 'error' : status === 'pending' ? 'info' : 'info'; + + await this.log( + level, + `Blockchain transaction ${txHash} - ${status}`, + { + tx_hash: txHash, + tx_type: txType, + tx_status: status, + gas_used: gasUsed, + ...error, }, - tags: ['blockchain', 'transaction', txType, status], - parse_immediately: true, - alert_immediately: status === 'failed', - }); + { + context: { + service_name: 'currentdao-backend', + environment: this.configService.get('NODE_ENV') || 'development', + blockchain_tx_hash: txHash, + ...context, + }, + tags: ['blockchain', 'transaction', txType, status], + parse_immediately: true, + alert_immediately: status === 'failed', + }, + ); } async logSecurityEvent( event: string, severity: 'low' | 'medium' | 'high' | 'critical', details?: any, - context?: Partial + context?: Partial, ): Promise { - const level = severity === 'critical' ? 'error' : severity === 'high' ? 'warn' : 'info'; - - await this.log(level, `Security event: ${event}`, { - security_event: event, - security_severity: severity, - ...details, - }, { - context: { - service_name: 'currentdao-backend', - environment: this.configService.get('NODE_ENV') || 'development', - ...context, + const level = + severity === 'critical' ? 'error' : severity === 'high' ? 'warn' : 'info'; + + await this.log( + level, + `Security event: ${event}`, + { + security_event: event, + security_severity: severity, + ...details, }, - tags: ['security', event, severity], - parse_immediately: true, - alert_immediately: ['high', 'critical'].includes(severity), - }); + { + context: { + service_name: 'currentdao-backend', + environment: this.configService.get('NODE_ENV') || 'development', + ...context, + }, + tags: ['security', event, severity], + parse_immediately: true, + alert_immediately: ['high', 'critical'].includes(severity), + }, + ); } async logPerformanceMetrics( @@ -402,7 +468,7 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { throughput?: number; error_rate?: number; }, - context?: Partial + context?: Partial, ): Promise { await this.info('Performance metrics collected', metrics, { context: { @@ -441,9 +507,13 @@ export class LoggingService implements OnModuleInit, OnModuleDestroy { } async testLogging(): Promise { - await this.info('Test log message', { test: true }, { - tags: ['test'], - parse_immediately: true, - }); + await this.info( + 'Test log message', + { test: true }, + { + tags: ['test'], + parse_immediately: true, + }, + ); } } diff --git a/src/logging/parsing/log-parser.service.ts b/src/logging/parsing/log-parser.service.ts index 6364c83..14887be 100644 --- a/src/logging/parsing/log-parser.service.ts +++ b/src/logging/parsing/log-parser.service.ts @@ -1,5 +1,8 @@ import { Injectable, Logger } from '@nestjs/common'; -import { ElasticsearchService, LogEntry } from '../elasticsearch/elasticsearch.service'; +import { + ElasticsearchService, + LogEntry, +} from '../elasticsearch/elasticsearch.service'; export interface ParsedLogEntry extends LogEntry { parsed_fields: { @@ -59,22 +62,26 @@ export class LogParserService { private readonly patterns = { // Application logs: [2024-03-29T10:30:45.123Z] INFO [UserService] [req-123] User login successful application: /^\[([^\]]+)\]\s+(\w+)\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+(.+)$/, - + // HTTP access logs: 192.168.1.1 - - [29/Mar/2024:10:30:45 +0000] "GET /api/users HTTP/1.1" 200 1234 - access: /^(\S+)\s+\S+\s+\S+\s+\[([^\]]+)\]\s+"(\S+)\s+(\S+)\s+[^"]*"\s+(\d+)\s+(\d+)$/, - + access: + /^(\S+)\s+\S+\s+\S+\s+\[([^\]]+)\]\s+"(\S+)\s+(\S+)\s+[^"]*"\s+(\d+)\s+(\d+)$/, + // Database logs: [2024-03-29T10:30:45.123Z] [DB] Query executed in 45ms: SELECT * FROM users WHERE id = ? database: /^\[([^\]]+)\]\s+\[DB\]\s+Query executed in (\d+)ms:\s+(.+)$/, - + // Error logs: [2024-03-29T10:30:45.123Z] ERROR [UserService] [req-123] [TypeError] Cannot read property 'id' of undefined at UserService.getUser (user.service.ts:45:12) - error: /^\[([^\]]+)\]\s+ERROR\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+(.+)$/, - + error: + /^\[([^\]]+)\]\s+ERROR\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+(.+)$/, + // Blockchain logs: [2024-03-29T10:30:45.123Z] [Blockchain] [tx-abc123] Transaction submitted: hash=0x123..., contract=0x456..., gas=21000 - blockchain: /^\[([^\]]+)\]\s+\[Blockchain\]\s+\[([^\]]+)\]\s+Transaction submitted:\s+hash=([^,]+),\s+contract=([^,]+),\s+gas=(\d+)$/, - + blockchain: + /^\[([^\]]+)\]\s+\[Blockchain\]\s+\[([^\]]+)\]\s+Transaction submitted:\s+hash=([^,]+),\s+contract=([^,]+),\s+gas=(\d+)$/, + // Performance logs: [2024-03-29T10:30:45.123Z] PERF [API] [req-123] Response time: 150ms, Memory: 45MB, CPU: 25% - performance: /^\[([^\]]+)\]\s+PERF\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+Response time:\s+(\d+)ms,\s+Memory:\s+(\d+)MB,\s+CPU:\s+(\d+)%$/, - + performance: + /^\[([^\]]+)\]\s+PERF\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+Response time:\s+(\d+)ms,\s+Memory:\s+(\d+)MB,\s+CPU:\s+(\d+)%$/, + // Security logs: [2024-03-29T10:30:45.123Z] SECURITY [Auth] [req-123] Failed login attempt for user@example.com from 192.168.1.1 security: /^\[([^\]]+)\]\s+SECURITY\s+\[([^\]]+)\]\s+\[([^\]]+)\]\s+(.+)$/, }; @@ -89,13 +96,13 @@ export class LogParserService { async parseLogEntry(rawLog: string, context?: any): Promise { const startTime = Date.now(); - + try { this.parsingMetrics.total_parsed++; - + // Try to parse with different patterns let parsedEntry: ParsedLogEntry | null = null; - + // Try JSON parsing first if (this.isJsonString(rawLog)) { parsedEntry = await this.parseJsonLog(rawLog, context); @@ -103,22 +110,22 @@ export class LogParserService { // Try regex patterns parsedEntry = await this.parseWithPatterns(rawLog, context); } - + if (parsedEntry) { // Enhance with extracted information parsedEntry = await this.enhanceParsedEntry(parsedEntry, rawLog); - + // Calculate severity score parsedEntry.severity_score = this.calculateSeverityScore(parsedEntry); - + // Categorize the log parsedEntry.categorized_as = this.categorizeLog(parsedEntry); - + this.parsingMetrics.successful_parses++; - + const processingTime = Date.now() - startTime; this.updateProcessingTimeMetrics(processingTime); - + return { success: true, parsed_entry: parsedEntry, @@ -127,12 +134,12 @@ export class LogParserService { } else { // Fallback parsing parsedEntry = this.createFallbackEntry(rawLog, context); - + this.parsingMetrics.successful_parses++; - + const processingTime = Date.now() - startTime; this.updateProcessingTimeMetrics(processingTime); - + return { success: true, parsed_entry: parsedEntry, @@ -141,12 +148,12 @@ export class LogParserService { } } catch (error) { this.parsingMetrics.failed_parses++; - + const processingTime = Date.now() - startTime; this.updateProcessingTimeMetrics(processingTime); - + this.logger.error('Failed to parse log entry', error); - + return { success: false, error: error.message, @@ -155,16 +162,21 @@ export class LogParserService { } } - private async parseJsonLog(rawLog: string, context?: any): Promise { + private async parseJsonLog( + rawLog: string, + context?: any, + ): Promise { try { const jsonData = JSON.parse(rawLog); - + const parsedEntry: ParsedLogEntry = { timestamp: new Date(jsonData.timestamp || Date.now()), level: jsonData.level || 'info', message: jsonData.message || rawLog, - service_name: jsonData.service_name || context?.service_name || 'unknown', - environment: jsonData.environment || context?.environment || 'development', + service_name: + jsonData.service_name || context?.service_name || 'unknown', + environment: + jsonData.environment || context?.environment || 'development', parsed_fields: {}, extracted_tags: [], severity_score: 0, @@ -194,10 +206,13 @@ export class LogParserService { } if (jsonData.blockchain) { - parsedEntry.parsed_fields.blockchain_tx_hash = jsonData.blockchain.tx_hash; - parsedEntry.parsed_fields.contract_address = jsonData.blockchain.contract_address; + parsedEntry.parsed_fields.blockchain_tx_hash = + jsonData.blockchain.tx_hash; + parsedEntry.parsed_fields.contract_address = + jsonData.blockchain.contract_address; parsedEntry.parsed_fields.gas_used = jsonData.blockchain.gas_used; - parsedEntry.parsed_fields.block_number = jsonData.blockchain.block_number; + parsedEntry.parsed_fields.block_number = + jsonData.blockchain.block_number; parsedEntry.tx_hash = jsonData.blockchain.tx_hash; parsedEntry.tx_type = jsonData.blockchain.tx_type; parsedEntry.tx_status = jsonData.blockchain.tx_status; @@ -219,7 +234,10 @@ export class LogParserService { } } - private async parseWithPatterns(rawLog: string, context?: any): Promise { + private async parseWithPatterns( + rawLog: string, + context?: any, + ): Promise { const patterns = [ { type: 'error', pattern: this.patterns.error }, { type: 'blockchain', pattern: this.patterns.blockchain }, @@ -315,7 +333,10 @@ export class LogParserService { return baseEntry; } - private async enhanceParsedEntry(entry: ParsedLogEntry, rawLog: string): Promise { + private async enhanceParsedEntry( + entry: ParsedLogEntry, + rawLog: string, + ): Promise { // Extract IP addresses const ipMatches = rawLog.match(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g); if (ipMatches) { @@ -329,7 +350,9 @@ export class LogParserService { } // Extract session IDs - const sessionMatches = rawLog.match(/session[_\s-]?id[:\s=]+([a-zA-Z0-9-]+)/i); + const sessionMatches = rawLog.match( + /session[_\s-]?id[:\s=]+([a-zA-Z0-9-]+)/i, + ); if (sessionMatches) { entry.parsed_fields.session_id = sessionMatches[1]; } @@ -419,13 +442,19 @@ export class LogParserService { // Message-based categorization const message = entry.message.toLowerCase(); - if (message.includes('login') || message.includes('auth')) categories.push('authentication'); - if (message.includes('transaction') || message.includes('tx')) categories.push('transaction'); + if (message.includes('login') || message.includes('auth')) + categories.push('authentication'); + if (message.includes('transaction') || message.includes('tx')) + categories.push('transaction'); if (message.includes('contract')) categories.push('smart-contract'); - if (message.includes('error') || message.includes('exception')) categories.push('error'); - if (message.includes('security') || message.includes('unauthorized')) categories.push('security'); - if (message.includes('performance') || message.includes('slow')) categories.push('performance'); - if (message.includes('database') || message.includes('sql')) categories.push('database'); + if (message.includes('error') || message.includes('exception')) + categories.push('error'); + if (message.includes('security') || message.includes('unauthorized')) + categories.push('security'); + if (message.includes('performance') || message.includes('slow')) + categories.push('performance'); + if (message.includes('database') || message.includes('sql')) + categories.push('database'); // Request-based categorization if (entry.parsed_fields.method) { @@ -502,21 +531,25 @@ export class LogParserService { private updateProcessingTimeMetrics(processingTime: number): void { const currentAvg = this.parsingMetrics.average_processing_time; - const totalProcessed = this.parsingMetrics.successful_parses + this.parsingMetrics.failed_parses; - - this.parsingMetrics.average_processing_time = + const totalProcessed = + this.parsingMetrics.successful_parses + this.parsingMetrics.failed_parses; + + this.parsingMetrics.average_processing_time = (currentAvg * (totalProcessed - 1) + processingTime) / totalProcessed; } // Public API methods - async parseBatchLogs(rawLogs: string[], context?: any): Promise { + async parseBatchLogs( + rawLogs: string[], + context?: any, + ): Promise { const results: ParseResult[] = []; - + for (const rawLog of rawLogs) { const result = await this.parseLogEntry(rawLog, context); results.push(result); } - + return results; } diff --git a/src/logging/retention/retention-policy.service.ts b/src/logging/retention/retention-policy.service.ts index c34b447..62407a9 100644 --- a/src/logging/retention/retention-policy.service.ts +++ b/src/logging/retention/retention-policy.service.ts @@ -67,13 +67,13 @@ export class RetentionPolicyService implements OnModuleInit { async onModuleInit() { this.logger.log('Initializing retention policy service'); - + // Create default retention policies await this.createDefaultPolicies(); - + // Initialize metrics await this.updateRetentionMetrics(); - + this.logger.log('Retention policy service initialized'); } @@ -135,7 +135,10 @@ export class RetentionPolicyService implements OnModuleInit { try { await this.createRetentionPolicy(policy); } catch (error) { - this.logger.error(`Failed to create retention policy ${policy.name}`, error); + this.logger.error( + `Failed to create retention policy ${policy.name}`, + error, + ); } } } @@ -182,12 +185,17 @@ export class RetentionPolicyService implements OnModuleInit { this.logger.log(`Retention policy ${policy.name} created successfully`); } catch (error) { - this.logger.error(`Failed to create retention policy ${policy.name}`, error); + this.logger.error( + `Failed to create retention policy ${policy.name}`, + error, + ); throw error; } } - async applyRetentionPolicy(policyName: string): Promise { + async applyRetentionPolicy( + policyName: string, + ): Promise { const startTime = Date.now(); const result: RetentionPolicyResult = { policy_name: policyName, @@ -207,7 +215,7 @@ export class RetentionPolicyService implements OnModuleInit { // Get indices matching the policy pattern const indices = await this.getIndicesByPattern(policy.pattern); - + for (const index of indices) { try { const indexResult = await this.processIndex(index, policy); @@ -215,24 +223,35 @@ export class RetentionPolicyService implements OnModuleInit { result.documents_deleted += indexResult.documents_deleted; result.space_freed_mb += indexResult.space_freed_mb; } catch (error) { - result.errors.push(`Failed to process index ${index}: ${error.message}`); + result.errors.push( + `Failed to process index ${index}: ${error.message}`, + ); } } result.processing_time_ms = Date.now() - startTime; - - this.logger.log(`Retention policy ${policyName} applied successfully`, result); + + this.logger.log( + `Retention policy ${policyName} applied successfully`, + result, + ); return result; } catch (error) { result.processing_time_ms = Date.now() - startTime; result.errors.push(error.message); - - this.logger.error(`Failed to apply retention policy ${policyName}`, error); + + this.logger.error( + `Failed to apply retention policy ${policyName}`, + error, + ); return result; } } - private async processIndex(indexName: string, policy: RetentionPolicy): Promise<{ documents_deleted: number; space_freed_mb: number }> { + private async processIndex( + indexName: string, + policy: RetentionPolicy, + ): Promise<{ documents_deleted: number; space_freed_mb: number }> { const startTime = Date.now(); let documentsDeleted = 0; let spaceFreedMb = 0; @@ -240,19 +259,26 @@ export class RetentionPolicyService implements OnModuleInit { try { // Get index stats before processing const statsBefore = await this.getIndexStats(indexName); - + // Apply retention conditions if (policy.conditions) { for (const condition of policy.conditions) { - const deletionResult = await this.applyCondition(indexName, condition); + const deletionResult = await this.applyCondition( + indexName, + condition, + ); documentsDeleted += deletionResult.documents_deleted; } } // Check if index should be deleted based on age const indexAge = await this.getIndexAge(indexName); - const maxAge = policy.hot_phase_days + policy.warm_phase_days + policy.cold_phase_days + policy.delete_phase_days; - + const maxAge = + policy.hot_phase_days + + policy.warm_phase_days + + policy.cold_phase_days + + policy.delete_phase_days; + if (indexAge > maxAge) { await this.deleteIndex(indexName); documentsDeleted += statsBefore.doc_count; @@ -264,14 +290,20 @@ export class RetentionPolicyService implements OnModuleInit { } } - return { documents_deleted: documentsDeleted, space_freed_mb: spaceFreedMb }; + return { + documents_deleted: documentsDeleted, + space_freed_mb: spaceFreedMb, + }; } catch (error) { this.logger.error(`Failed to process index ${indexName}`, error); throw error; } } - private async applyCondition(indexName: string, condition: RetentionCondition): Promise<{ documents_deleted: number }> { + private async applyCondition( + indexName: string, + condition: RetentionCondition, + ): Promise<{ documents_deleted: number }> { try { let query: any = {}; @@ -280,7 +312,11 @@ export class RetentionPolicyService implements OnModuleInit { query = { term: { [condition.field]: condition.value } }; break; case 'ne': - query = { bool: { must_not: { term: { [condition.field]: condition.value } } } }; + query = { + bool: { + must_not: { term: { [condition.field]: condition.value } }, + }, + }; break; case 'gt': query = { range: { [condition.field]: { gt: condition.value } } }; @@ -292,7 +328,9 @@ export class RetentionPolicyService implements OnModuleInit { query = { exists: { field: condition.field } }; break; case 'not_exists': - query = { bool: { must_not: { exists: { field: condition.field } } } }; + query = { + bool: { must_not: { exists: { field: condition.field } } }, + }; break; } @@ -311,12 +349,18 @@ export class RetentionPolicyService implements OnModuleInit { return { documents_deleted: 0 }; } catch (error) { - this.logger.error(`Failed to apply condition on index ${indexName}`, error); + this.logger.error( + `Failed to apply condition on index ${indexName}`, + error, + ); throw error; } } - private async deleteByQuery(indexName: string, query: any): Promise<{ deleted: number }> { + private async deleteByQuery( + indexName: string, + query: any, + ): Promise<{ deleted: number }> { const response = await this.elasticsearchService.getClient().deleteByQuery({ index: indexName, body: { query }, @@ -329,7 +373,7 @@ export class RetentionPolicyService implements OnModuleInit { private async archiveDocuments(indexName: string, query: any): Promise { // Create archive index name const archiveIndex = `${indexName}-archive-${new Date().toISOString().split('T')[0]}`; - + // Reindex documents to archive index await this.elasticsearchService.getClient().reindex({ body: { @@ -342,7 +386,10 @@ export class RetentionPolicyService implements OnModuleInit { await this.deleteByQuery(indexName, query); } - private async compressDocuments(indexName: string, query: any): Promise { + private async compressDocuments( + indexName: string, + query: any, + ): Promise { // Force merge to reduce segments await this.elasticsearchService.getClient().indices.forcemerge({ index: indexName, @@ -366,10 +413,12 @@ export class RetentionPolicyService implements OnModuleInit { private async getIndexStats(indexName: string): Promise { try { - const response = await this.elasticsearchService.getClient().indices.stats({ - index: indexName, - }); - + const response = await this.elasticsearchService + .getClient() + .indices.stats({ + index: indexName, + }); + return response.indices[indexName]; } catch (error) { this.logger.error(`Failed to get stats for index ${indexName}`, error); @@ -379,13 +428,15 @@ export class RetentionPolicyService implements OnModuleInit { private async getIndexAge(indexName: string): Promise { try { - const response = await this.elasticsearchService.getClient().indices.getSettings({ - index: indexName, - }); + const response = await this.elasticsearchService + .getClient() + .indices.getSettings({ + index: indexName, + }); const creationDate = response[indexName].settings.index.creation_date; const now = Date.now(); - + return Math.floor((now - creationDate) / (1000 * 60 * 60 * 24)); // days } catch (error) { this.logger.error(`Failed to get age for index ${indexName}`, error); @@ -398,7 +449,7 @@ export class RetentionPolicyService implements OnModuleInit { await this.elasticsearchService.getClient().indices.delete({ index: indexName, }); - + this.logger.log(`Index ${indexName} deleted successfully`); } catch (error) { this.logger.error(`Failed to delete index ${indexName}`, error); @@ -412,7 +463,7 @@ export class RetentionPolicyService implements OnModuleInit { index: indexName, max_num_segments: 1, }); - + this.logger.log(`Index ${indexName} optimized successfully`); } catch (error) { this.logger.error(`Failed to optimize index ${indexName}`, error); @@ -423,7 +474,7 @@ export class RetentionPolicyService implements OnModuleInit { private convertBytesToMB(bytes: string): number { const value = parseFloat(bytes.replace(/[^\d.]/g, '')); const unit = bytes.replace(/[\d.]/g, '').toLowerCase(); - + switch (unit) { case 'kb': return value / 1024; @@ -439,14 +490,21 @@ export class RetentionPolicyService implements OnModuleInit { } } - async getRetentionPolicy(policyName: string): Promise { + async getRetentionPolicy( + policyName: string, + ): Promise { try { - const response = await this.elasticsearchService.getClient().ilm.lifecycle.get({ - policy: policyName, - }); + const response = await this.elasticsearchService + .getClient() + .ilm.lifecycle.get({ + policy: policyName, + }); if (response[policyName]) { - return this.parseILMPolicyToRetentionPolicy(policyName, response[policyName]); + return this.parseILMPolicyToRetentionPolicy( + policyName, + response[policyName], + ); } return null; @@ -456,9 +514,12 @@ export class RetentionPolicyService implements OnModuleInit { } } - private parseILMPolicyToRetentionPolicy(policyName: string, ilmPolicy: any): RetentionPolicy { + private parseILMPolicyToRetentionPolicy( + policyName: string, + ilmPolicy: any, + ): RetentionPolicy { const phases = ilmPolicy.policy.phases; - + return { name: policyName, pattern: '', // Not stored in ILM policy @@ -471,7 +532,7 @@ export class RetentionPolicyService implements OnModuleInit { private extractDaysFromPhase(phase: any): number { if (!phase || !phase.min_age) return 0; - + const ageStr = phase.min_age; const match = ageStr.match(/(\d+)d/); return match ? parseInt(match[1]) : 0; @@ -479,26 +540,26 @@ export class RetentionPolicyService implements OnModuleInit { async getAllRetentionPolicies(): Promise { const policies: RetentionPolicy[] = []; - + for (const defaultPolicy of this.defaultPolicies) { const policy = await this.getRetentionPolicy(defaultPolicy.name); if (policy) { policies.push(policy); } } - + return policies; } async updateRetentionMetrics(): Promise { try { const indices = await this.elasticsearchService.getIndexMetrics(); - + let totalDocuments = 0; let totalStorageGB = 0; const indicesByPhase: Record = {}; const storageByPhase: Record = {}; - + let oldestIndex = ''; let newestIndex = ''; let oldestDate = new Date(); @@ -507,12 +568,14 @@ export class RetentionPolicyService implements OnModuleInit { for (const index of indices) { totalDocuments += index.doc_count; totalStorageGB += this.convertBytesToGB(index.store_size); - + // Determine phase based on index name pattern const phase = this.determineIndexPhase(index.index_name); indicesByPhase[phase] = (indicesByPhase[phase] || 0) + 1; - storageByPhase[phase] = (storageByPhase[phase] || 0) + this.convertBytesToGB(index.store_size); - + storageByPhase[phase] = + (storageByPhase[phase] || 0) + + this.convertBytesToGB(index.store_size); + // Track oldest and newest indices const indexDate = this.extractDateFromIndexName(index.index_name); if (indexDate < oldestDate) { @@ -571,18 +634,20 @@ export class RetentionPolicyService implements OnModuleInit { async getStorageForecast(): Promise { try { const currentMetrics = await this.getRetentionMetrics(); - + // Get historical data for growth calculation const growthRate = await this.calculateGrowthRate(); - + const currentStorage = currentMetrics.total_storage_gb; const projected30Days = currentStorage * (1 + (growthRate / 100) * 30); const projected90Days = currentStorage * (1 + (growthRate / 100) * 90); - + // Calculate recommended retention days based on storage constraints const maxStorageGB = this.configService.get('MAX_LOG_STORAGE_GB') || 1000; - const recommendedRetentionDays = Math.floor((maxStorageGB / currentStorage) * 90); - + const recommendedRetentionDays = Math.floor( + (maxStorageGB / currentStorage) * 90, + ); + // Calculate cost impact (simplified) const costPerGB = this.configService.get('STORAGE_COST_PER_GB') || 0.023; // AWS approximate const costImpact = (projected90Days - currentStorage) * costPerGB; @@ -592,7 +657,10 @@ export class RetentionPolicyService implements OnModuleInit { projected_30_days: projected30Days, projected_90_days: projected90Days, growth_rate_percent: growthRate, - recommended_retention_days: Math.max(30, Math.min(365, recommendedRetentionDays)), + recommended_retention_days: Math.max( + 30, + Math.min(365, recommendedRetentionDays), + ), cost_impact: costImpact, }; } catch (error) { @@ -606,9 +674,9 @@ export class RetentionPolicyService implements OnModuleInit { // Get storage data for the last 7 days const sevenDaysAgo = new Date(); sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7); - + const indices = await this.getIndicesByPattern('currentdao-logs-*'); - const recentIndices = indices.filter(index => { + const recentIndices = indices.filter((index) => { const indexDate = this.extractDateFromIndexName(index); return indexDate >= sevenDaysAgo; }); @@ -619,18 +687,19 @@ export class RetentionPolicyService implements OnModuleInit { // Calculate growth based on recent indices const storageData = await Promise.all( - recentIndices.map(async index => { + recentIndices.map(async (index) => { const stats = await this.getIndexStats(index); return this.convertBytesToGB(stats.store_size); - }) + }), ); const oldestStorage = storageData[0]; const newestStorage = storageData[storageData.length - 1]; - + if (oldestStorage === 0) return 5; - - const growthRate = ((newestStorage - oldestStorage) / oldestStorage) * 100; + + const growthRate = + ((newestStorage - oldestStorage) / oldestStorage) * 100; return Math.max(0, growthRate); } catch (error) { this.logger.error('Failed to calculate growth rate', error); @@ -642,21 +711,24 @@ export class RetentionPolicyService implements OnModuleInit { @Cron(CronExpression.EVERY_HOUR) async scheduledCleanup(): Promise { this.logger.log('Starting scheduled retention cleanup'); - + try { const policies = await this.getAllRetentionPolicies(); - + for (const policy of policies) { try { await this.applyRetentionPolicy(policy.name); } catch (error) { - this.logger.error(`Failed to apply policy ${policy.name} in scheduled cleanup`, error); + this.logger.error( + `Failed to apply policy ${policy.name} in scheduled cleanup`, + error, + ); } } - + // Update metrics after cleanup await this.updateRetentionMetrics(); - + this.logger.log('Scheduled retention cleanup completed'); } catch (error) { this.logger.error('Scheduled retention cleanup failed', error); @@ -673,17 +745,20 @@ export class RetentionPolicyService implements OnModuleInit { await this.elasticsearchService.getClient().ilm.lifecycle.delete({ policy: policyName, }); - + this.logger.log(`Retention policy ${policyName} deleted successfully`); } catch (error) { - this.logger.error(`Failed to delete retention policy ${policyName}`, error); + this.logger.error( + `Failed to delete retention policy ${policyName}`, + error, + ); throw error; } } async forceCleanup(policyName?: string): Promise { const results: RetentionPolicyResult[] = []; - + if (policyName) { const result = await this.applyRetentionPolicy(policyName); results.push(result); @@ -694,7 +769,7 @@ export class RetentionPolicyService implements OnModuleInit { results.push(result); } } - + return results; } } diff --git a/src/main.ts b/src/main.ts index 034a5c8..1e5212a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -71,9 +71,6 @@ async function bootstrap() { logger.log(`Server successfully started on port ${port}`); - - - logger.log(`Application is running on: http://localhost:${port}`); logger.log(`API documentation: http://localhost:${port}/api/docs`); logger.log(`API endpoint: http://localhost:${port}/api`); diff --git a/src/matching/algorithms/geographic-matching.algorithm.ts b/src/matching/algorithms/geographic-matching.algorithm.ts index 2280721..8f97d26 100644 --- a/src/matching/algorithms/geographic-matching.algorithm.ts +++ b/src/matching/algorithms/geographic-matching.algorithm.ts @@ -2,7 +2,10 @@ import { Injectable, Logger } from '@nestjs/common'; import { Order } from '../../modules/energy/entities/order.entity'; import { Match, MatchStatus, MatchType } from '../entities/match.entity'; import { MatchingRule, RuleType } from '../entities/matching-rule.entity'; -import { MatchingPreferencesDto, GeographicScope } from '../dto/matching-preferences.dto'; +import { + MatchingPreferencesDto, + GeographicScope, +} from '../dto/matching-preferences.dto'; export interface GeographicMatchResult { matches: Match[]; @@ -41,25 +44,43 @@ export class GeographicMatchingAlgorithm { preferences: MatchingPreferencesDto, ): Promise { const startTime = Date.now(); - - this.logger.log(`Starting geographic matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`); - const filteredBuyOrders = this.filterOrdersByGeography(buyOrders, preferences); - const filteredSellOrders = this.filterOrdersByGeography(sellOrders, preferences); - - const clusters = this.createGeographicClusters(filteredBuyOrders, filteredSellOrders, preferences); + this.logger.log( + `Starting geographic matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`, + ); + + const filteredBuyOrders = this.filterOrdersByGeography( + buyOrders, + preferences, + ); + const filteredSellOrders = this.filterOrdersByGeography( + sellOrders, + preferences, + ); + + const clusters = this.createGeographicClusters( + filteredBuyOrders, + filteredSellOrders, + preferences, + ); const matches: Match[] = []; const rejectedOrders: string[] = []; for (const cluster of clusters) { - const clusterMatches = this.matchWithinCluster(cluster, rules, preferences); + const clusterMatches = this.matchWithinCluster( + cluster, + rules, + preferences, + ); matches.push(...clusterMatches.matches); rejectedOrders.push(...clusterMatches.rejectedOrders); } const processingTime = Date.now() - startTime; - - this.logger.log(`Geographic matching completed in ${processingTime}ms. Matches: ${matches.length}, Rejected: ${rejectedOrders.length}`); + + this.logger.log( + `Geographic matching completed in ${processingTime}ms. Matches: ${matches.length}, Rejected: ${rejectedOrders.length}`, + ); return { matches, @@ -69,10 +90,13 @@ export class GeographicMatchingAlgorithm { }; } - private filterOrdersByGeography(orders: Order[], preferences: MatchingPreferencesDto): Order[] { + private filterOrdersByGeography( + orders: Order[], + preferences: MatchingPreferencesDto, + ): Order[] { if (!preferences.geographic) return orders; - return orders.filter(order => { + return orders.filter((order) => { if (!order.location) return false; if (preferences.geographic.preferredRegions?.length > 0) { @@ -100,7 +124,7 @@ export class GeographicMatchingAlgorithm { ): GeographicCluster[] { const allOrders = [...buyOrders, ...sellOrders]; const maxDistance = preferences.geographic?.maxDistance || 100; - + const clusters: GeographicCluster[] = []; const processedOrderIds = new Set(); @@ -109,31 +133,49 @@ export class GeographicMatchingAlgorithm { const nearbyOrders = this.findNearbyOrders(order, allOrders, maxDistance); const cluster = this.createCluster(order, nearbyOrders); - + clusters.push(cluster); - nearbyOrders.forEach(nearbyOrder => processedOrderIds.add(nearbyOrder.id)); + nearbyOrders.forEach((nearbyOrder) => + processedOrderIds.add(nearbyOrder.id), + ); } return clusters; } - private findNearbyOrders(centerOrder: Order, allOrders: Order[], maxDistance: number): Order[] { + private findNearbyOrders( + centerOrder: Order, + allOrders: Order[], + maxDistance: number, + ): Order[] { if (!centerOrder.location) return []; - return allOrders.filter(order => { + return allOrders.filter((order) => { if (order.id === centerOrder.id || !order.location) return false; - - const distance = this.calculateDistance(centerOrder.location, order.location); + + const distance = this.calculateDistance( + centerOrder.location, + order.location, + ); return distance <= maxDistance; }); } - private createCluster(centerOrder: Order, orders: Order[]): GeographicCluster { - const buyOrders = orders.filter(order => order.type === 'buy'); - const sellOrders = orders.filter(order => order.type === 'sell'); - - const totalBuyQuantity = buyOrders.reduce((sum, order) => sum + (order.quantity || 0), 0); - const totalSellQuantity = sellOrders.reduce((sum, order) => sum + (order.quantity || 0), 0); + private createCluster( + centerOrder: Order, + orders: Order[], + ): GeographicCluster { + const buyOrders = orders.filter((order) => order.type === 'buy'); + const sellOrders = orders.filter((order) => order.type === 'sell'); + + const totalBuyQuantity = buyOrders.reduce( + (sum, order) => sum + (order.quantity || 0), + 0, + ); + const totalSellQuantity = sellOrders.reduce( + (sum, order) => sum + (order.quantity || 0), + 0, + ); const center = this.calculateClusterCenter(orders); @@ -148,8 +190,10 @@ export class GeographicMatchingAlgorithm { } private calculateClusterCenter(orders: Order[]): LocationPoint { - const validLocations = orders.filter(order => order.location).map(order => order.location); - + const validLocations = orders + .filter((order) => order.location) + .map((order) => order.location); + if (validLocations.length === 0) { return { latitude: 0, longitude: 0 }; } @@ -163,12 +207,15 @@ export class GeographicMatchingAlgorithm { }; } - private calculateClusterRadius(orders: Order[], center: LocationPoint): number { + private calculateClusterRadius( + orders: Order[], + center: LocationPoint, + ): number { let maxDistance = 0; for (const order of orders) { if (!order.location) continue; - + const distance = this.calculateDistance(center, order.location); maxDistance = Math.max(maxDistance, distance); } @@ -181,8 +228,8 @@ export class GeographicMatchingAlgorithm { rules: MatchingRule[], preferences: MatchingPreferencesDto, ): { matches: Match[]; rejectedOrders: string[] } { - const buyOrders = cluster.orders.filter(order => order.type === 'buy'); - const sellOrders = cluster.orders.filter(order => order.type === 'sell'); + const buyOrders = cluster.orders.filter((order) => order.type === 'buy'); + const sellOrders = cluster.orders.filter((order) => order.type === 'sell'); const matches: Match[] = []; const rejectedOrders: string[] = []; @@ -191,15 +238,28 @@ export class GeographicMatchingAlgorithm { for (const buyOrder of buyOrders) { if (usedOrderIds.has(buyOrder.id)) continue; - const bestSellOrder = this.findBestGeographicMatch(buyOrder, sellOrders, usedOrderIds, rules, preferences); + const bestSellOrder = this.findBestGeographicMatch( + buyOrder, + sellOrders, + usedOrderIds, + rules, + preferences, + ); if (bestSellOrder) { - const match = this.createGeographicMatch(buyOrder, bestSellOrder, cluster, preferences); + const match = this.createGeographicMatch( + buyOrder, + bestSellOrder, + cluster, + preferences, + ); matches.push(match); usedOrderIds.add(buyOrder.id); usedOrderIds.add(bestSellOrder.id); - - this.logger.log(`Created geographic match: Buy ${buyOrder.id} -> Sell ${bestSellOrder.id} in cluster ${cluster.id}`); + + this.logger.log( + `Created geographic match: Buy ${buyOrder.id} -> Sell ${bestSellOrder.id} in cluster ${cluster.id}`, + ); } else { rejectedOrders.push(buyOrder.id); } @@ -221,13 +281,33 @@ export class GeographicMatchingAlgorithm { for (const sellOrder of sellOrders) { if (usedOrderIds.has(sellOrder.id)) continue; - const geographicScore = this.calculateGeographicScore(buyOrder, sellOrder, preferences); - const priceScore = this.calculatePriceScore(buyOrder, sellOrder, preferences); - const quantityScore = this.calculateQuantityScore(buyOrder, sellOrder, preferences); - - const combinedScore = this.calculateCombinedGeographicScore(geographicScore, priceScore, quantityScore, rules); - - if (combinedScore > bestScore && this.isPriceCompatible(buyOrder, sellOrder, preferences)) { + const geographicScore = this.calculateGeographicScore( + buyOrder, + sellOrder, + preferences, + ); + const priceScore = this.calculatePriceScore( + buyOrder, + sellOrder, + preferences, + ); + const quantityScore = this.calculateQuantityScore( + buyOrder, + sellOrder, + preferences, + ); + + const combinedScore = this.calculateCombinedGeographicScore( + geographicScore, + priceScore, + quantityScore, + rules, + ); + + if ( + combinedScore > bestScore && + this.isPriceCompatible(buyOrder, sellOrder, preferences) + ) { bestScore = combinedScore; bestMatch = sellOrder; } @@ -243,10 +323,13 @@ export class GeographicMatchingAlgorithm { ): number { if (!buyOrder.location || !sellOrder.location) return 0.5; - const distance = this.calculateDistance(buyOrder.location, sellOrder.location); + const distance = this.calculateDistance( + buyOrder.location, + sellOrder.location, + ); const maxDistance = preferences.geographic?.maxDistance || 100; - let score = Math.max(0, 1 - (distance / maxDistance)); + let score = Math.max(0, 1 - distance / maxDistance); const buyRegion = this.getRegionFromLocation(buyOrder.location); const sellRegion = this.getRegionFromLocation(sellOrder.location); @@ -271,7 +354,7 @@ export class GeographicMatchingAlgorithm { const priceDifference = buyPrice - sellPrice; const tolerance = preferences.price?.priceTolerance || 15; - return Math.max(0, 1 - (priceDifference / tolerance)); + return Math.max(0, 1 - priceDifference / tolerance); } private calculateQuantityScore( @@ -299,7 +382,7 @@ export class GeographicMatchingAlgorithm { let priceWeight = 0.3; let quantityWeight = 0.2; - for (const rule of rules.filter(r => r.status === 'active')) { + for (const rule of rules.filter((r) => r.status === 'active')) { switch (rule.type) { case RuleType.GEOGRAPHIC_PROXIMITY: geographicWeight += rule.weight || 0; @@ -314,12 +397,13 @@ export class GeographicMatchingAlgorithm { } const totalWeight = geographicWeight + priceWeight + quantityWeight; - + return ( - (geographicScore * geographicWeight) + - (priceScore * priceWeight) + - (quantityScore * quantityWeight) - ) / totalWeight; + (geographicScore * geographicWeight + + priceScore * priceWeight + + quantityScore * quantityWeight) / + totalWeight + ); } private isPriceCompatible( @@ -332,8 +416,10 @@ export class GeographicMatchingAlgorithm { if (buyPrice < sellPrice) return false; - if (preferences.price?.maxPrice && sellPrice > preferences.price.maxPrice) return false; - if (preferences.price?.minPrice && sellPrice < preferences.price.minPrice) return false; + if (preferences.price?.maxPrice && sellPrice > preferences.price.maxPrice) + return false; + if (preferences.price?.minPrice && sellPrice < preferences.price.minPrice) + return false; const priceDifference = buyPrice - sellPrice; const tolerance = preferences.price?.priceTolerance || 15; @@ -349,55 +435,73 @@ export class GeographicMatchingAlgorithm { ): Match { const matchedQuantity = Math.min(buyOrder.quantity, sellOrder.quantity); const matchedPrice = (buyOrder.price + sellOrder.price) / 2; - const distance = this.calculateDistance(buyOrder.location, sellOrder.location); + const distance = this.calculateDistance( + buyOrder.location, + sellOrder.location, + ); const match = new Match(); match.buyerOrderId = buyOrder.id; match.sellerOrderId = sellOrder.id; match.matchedQuantity = matchedQuantity; match.matchedPrice = matchedPrice; - match.matchingScore = this.calculateGeographicScore(buyOrder, sellOrder, preferences); + match.matchingScore = this.calculateGeographicScore( + buyOrder, + sellOrder, + preferences, + ); match.status = MatchStatus.PENDING; - match.type = matchedQuantity < buyOrder.quantity ? MatchType.PARTIAL : MatchType.FULL; - match.remainingQuantity = matchedQuantity < buyOrder.quantity ? buyOrder.quantity - matchedQuantity : null; + match.type = + matchedQuantity < buyOrder.quantity ? MatchType.PARTIAL : MatchType.FULL; + match.remainingQuantity = + matchedQuantity < buyOrder.quantity + ? buyOrder.quantity - matchedQuantity + : null; match.distance = distance; match.metadata = { algorithm: 'geographic', priority: match.matchingScore, renewablePreference: preferences.renewable?.preferRenewable, clusterId: cluster.id, - auditTrail: [{ - timestamp: new Date(), - action: 'match_created', - reason: `Geographic matching in cluster ${cluster.id}, distance: ${distance.toFixed(2)}km`, - }], + auditTrail: [ + { + timestamp: new Date(), + action: 'match_created', + reason: `Geographic matching in cluster ${cluster.id}, distance: ${distance.toFixed(2)}km`, + }, + ], }; match.expiresAt = new Date(Date.now() + 30 * 60 * 1000); return match; } - private calculateDistance(location1: LocationPoint, location2: LocationPoint): number { + private calculateDistance( + location1: LocationPoint, + location2: LocationPoint, + ): number { const lat1 = location1.latitude || 0; const lon1 = location1.longitude || 0; const lat2 = location2.latitude || 0; const lon2 = location2.longitude || 0; const R = 6371; - const dLat = (lat2 - lat1) * Math.PI / 180; - const dLon = (lon2 - lon1) * Math.PI / 180; - const a = - Math.sin(dLat/2) * Math.sin(dLat/2) + - Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * - Math.sin(dLon/2) * Math.sin(dLon/2); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + const dLat = ((lat2 - lat1) * Math.PI) / 180; + const dLon = ((lon2 - lon1) * Math.PI) / 180; + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos((lat1 * Math.PI) / 180) * + Math.cos((lat2 * Math.PI) / 180) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; } private getRegionFromLocation(location: LocationPoint): string { if (location.region) return location.region; if (location.country) return location.country; - + return 'unknown'; } diff --git a/src/matching/algorithms/partial-fulfillment.algorithm.ts b/src/matching/algorithms/partial-fulfillment.algorithm.ts index 6cb6d73..af6ef9c 100644 --- a/src/matching/algorithms/partial-fulfillment.algorithm.ts +++ b/src/matching/algorithms/partial-fulfillment.algorithm.ts @@ -54,19 +54,34 @@ export class PartialFulfillmentAlgorithm { preferences: MatchingPreferencesDto, ): Promise { const startTime = Date.now(); - - this.logger.log(`Starting partial fulfillment matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`); - const fulfillmentPlans = this.createFulfillmentPlans(buyOrders, sellOrders, rules, preferences); - const optimizedPlans = this.optimizeFulfillmentPlans(fulfillmentPlans, preferences); + this.logger.log( + `Starting partial fulfillment matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`, + ); + + const fulfillmentPlans = this.createFulfillmentPlans( + buyOrders, + sellOrders, + rules, + preferences, + ); + const optimizedPlans = this.optimizeFulfillmentPlans( + fulfillmentPlans, + preferences, + ); const matches = this.executeFulfillmentPlans(optimizedPlans, preferences); - const partiallyFulfilledOrders = this.calculatePartialFulfillmentStats(optimizedPlans, matches); + const partiallyFulfilledOrders = this.calculatePartialFulfillmentStats( + optimizedPlans, + matches, + ); const rejectedOrders = this.identifyRejectedOrders(optimizedPlans); const processingTime = Date.now() - startTime; - - this.logger.log(`Partial fulfillment matching completed in ${processingTime}ms. Matches: ${matches.length}, Partially fulfilled: ${partiallyFulfilledOrders.length}`); + + this.logger.log( + `Partial fulfillment matching completed in ${processingTime}ms. Matches: ${matches.length}, Partially fulfilled: ${partiallyFulfilledOrders.length}`, + ); return { matches, @@ -86,12 +101,24 @@ export class PartialFulfillmentAlgorithm { const plans: FulfillmentPlan[] = []; for (const buyOrder of buyOrders) { - const plan = this.createFulfillmentPlan(buyOrder, sellOrders, rules, preferences, 'buyer'); + const plan = this.createFulfillmentPlan( + buyOrder, + sellOrders, + rules, + preferences, + 'buyer', + ); if (plan) plans.push(plan); } for (const sellOrder of sellOrders) { - const plan = this.createFulfillmentPlan(sellOrder, buyOrders, rules, preferences, 'seller'); + const plan = this.createFulfillmentPlan( + sellOrder, + buyOrders, + rules, + preferences, + 'seller', + ); if (plan) plans.push(plan); } @@ -105,23 +132,42 @@ export class PartialFulfillmentAlgorithm { preferences: MatchingPreferencesDto, orderType: 'buyer' | 'seller', ): FulfillmentPlan | null { - const compatiblePartners = potentialPartners.filter(partner => - this.isCompatibleForPartialFulfillment(order, partner, preferences) + const compatiblePartners = potentialPartners.filter((partner) => + this.isCompatibleForPartialFulfillment(order, partner, preferences), ); if (compatiblePartners.length === 0) return null; - const scoredPartners = compatiblePartners.map(partner => ({ - partnerOrderId: partner.id, - quantity: Math.min(order.quantity, partner.quantity), - price: orderType === 'buyer' ? partner.price : order.price, - score: this.calculatePartialFulfillmentScore(order, partner, rules, preferences), - })).sort((a, b) => b.score - a.score); - - const fulfillmentStrategy = this.determineFulfillmentStrategy(order, scoredPartners, preferences); - const selectedMatches = this.selectMatchesForStrategy(order, scoredPartners, fulfillmentStrategy, preferences); + const scoredPartners = compatiblePartners + .map((partner) => ({ + partnerOrderId: partner.id, + quantity: Math.min(order.quantity, partner.quantity), + price: orderType === 'buyer' ? partner.price : order.price, + score: this.calculatePartialFulfillmentScore( + order, + partner, + rules, + preferences, + ), + })) + .sort((a, b) => b.score - a.score); + + const fulfillmentStrategy = this.determineFulfillmentStrategy( + order, + scoredPartners, + preferences, + ); + const selectedMatches = this.selectMatchesForStrategy( + order, + scoredPartners, + fulfillmentStrategy, + preferences, + ); - const totalFulfilledQuantity = selectedMatches.reduce((sum, match) => sum + match.quantity, 0); + const totalFulfilledQuantity = selectedMatches.reduce( + (sum, match) => sum + match.quantity, + 0, + ); const remainingQuantity = order.quantity - totalFulfilledQuantity; const efficiency = totalFulfilledQuantity / order.quantity; @@ -157,7 +203,8 @@ export class PartialFulfillmentAlgorithm { } const threshold = preferences.quantity.partialFulfillmentThreshold || 50; - const fulfillmentPercentage = (Math.min(order.quantity, partner.quantity) / order.quantity) * 100; + const fulfillmentPercentage = + (Math.min(order.quantity, partner.quantity) / order.quantity) * 100; return fulfillmentPercentage >= threshold; } @@ -168,17 +215,21 @@ export class PartialFulfillmentAlgorithm { rules: MatchingRule[], preferences: MatchingPreferencesDto, ): number { - const quantityScore = this.calculateQuantityScore(order, partner, preferences); + const quantityScore = this.calculateQuantityScore( + order, + partner, + preferences, + ); const priceScore = this.calculatePriceScore(order, partner, preferences); const efficiencyScore = this.calculateEfficiencyScore(order, partner); const reliabilityScore = this.calculateReliabilityScore(order, partner); let quantityWeight = 0.3; let priceWeight = 0.3; - let efficiencyWeight = 0.2; + const efficiencyWeight = 0.2; let reliabilityWeight = 0.2; - for (const rule of rules.filter(r => r.status === 'active')) { + for (const rule of rules.filter((r) => r.status === 'active')) { switch (rule.type) { case RuleType.QUANTITY_MATCH: quantityWeight += rule.weight || 0; @@ -192,14 +243,16 @@ export class PartialFulfillmentAlgorithm { } } - const totalWeight = quantityWeight + priceWeight + efficiencyWeight + reliabilityWeight; + const totalWeight = + quantityWeight + priceWeight + efficiencyWeight + reliabilityWeight; return ( - (quantityScore * quantityWeight) + - (priceScore * priceWeight) + - (efficiencyScore * efficiencyWeight) + - (reliabilityScore * reliabilityWeight) - ) / totalWeight; + (quantityScore * quantityWeight + + priceScore * priceWeight + + efficiencyScore * efficiencyWeight + + reliabilityScore * reliabilityWeight) / + totalWeight + ); } private calculateQuantityScore( @@ -228,12 +281,12 @@ export class PartialFulfillmentAlgorithm { if (orderPrice < partnerPrice) return 0; const priceDifference = orderPrice - partnerPrice; const tolerance = preferences.price?.priceTolerance || 10; - return Math.max(0, 1 - (priceDifference / tolerance)); + return Math.max(0, 1 - priceDifference / tolerance); } else { if (partnerPrice < orderPrice) return 0; const priceDifference = partnerPrice - orderPrice; const tolerance = preferences.price?.priceTolerance || 10; - return Math.max(0, 1 - (priceDifference / tolerance)); + return Math.max(0, 1 - priceDifference / tolerance); } } @@ -243,8 +296,8 @@ export class PartialFulfillmentAlgorithm { const waste = Math.abs(orderQuantity - partnerQuantity); const totalQuantity = orderQuantity + partnerQuantity; - - return Math.max(0, 1 - (waste / totalQuantity)); + + return Math.max(0, 1 - waste / totalQuantity); } private calculateReliabilityScore(order: Order, partner: Order): number { @@ -268,8 +321,11 @@ export class PartialFulfillmentAlgorithm { return 'single'; } - const totalAvailableQuantity = scoredPartners.reduce((sum, partner) => sum + partner.quantity, 0); - + const totalAvailableQuantity = scoredPartners.reduce( + (sum, partner) => sum + partner.quantity, + 0, + ); + if (totalAvailableQuantity >= order.quantity * 0.9) { return 'multiple'; } @@ -310,7 +366,7 @@ export class PartialFulfillmentAlgorithm { if (remainingQuantity <= 0) break; const matchQuantity = Math.min(partner.quantity, remainingQuantity); - + selectedMatches.push({ ...partner, quantity: matchQuantity, @@ -335,7 +391,7 @@ export class PartialFulfillmentAlgorithm { const maxSplitQuantity = partner.quantity * 0.8; const matchQuantity = Math.min(maxSplitQuantity, remainingQuantity); - + if (matchQuantity > 0) { selectedMatches.push({ ...partner, @@ -354,7 +410,11 @@ export class PartialFulfillmentAlgorithm { preferences: MatchingPreferencesDto, ): FulfillmentPlan[] { return plans - .filter(plan => plan.efficiency >= (preferences.quantity?.partialFulfillmentThreshold || 50) / 100) + .filter( + (plan) => + plan.efficiency >= + (preferences.quantity?.partialFulfillmentThreshold || 50) / 100, + ) .sort((a, b) => b.efficiency - a.efficiency); } @@ -371,7 +431,12 @@ export class PartialFulfillmentAlgorithm { for (const matchInfo of plan.matches) { if (usedOrderIds.has(matchInfo.partnerOrderId)) continue; - const match = this.createPartialMatch(plan.order, matchInfo, plan.fulfillmentStrategy, preferences); + const match = this.createPartialMatch( + plan.order, + matchInfo, + plan.fulfillmentStrategy, + preferences, + ); matches.push(match); usedOrderIds.add(plan.orderId); @@ -405,11 +470,13 @@ export class PartialFulfillmentAlgorithm { priority: matchInfo.score, fulfillmentStrategy: strategy, renewablePreference: preferences.renewable?.preferRenewable, - auditTrail: [{ - timestamp: new Date(), - action: 'partial_match_created', - reason: `Partial fulfillment using ${strategy} strategy, quantity: ${matchInfo.quantity}`, - }], + auditTrail: [ + { + timestamp: new Date(), + action: 'partial_match_created', + reason: `Partial fulfillment using ${strategy} strategy, quantity: ${matchInfo.quantity}`, + }, + ], }; match.expiresAt = new Date(Date.now() + 30 * 60 * 1000); @@ -429,18 +496,23 @@ export class PartialFulfillmentAlgorithm { const stats = new Map(); for (const plan of plans) { - const orderMatches = matches.filter(match => - match.buyerOrderId === plan.orderId || match.sellerOrderId === plan.orderId + const orderMatches = matches.filter( + (match) => + match.buyerOrderId === plan.orderId || + match.sellerOrderId === plan.orderId, ); - const fulfilledQuantity = orderMatches.reduce((sum, match) => sum + match.matchedQuantity, 0); + const fulfilledQuantity = orderMatches.reduce( + (sum, match) => sum + match.matchedQuantity, + 0, + ); stats.set(plan.orderId, { orderId: plan.orderId, originalQuantity: plan.order.quantity, fulfilledQuantity, remainingQuantity: plan.order.quantity - fulfilledQuantity, - matches: orderMatches.map(match => match.id), + matches: orderMatches.map((match) => match.id), }); } @@ -449,8 +521,8 @@ export class PartialFulfillmentAlgorithm { private identifyRejectedOrders(plans: FulfillmentPlan[]): string[] { return plans - .filter(plan => plan.efficiency < 0.5) - .map(plan => plan.orderId); + .filter((plan) => plan.efficiency < 0.5) + .map((plan) => plan.orderId); } private isPriceCompatible( @@ -467,8 +539,16 @@ export class PartialFulfillmentAlgorithm { if (partnerPrice < orderPrice) return false; } - if (preferences.price?.maxPrice && partnerPrice > preferences.price.maxPrice) return false; - if (preferences.price?.minPrice && partnerPrice < preferences.price.minPrice) return false; + if ( + preferences.price?.maxPrice && + partnerPrice > preferences.price.maxPrice + ) + return false; + if ( + preferences.price?.minPrice && + partnerPrice < preferences.price.minPrice + ) + return false; const priceDifference = Math.abs(orderPrice - partnerPrice); const tolerance = preferences.price?.priceTolerance || 10; @@ -494,7 +574,9 @@ export class PartialFulfillmentAlgorithm { private calculateOptimizationGain(matches: Match[]): number { const totalEfficiency = matches.reduce((sum, match) => { - const efficiency = match.matchedQuantity / (match.matchedQuantity + (match.remainingQuantity || 0)); + const efficiency = + match.matchedQuantity / + (match.matchedQuantity + (match.remainingQuantity || 0)); return sum + efficiency; }, 0); @@ -504,21 +586,29 @@ export class PartialFulfillmentAlgorithm { private generateOptimizationRecommendations(matches: Match[]): string[] { const recommendations: string[] = []; - const partialMatches = matches.filter(match => match.type === MatchType.PARTIAL); + const partialMatches = matches.filter( + (match) => match.type === MatchType.PARTIAL, + ); if (partialMatches.length > matches.length * 0.5) { - recommendations.push('Consider adjusting partial fulfillment threshold to reduce fragmentation'); + recommendations.push( + 'Consider adjusting partial fulfillment threshold to reduce fragmentation', + ); } - const lowScoreMatches = matches.filter(match => (match.matchingScore || 0) < 0.6); + const lowScoreMatches = matches.filter( + (match) => (match.matchingScore || 0) < 0.6, + ); if (lowScoreMatches.length > 0) { - recommendations.push('Review matching rules to improve quality of partial matches'); + recommendations.push( + 'Review matching rules to improve quality of partial matches', + ); } return recommendations; } private applyOptimizations(matches: Match[]): Match[] { - return matches.map(match => { + return matches.map((match) => { if (match.matchingScore && match.matchingScore < 0.5) { match.status = MatchStatus.REJECTED; match.metadata = { diff --git a/src/matching/algorithms/priority-matching.algorithm.ts b/src/matching/algorithms/priority-matching.algorithm.ts index 8e5a365..efc757e 100644 --- a/src/matching/algorithms/priority-matching.algorithm.ts +++ b/src/matching/algorithms/priority-matching.algorithm.ts @@ -1,8 +1,15 @@ import { Injectable, Logger } from '@nestjs/common'; import { Order } from '../../modules/energy/entities/order.entity'; import { Match, MatchStatus, MatchType } from '../entities/match.entity'; -import { MatchingRule, RuleType, RulePriority } from '../entities/matching-rule.entity'; -import { MatchingPreferencesDto, MatchingStrategy } from '../dto/matching-preferences.dto'; +import { + MatchingRule, + RuleType, + RulePriority, +} from '../entities/matching-rule.entity'; +import { + MatchingPreferencesDto, + MatchingStrategy, +} from '../dto/matching-preferences.dto'; export interface PriorityMatchResult { matches: Match[]; @@ -34,11 +41,21 @@ export class PriorityMatchingAlgorithm { preferences: MatchingPreferencesDto, ): Promise { const startTime = Date.now(); - - this.logger.log(`Starting priority matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`); - const prioritizedBuyOrders = this.calculateOrderPriorities(buyOrders, rules, 'buyer'); - const prioritizedSellOrders = this.calculateOrderPriorities(sellOrders, rules, 'seller'); + this.logger.log( + `Starting priority matching with ${buyOrders.length} buy orders and ${sellOrders.length} sell orders`, + ); + + const prioritizedBuyOrders = this.calculateOrderPriorities( + buyOrders, + rules, + 'buyer', + ); + const prioritizedSellOrders = this.calculateOrderPriorities( + sellOrders, + rules, + 'seller', + ); const matches: Match[] = []; const rejectedOrders: string[] = []; @@ -53,28 +70,45 @@ export class PriorityMatchingAlgorithm { for (const sellOrder of availableSellOrders) { if (usedSellOrderIds.has(sellOrder.id)) continue; - const compatibilityScore = this.calculateCompatibilityScore(buyOrder, sellOrder, rules, preferences); - - if (compatibilityScore > bestScore && this.isPriceCompatible(buyOrder, sellOrder, preferences)) { + const compatibilityScore = this.calculateCompatibilityScore( + buyOrder, + sellOrder, + rules, + preferences, + ); + + if ( + compatibilityScore > bestScore && + this.isPriceCompatible(buyOrder, sellOrder, preferences) + ) { bestScore = compatibilityScore; bestMatch = sellOrder; } } if (bestMatch && bestScore > 0.5) { - const match = this.createMatch(buyOrder, bestMatch, bestScore, preferences); + const match = this.createMatch( + buyOrder, + bestMatch, + bestScore, + preferences, + ); matches.push(match); usedSellOrderIds.add(bestMatch.id); - - this.logger.log(`Created match: Buy ${buyOrder.id} -> Sell ${bestMatch.id} (Score: ${bestScore.toFixed(3)})`); + + this.logger.log( + `Created match: Buy ${buyOrder.id} -> Sell ${bestMatch.id} (Score: ${bestScore.toFixed(3)})`, + ); } else { rejectedOrders.push(buyOrder.id); } } const processingTime = Date.now() - startTime; - - this.logger.log(`Priority matching completed in ${processingTime}ms. Matches: ${matches.length}, Rejected: ${rejectedOrders.length}`); + + this.logger.log( + `Priority matching completed in ${processingTime}ms. Matches: ${matches.length}, Rejected: ${rejectedOrders.length}`, + ); return { matches, @@ -90,12 +124,12 @@ export class PriorityMatchingAlgorithm { orderType: 'buyer' | 'seller', ): Order[] { return orders - .map(order => ({ + .map((order) => ({ order, priority: this.calculateOrderPriority(order, rules, orderType), })) .sort((a, b) => b.priority - a.priority) - .map(item => item.order); + .map((item) => item.order); } private calculateOrderPriority( @@ -105,7 +139,7 @@ export class PriorityMatchingAlgorithm { ): number { let priority = 0; - const applicableRules = rules.filter(rule => { + const applicableRules = rules.filter((rule) => { if (orderType === 'buyer' && !rule.appliesToBuyer) return false; if (orderType === 'seller' && !rule.appliesToSeller) return false; if (rule.status !== 'active') return false; @@ -123,7 +157,8 @@ export class PriorityMatchingAlgorithm { break; case RuleType.TIME_PRIORITY: - const hoursSinceCreation = (Date.now() - order.createdAt.getTime()) / (1000 * 60 * 60); + const hoursSinceCreation = + (Date.now() - order.createdAt.getTime()) / (1000 * 60 * 60); priority += rule.weight * Math.min(hoursSinceCreation / 24, 1); break; @@ -158,10 +193,21 @@ export class PriorityMatchingAlgorithm { let score = 0; let totalWeight = 0; - const priceScore = this.calculatePriceScore(buyOrder, sellOrder, preferences); - const quantityScore = this.calculateQuantityScore(buyOrder, sellOrder, preferences); + const priceScore = this.calculatePriceScore( + buyOrder, + sellOrder, + preferences, + ); + const quantityScore = this.calculateQuantityScore( + buyOrder, + sellOrder, + preferences, + ); const timeScore = this.calculateTimeScore(buyOrder, sellOrder); - const reliabilityScore = this.calculateReliabilityScore(buyOrder, sellOrder); + const reliabilityScore = this.calculateReliabilityScore( + buyOrder, + sellOrder, + ); const weights = this.getRuleWeights(rules); @@ -178,13 +224,21 @@ export class PriorityMatchingAlgorithm { totalWeight += weights.reliability; if (preferences.geographic) { - const geographicScore = this.calculateGeographicScore(buyOrder, sellOrder, preferences); + const geographicScore = this.calculateGeographicScore( + buyOrder, + sellOrder, + preferences, + ); score += geographicScore * weights.geographic; totalWeight += weights.geographic; } if (preferences.renewable?.preferRenewable) { - const renewableScore = this.calculateRenewableScore(buyOrder, sellOrder, preferences); + const renewableScore = this.calculateRenewableScore( + buyOrder, + sellOrder, + preferences, + ); score += renewableScore * weights.renewable; totalWeight += weights.renewable; } @@ -205,7 +259,7 @@ export class PriorityMatchingAlgorithm { const priceDifference = buyPrice - sellPrice; const tolerance = preferences.price?.priceTolerance || 10; - return Math.max(0, 1 - (priceDifference / tolerance)); + return Math.max(0, 1 - priceDifference / tolerance); } private calculateQuantityScore( @@ -230,10 +284,12 @@ export class PriorityMatchingAlgorithm { } private calculateTimeScore(buyOrder: Order, sellOrder: Order): number { - const timeDiff = Math.abs(buyOrder.createdAt.getTime() - sellOrder.createdAt.getTime()); + const timeDiff = Math.abs( + buyOrder.createdAt.getTime() - sellOrder.createdAt.getTime(), + ); const maxTimeDiff = 24 * 60 * 60 * 1000; // 24 hours - return Math.max(0, 1 - (timeDiff / maxTimeDiff)); + return Math.max(0, 1 - timeDiff / maxTimeDiff); } private calculateReliabilityScore(buyOrder: Order, sellOrder: Order): number { @@ -250,10 +306,13 @@ export class PriorityMatchingAlgorithm { ): number { if (!buyOrder.location || !sellOrder.location) return 0.5; - const distance = this.calculateDistance(buyOrder.location, sellOrder.location); + const distance = this.calculateDistance( + buyOrder.location, + sellOrder.location, + ); const maxDistance = preferences.geographic?.maxDistance || 1000; - return Math.max(0, 1 - (distance / maxDistance)); + return Math.max(0, 1 - distance / maxDistance); } private calculateRenewableScore( @@ -290,7 +349,7 @@ export class PriorityMatchingAlgorithm { const customWeights = { ...defaultWeights }; - for (const rule of rules.filter(r => r.status === 'active')) { + for (const rule of rules.filter((r) => r.status === 'active')) { switch (rule.type) { case RuleType.PRICE_PRIORITY: customWeights.price += rule.weight || 0; @@ -313,10 +372,13 @@ export class PriorityMatchingAlgorithm { } } - const total = Object.values(customWeights).reduce((sum, weight) => sum + weight, 0); - + const total = Object.values(customWeights).reduce( + (sum, weight) => sum + weight, + 0, + ); + return Object.fromEntries( - Object.entries(customWeights).map(([key, value]) => [key, value / total]) + Object.entries(customWeights).map(([key, value]) => [key, value / total]), ) as typeof customWeights; } @@ -330,8 +392,10 @@ export class PriorityMatchingAlgorithm { if (buyPrice < sellPrice) return false; - if (preferences.price?.maxPrice && sellPrice > preferences.price.maxPrice) return false; - if (preferences.price?.minPrice && sellPrice < preferences.price.minPrice) return false; + if (preferences.price?.maxPrice && sellPrice > preferences.price.maxPrice) + return false; + if (preferences.price?.minPrice && sellPrice < preferences.price.minPrice) + return false; const priceDifference = buyPrice - sellPrice; const tolerance = preferences.price?.priceTolerance || 10; @@ -355,18 +419,27 @@ export class PriorityMatchingAlgorithm { match.matchedPrice = matchedPrice; match.matchingScore = score; match.status = MatchStatus.PENDING; - match.type = matchedQuantity < buyOrder.quantity ? MatchType.PARTIAL : MatchType.FULL; - match.remainingQuantity = matchedQuantity < buyOrder.quantity ? buyOrder.quantity - matchedQuantity : null; - match.distance = this.calculateDistance(buyOrder.location, sellOrder.location); + match.type = + matchedQuantity < buyOrder.quantity ? MatchType.PARTIAL : MatchType.FULL; + match.remainingQuantity = + matchedQuantity < buyOrder.quantity + ? buyOrder.quantity - matchedQuantity + : null; + match.distance = this.calculateDistance( + buyOrder.location, + sellOrder.location, + ); match.metadata = { algorithm: 'priority', priority: score, renewablePreference: preferences.renewable?.preferRenewable, - auditTrail: [{ - timestamp: new Date(), - action: 'match_created', - reason: `Priority matching with score ${score.toFixed(3)}`, - }], + auditTrail: [ + { + timestamp: new Date(), + action: 'match_created', + reason: `Priority matching with score ${score.toFixed(3)}`, + }, + ], }; match.expiresAt = new Date(Date.now() + 30 * 60 * 1000); // 30 minutes @@ -382,13 +455,15 @@ export class PriorityMatchingAlgorithm { const lon2 = location2.longitude || 0; const R = 6371; - const dLat = (lat2 - lat1) * Math.PI / 180; - const dLon = (lon2 - lon1) * Math.PI / 180; - const a = - Math.sin(dLat/2) * Math.sin(dLat/2) + - Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * - Math.sin(dLon/2) * Math.sin(dLon/2); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + const dLat = ((lat2 - lat1) * Math.PI) / 180; + const dLon = ((lon2 - lon1) * Math.PI) / 180; + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos((lat1 * Math.PI) / 180) * + Math.cos((lat2 * Math.PI) / 180) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; } } diff --git a/src/matching/audit/audit.service.ts b/src/matching/audit/audit.service.ts index 07f8c60..a9615b6 100644 --- a/src/matching/audit/audit.service.ts +++ b/src/matching/audit/audit.service.ts @@ -53,7 +53,9 @@ export class AuditService { private readonly matchingRuleRepository: Repository, ) {} - async logEntry(entry: Omit): Promise { + async logEntry( + entry: Omit, + ): Promise { const auditEntry: AuditEntry = { id: `audit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, timestamp: new Date(), @@ -61,17 +63,23 @@ export class AuditService { }; this.auditEntries.push(auditEntry); - + if (this.auditEntries.length > 10000) { this.auditEntries = this.auditEntries.slice(-5000); } - this.logger.debug(`Audit entry logged: ${auditEntry.action} on ${auditEntry.entityType} ${auditEntry.entityId}`); + this.logger.debug( + `Audit entry logged: ${auditEntry.action} on ${auditEntry.entityType} ${auditEntry.entityId}`, + ); return auditEntry; } - async logMatchCreation(match: Match, userId?: string, reason?: string): Promise { + async logMatchCreation( + match: Match, + userId?: string, + reason?: string, + ): Promise { return this.logEntry({ entityType: 'match', entityId: match.id, @@ -87,7 +95,12 @@ export class AuditService { }); } - async logMatchUpdate(match: Match, previousState: Match, userId?: string, reason?: string): Promise { + async logMatchUpdate( + match: Match, + previousState: Match, + userId?: string, + reason?: string, + ): Promise { return this.logEntry({ entityType: 'match', entityId: match.id, @@ -102,7 +115,11 @@ export class AuditService { }); } - async logMatchDeletion(match: Match, userId?: string, reason?: string): Promise { + async logMatchDeletion( + match: Match, + userId?: string, + reason?: string, + ): Promise { return this.logEntry({ entityType: 'match', entityId: match.id, @@ -113,7 +130,10 @@ export class AuditService { }); } - async logRuleCreation(rule: MatchingRule, userId?: string): Promise { + async logRuleCreation( + rule: MatchingRule, + userId?: string, + ): Promise { return this.logEntry({ entityType: 'rule', entityId: rule.id, @@ -127,7 +147,11 @@ export class AuditService { }); } - async logRuleUpdate(rule: MatchingRule, previousState: MatchingRule, userId?: string): Promise { + async logRuleUpdate( + rule: MatchingRule, + previousState: MatchingRule, + userId?: string, + ): Promise { return this.logEntry({ entityType: 'rule', entityId: rule.id, @@ -141,7 +165,11 @@ export class AuditService { }); } - async logRuleDeletion(rule: MatchingRule, userId?: string, reason?: string): Promise { + async logRuleDeletion( + rule: MatchingRule, + userId?: string, + reason?: string, + ): Promise { return this.logEntry({ entityType: 'rule', entityId: rule.id, @@ -156,30 +184,44 @@ export class AuditService { let filteredEntries = [...this.auditEntries]; if (filter.entityType) { - filteredEntries = filteredEntries.filter(entry => entry.entityType === filter.entityType); + filteredEntries = filteredEntries.filter( + (entry) => entry.entityType === filter.entityType, + ); } if (filter.entityId) { - filteredEntries = filteredEntries.filter(entry => entry.entityId === filter.entityId); + filteredEntries = filteredEntries.filter( + (entry) => entry.entityId === filter.entityId, + ); } if (filter.userId) { - filteredEntries = filteredEntries.filter(entry => entry.userId === filter.userId); + filteredEntries = filteredEntries.filter( + (entry) => entry.userId === filter.userId, + ); } if (filter.action) { - filteredEntries = filteredEntries.filter(entry => entry.action === filter.action); + filteredEntries = filteredEntries.filter( + (entry) => entry.action === filter.action, + ); } if (filter.startDate) { - filteredEntries = filteredEntries.filter(entry => entry.timestamp >= filter.startDate); + filteredEntries = filteredEntries.filter( + (entry) => entry.timestamp >= filter.startDate, + ); } if (filter.endDate) { - filteredEntries = filteredEntries.filter(entry => entry.timestamp <= filter.endDate); + filteredEntries = filteredEntries.filter( + (entry) => entry.timestamp <= filter.endDate, + ); } - filteredEntries.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()); + filteredEntries.sort( + (a, b) => b.timestamp.getTime() - a.timestamp.getTime(), + ); const offset = filter.offset || 0; const limit = filter.limit || 100; @@ -198,25 +240,32 @@ export class AuditService { return this.getAuditHistory({ entityType: 'match', entityId: matchId, - }).then(report => report.entries); + }).then((report) => report.entries); } async getRuleAuditHistory(ruleId: string): Promise { return this.getAuditHistory({ entityType: 'rule', entityId: ruleId, - }).then(report => report.entries); + }).then((report) => report.entries); } - async getUserActivity(userId: string, startDate?: Date, endDate?: Date): Promise { + async getUserActivity( + userId: string, + startDate?: Date, + endDate?: Date, + ): Promise { return this.getAuditHistory({ userId, startDate, endDate, - }).then(report => report.entries); + }).then((report) => report.entries); } - async generateAuditReport(startDate: Date, endDate: Date): Promise { + async generateAuditReport( + startDate: Date, + endDate: Date, + ): Promise { return this.getAuditHistory({ startDate, endDate, @@ -224,7 +273,10 @@ export class AuditService { }); } - async exportAuditData(filter: AuditFilter, format: 'json' | 'csv' = 'json'): Promise { + async exportAuditData( + filter: AuditFilter, + format: 'json' | 'csv' = 'json', + ): Promise { const report = await this.getAuditHistory({ ...filter, limit: 10000 }); if (format === 'json') { @@ -267,7 +319,10 @@ export class AuditService { }; } - private detectChanges(previous: T, current: T): Record { + private detectChanges( + previous: T, + current: T, + ): Record { const changes: Record = {}; for (const key in current) { @@ -292,10 +347,12 @@ export class AuditService { for (const entry of entries) { actionsByType[entry.action] = (actionsByType[entry.action] || 0) + 1; - entitiesByType[entry.entityType] = (entitiesByType[entry.entityType] || 0) + 1; - + entitiesByType[entry.entityType] = + (entitiesByType[entry.entityType] || 0) + 1; + if (entry.userId) { - usersByActivity[entry.userId] = (usersByActivity[entry.userId] || 0) + 1; + usersByActivity[entry.userId] = + (usersByActivity[entry.userId] || 0) + 1; } if (entry.timestamp < earliestDate) { @@ -331,7 +388,7 @@ export class AuditService { 'Metadata', ]; - const rows = entries.map(entry => [ + const rows = entries.map((entry) => [ entry.id, entry.entityType, entry.entityId, @@ -344,7 +401,7 @@ export class AuditService { ]); const csvContent = [headers, ...rows] - .map(row => row.map(field => `"${field}"`).join(',')) + .map((row) => row.map((field) => `"${field}"`).join(',')) .join('\n'); return csvContent; @@ -355,10 +412,14 @@ export class AuditService { cutoffDate.setDate(cutoffDate.getDate() - retentionDays); const initialCount = this.auditEntries.length; - this.auditEntries = this.auditEntries.filter(entry => entry.timestamp >= cutoffDate); + this.auditEntries = this.auditEntries.filter( + (entry) => entry.timestamp >= cutoffDate, + ); const deletedCount = initialCount - this.auditEntries.length; - this.logger.log(`Cleaned up ${deletedCount} old audit entries (older than ${retentionDays} days)`); + this.logger.log( + `Cleaned up ${deletedCount} old audit entries (older than ${retentionDays} days)`, + ); return deletedCount; } @@ -376,9 +437,10 @@ export class AuditService { const entriesByUser: Record = {}; for (const entry of this.auditEntries) { - entriesByType[entry.entityType] = (entriesByType[entry.entityType] || 0) + 1; + entriesByType[entry.entityType] = + (entriesByType[entry.entityType] || 0) + 1; entriesByAction[entry.action] = (entriesByAction[entry.action] || 0) + 1; - + if (entry.userId) { entriesByUser[entry.userId] = (entriesByUser[entry.userId] || 0) + 1; } diff --git a/src/matching/dto/matching-preferences.dto.ts b/src/matching/dto/matching-preferences.dto.ts index f47dc1f..0385a71 100644 --- a/src/matching/dto/matching-preferences.dto.ts +++ b/src/matching/dto/matching-preferences.dto.ts @@ -1,4 +1,14 @@ -import { IsEnum, IsNumber, IsBoolean, IsOptional, IsArray, IsString, Min, Max, ValidateNested } from 'class-validator'; +import { + IsEnum, + IsNumber, + IsBoolean, + IsOptional, + IsArray, + IsString, + Min, + Max, + ValidateNested, +} from 'class-validator'; import { Type } from 'class-transformer'; export enum EnergyType { diff --git a/src/matching/entities/match.entity.ts b/src/matching/entities/match.entity.ts index 7ad2a21..863b180 100644 --- a/src/matching/entities/match.entity.ts +++ b/src/matching/entities/match.entity.ts @@ -1,4 +1,12 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + ManyToOne, + JoinColumn, +} from 'typeorm'; import { Order } from '../../modules/energy/entities/order.entity'; export enum MatchStatus { diff --git a/src/matching/entities/matching-rule.entity.ts b/src/matching/entities/matching-rule.entity.ts index 2683cb3..fc97fd7 100644 --- a/src/matching/entities/matching-rule.entity.ts +++ b/src/matching/entities/matching-rule.entity.ts @@ -1,4 +1,10 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, +} from 'typeorm'; export enum RuleType { PRICE_PRIORITY = 'price_priority', diff --git a/src/matching/events/matching-events.service.ts b/src/matching/events/matching-events.service.ts index ba791c5..0758bc9 100644 --- a/src/matching/events/matching-events.service.ts +++ b/src/matching/events/matching-events.service.ts @@ -1,5 +1,11 @@ import { Injectable, Logger, EventEmitter, OnModuleInit } from '@nestjs/common'; -import { WebSocketGateway, WebSocketServer, SubscribeMessage, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets'; +import { + WebSocketGateway, + WebSocketServer, + SubscribeMessage, + OnGatewayConnection, + OnGatewayDisconnect, +} from '@nestjs/websockets'; import { Server, Socket } from 'socket.io'; import { Match, MatchStatus } from '../entities/match.entity'; import { MatchingService, MatchingEvent } from '../matching.service'; @@ -12,7 +18,12 @@ export interface MatchingEventData { } export interface NotificationPayload { - type: 'match_created' | 'match_confirmed' | 'match_rejected' | 'match_expired' | 'conflict_resolved'; + type: + | 'match_created' + | 'match_confirmed' + | 'match_rejected' + | 'match_expired' + | 'conflict_resolved'; title: string; message: string; data: any; @@ -32,7 +43,9 @@ export interface NotificationPayload { namespace: '/matching', }) @Injectable() -export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, OnGatewayDisconnect { +export class MatchingEventsService + implements OnModuleInit, OnGatewayConnection, OnGatewayDisconnect +{ @WebSocketServer() server: Server; @@ -55,9 +68,12 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, this.logger.log(`Client connected: ${client.id}`); this.connectedClients.set(client.id, client); - client.on('authenticate', async (data: { userId: string; token?: string }) => { - await this.authenticateClient(client, data.userId); - }); + client.on( + 'authenticate', + async (data: { userId: string; token?: string }) => { + await this.authenticateClient(client, data.userId); + }, + ); client.on('subscribe', async (data: { channels: string[] }) => { await this.subscribeToChannels(client, data.channels); @@ -77,7 +93,7 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, handleDisconnect(client: Socket) { this.logger.log(`Client disconnected: ${client.id}`); this.connectedClients.delete(client.id); - + for (const [userId, subscriptions] of this.userSubscriptions) { if (subscriptions.has(client.id)) { subscriptions.delete(client.id); @@ -89,9 +105,9 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, async handleSubscribeToOrder(client: Socket, orderId: string) { const room = `order_${orderId}`; await client.join(room); - + this.logger.debug(`Client ${client.id} subscribed to order ${orderId}`); - + client.emit('subscribed', { type: 'order', id: orderId }); } @@ -99,14 +115,14 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, async handleSubscribeToUser(client: Socket, userId: string) { const room = `user_${userId}`; await client.join(room); - + if (!this.userSubscriptions.has(userId)) { this.userSubscriptions.set(userId, new Set()); } - this.userSubscriptions.get(userId)!.add(client.id); - + this.userSubscriptions.get(userId).add(client.id); + this.logger.debug(`Client ${client.id} subscribed to user ${userId}`); - + client.emit('subscribed', { type: 'user', id: userId }); } @@ -114,9 +130,9 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, async handleSubscribeToMatches(client: Socket) { const room = 'matches'; await client.join(room); - + this.logger.debug(`Client ${client.id} subscribed to all matches`); - + client.emit('subscribed', { type: 'matches' }); } @@ -124,9 +140,9 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, async handleUnsubscribeFromOrder(client: Socket, orderId: string) { const room = `order_${orderId}`; await client.leave(room); - + this.logger.debug(`Client ${client.id} unsubscribed from order ${orderId}`); - + client.emit('unsubscribed', { type: 'order', id: orderId }); } @@ -135,9 +151,12 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, await this.handleMatchingEvent(event); }); - this.eventEmitter.on('notification', async (notification: NotificationPayload) => { - await this.sendNotification(notification); - }); + this.eventEmitter.on( + 'notification', + async (notification: NotificationPayload) => { + await this.sendNotification(notification); + }, + ); } async handleMatchingEvent(event: MatchingEvent) { @@ -227,20 +246,26 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, async sendNotification(notification: NotificationPayload) { const channels = this.determineNotificationChannels(notification); - + for (const channel of channels) { this.server.to(channel).emit('notification', notification); } if (notification.userId) { - this.server.to(`user_${notification.userId}`).emit('notification', notification); + this.server + .to(`user_${notification.userId}`) + .emit('notification', notification); } if (notification.orderId) { - this.server.to(`order_${notification.orderId}`).emit('notification', notification); + this.server + .to(`order_${notification.orderId}`) + .emit('notification', notification); } - this.logger.debug(`Notification sent: ${notification.type} to channels: ${channels.join(', ')}`); + this.logger.debug( + `Notification sent: ${notification.type} to channels: ${channels.join(', ')}`, + ); } async broadcastEvent(event: MatchingEvent) { @@ -248,23 +273,32 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, this.server.to('matches').emit('matching_event', event); if (event.data.buyerOrderId) { - this.server.to(`order_${event.data.buyerOrderId}`).emit('matching_event', event); + this.server + .to(`order_${event.data.buyerOrderId}`) + .emit('matching_event', event); } if (event.data.sellerOrderId) { - this.server.to(`order_${event.data.sellerOrderId}`).emit('matching_event', event); + this.server + .to(`order_${event.data.sellerOrderId}`) + .emit('matching_event', event); } this.logger.debug(`Event broadcasted: ${event.type}`); } - private determineNotificationChannels(notification: NotificationPayload): string[] { + private determineNotificationChannels( + notification: NotificationPayload, + ): string[] { const channels: string[] = []; switch (notification.type) { case 'match_created': channels.push('matches'); - if (notification.priority === 'high' || notification.priority === 'urgent') { + if ( + notification.priority === 'high' || + notification.priority === 'urgent' + ) { channels.push('urgent_matches'); } break; @@ -290,7 +324,9 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, return channels; } - async sendCustomNotification(notification: Omit) { + async sendCustomNotification( + notification: Omit, + ) { const fullNotification: NotificationPayload = { ...notification, timestamp: new Date(), @@ -317,17 +353,17 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, private async authenticateClient(client: Socket, userId: string) { client.data.userId = userId; - + const room = `user_${userId}`; await client.join(room); - + if (!this.userSubscriptions.has(userId)) { this.userSubscriptions.set(userId, new Set()); } - this.userSubscriptions.get(userId)!.add(client.id); - + this.userSubscriptions.get(userId).add(client.id); + this.logger.debug(`Client ${client.id} authenticated as user ${userId}`); - + client.emit('authenticated', { userId, timestamp: new Date() }); } @@ -335,9 +371,11 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, for (const channel of channels) { await client.join(channel); } - - this.logger.debug(`Client ${client.id} subscribed to channels: ${channels.join(', ')}`); - + + this.logger.debug( + `Client ${client.id} subscribed to channels: ${channels.join(', ')}`, + ); + client.emit('subscribed', { type: 'channels', channels }); } @@ -345,9 +383,11 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, for (const channel of channels) { await client.leave(channel); } - - this.logger.debug(`Client ${client.id} unsubscribed from channels: ${channels.join(', ')}`); - + + this.logger.debug( + `Client ${client.id} unsubscribed from channels: ${channels.join(', ')}`, + ); + client.emit('unsubscribed', { type: 'channels', channels }); } @@ -375,7 +415,10 @@ export class MatchingEventsService implements OnModuleInit, OnGatewayConnection, return Array.from(channels); } - async sendSystemMessage(message: string, priority: 'info' | 'warning' | 'error' = 'info') { + async sendSystemMessage( + message: string, + priority: 'info' | 'warning' | 'error' = 'info', + ) { const systemMessage = { type: 'system_message', message, diff --git a/src/matching/matching.module.ts b/src/matching/matching.module.ts index 624b053..b19617f 100644 --- a/src/matching/matching.module.ts +++ b/src/matching/matching.module.ts @@ -21,4 +21,4 @@ import { MatchingEventsService } from './events/matching-events.service'; ], exports: [MatchingService, AuditService, MatchingEventsService], }) -export class MatchingModule { } +export class MatchingModule {} diff --git a/src/matching/matching.service.ts b/src/matching/matching.service.ts index db3ae13..bc6ef21 100644 --- a/src/matching/matching.service.ts +++ b/src/matching/matching.service.ts @@ -4,14 +4,35 @@ import { Repository, DataSource, LessThan } from 'typeorm'; import { Cron, CronExpression } from '@nestjs/schedule'; import { Order } from '../modules/energy/entities/order.entity'; import { Match, MatchStatus, MatchType } from './entities/match.entity'; -import { MatchingRule, RuleStatus, RuleType } from './entities/matching-rule.entity'; -import { MatchingPreferencesDto, MatchingStrategy } from './dto/matching-preferences.dto'; -import { PriorityMatchingAlgorithm, PriorityMatchResult } from './algorithms/priority-matching.algorithm'; -import { GeographicMatchingAlgorithm, GeographicMatchResult } from './algorithms/geographic-matching.algorithm'; -import { PartialFulfillmentAlgorithm, PartialFulfillmentResult } from './algorithms/partial-fulfillment.algorithm'; +import { + MatchingRule, + RuleStatus, + RuleType, +} from './entities/matching-rule.entity'; +import { + MatchingPreferencesDto, + MatchingStrategy, +} from './dto/matching-preferences.dto'; +import { + PriorityMatchingAlgorithm, + PriorityMatchResult, +} from './algorithms/priority-matching.algorithm'; +import { + GeographicMatchingAlgorithm, + GeographicMatchResult, +} from './algorithms/geographic-matching.algorithm'; +import { + PartialFulfillmentAlgorithm, + PartialFulfillmentResult, +} from './algorithms/partial-fulfillment.algorithm'; export interface MatchingEvent { - type: 'match_created' | 'match_confirmed' | 'match_rejected' | 'match_expired' | 'conflict_resolved'; + type: + | 'match_created' + | 'match_confirmed' + | 'match_rejected' + | 'match_expired' + | 'conflict_resolved'; data: any; timestamp: Date; } @@ -83,18 +104,18 @@ export class MatchingService implements OnModuleInit { async initializeMetrics() { const totalOrders = await this.orderRepository.count(); const totalMatches = await this.matchRepository.count(); - + this.metrics.totalOrders = totalOrders; this.metrics.totalMatches = totalMatches; - + const matchesByType = await this.matchRepository .createQueryBuilder('match') .select('match.type', 'type') .addSelect('COUNT(*)', 'count') .groupBy('match.type') .getRawMany(); - - matchesByType.forEach(item => { + + matchesByType.forEach((item) => { this.metrics.matchesByType[item.type as MatchType] = parseInt(item.count); }); @@ -104,9 +125,11 @@ export class MatchingService implements OnModuleInit { .addSelect('COUNT(*)', 'count') .groupBy('match.status') .getRawMany(); - - matchesByStatus.forEach(item => { - this.metrics.matchesByStatus[item.status as MatchStatus] = parseInt(item.count); + + matchesByStatus.forEach((item) => { + this.metrics.matchesByStatus[item.status as MatchStatus] = parseInt( + item.count, + ); }); } @@ -121,7 +144,7 @@ export class MatchingService implements OnModuleInit { async addOrderToQueue(order: Order) { this.orderQueue.push(order); this.logger.log(`Order ${order.id} added to matching queue`); - + if (!this.matchingInProgress) { setImmediate(() => this.processOrderQueue()); } @@ -139,15 +162,27 @@ export class MatchingService implements OnModuleInit { const ordersToProcess = [...this.orderQueue]; this.orderQueue = []; - const buyOrders = ordersToProcess.filter(order => order.type === 'buy'); - const sellOrders = ordersToProcess.filter(order => order.type === 'sell'); + const buyOrders = ordersToProcess.filter((order) => order.type === 'buy'); + const sellOrders = ordersToProcess.filter( + (order) => order.type === 'sell', + ); const pendingOrders = await this.getPendingOrders(); - const allBuyOrders = [...buyOrders, ...pendingOrders.filter(order => order.type === 'buy')]; - const allSellOrders = [...sellOrders, ...pendingOrders.filter(order => order.type === 'sell')]; + const allBuyOrders = [ + ...buyOrders, + ...pendingOrders.filter((order) => order.type === 'buy'), + ]; + const allSellOrders = [ + ...sellOrders, + ...pendingOrders.filter((order) => order.type === 'sell'), + ]; const preferences = this.getDefaultPreferences(); - const results = await this.runMatchingAlgorithms(allBuyOrders, allSellOrders, preferences); + const results = await this.runMatchingAlgorithms( + allBuyOrders, + allSellOrders, + preferences, + ); const conflicts = await this.detectConflicts(results.matches); if (conflicts.length > 0) { @@ -162,8 +197,9 @@ export class MatchingService implements OnModuleInit { const processingTime = Date.now() - startTime; await this.updateMetrics(results, processingTime); - this.logger.log(`Processed ${ordersToProcess.length} orders in ${processingTime}ms. Created ${results.matches.length} matches`); - + this.logger.log( + `Processed ${ordersToProcess.length} orders in ${processingTime}ms. Created ${results.matches.length} matches`, + ); } catch (error) { this.logger.error('Error during order processing', error); } finally { @@ -187,7 +223,10 @@ export class MatchingService implements OnModuleInit { const allRejectedOrders: string[] = []; let totalProcessingTime = 0; - if (preferences.strategy === MatchingStrategy.PRIORITY || preferences.strategy === MatchingStrategy.BALANCED) { + if ( + preferences.strategy === MatchingStrategy.PRIORITY || + preferences.strategy === MatchingStrategy.BALANCED + ) { const priorityResult = await this.priorityAlgorithm.findMatches( buyOrders, sellOrders, @@ -199,7 +238,10 @@ export class MatchingService implements OnModuleInit { totalProcessingTime += priorityResult.processingTime; } - if (preferences.strategy === MatchingStrategy.PROXIMITY_FIRST || preferences.strategy === MatchingStrategy.BALANCED) { + if ( + preferences.strategy === MatchingStrategy.PROXIMITY_FIRST || + preferences.strategy === MatchingStrategy.BALANCED + ) { const geoResult = await this.geographicAlgorithm.findMatches( buyOrders, sellOrders, @@ -224,7 +266,10 @@ export class MatchingService implements OnModuleInit { } const deduplicatedMatches = this.deduplicateMatches(allMatches); - const finalMatches = this.selectBestMatches(deduplicatedMatches, buyOrders.length + sellOrders.length); + const finalMatches = this.selectBestMatches( + deduplicatedMatches, + buyOrders.length + sellOrders.length, + ); return { matches: finalMatches, @@ -250,13 +295,15 @@ export class MatchingService implements OnModuleInit { selectBestMatches(matches: Match[], totalOrders: number): Match[] { const maxMatches = Math.min(matches.length, Math.floor(totalOrders * 0.8)); - + return matches .sort((a, b) => (b.matchingScore || 0) - (a.matchingScore || 0)) .slice(0, maxMatches); } - async detectConflicts(matches: Match[]): Promise> { + async detectConflicts( + matches: Match[], + ): Promise> { const conflicts: Array<{ matches: Match[]; conflictType: string }> = []; const orderMatches = new Map(); @@ -264,12 +311,12 @@ export class MatchingService implements OnModuleInit { if (!orderMatches.has(match.buyerOrderId)) { orderMatches.set(match.buyerOrderId, []); } - orderMatches.get(match.buyerOrderId)!.push(match); + orderMatches.get(match.buyerOrderId).push(match); if (!orderMatches.has(match.sellerOrderId)) { orderMatches.set(match.sellerOrderId, []); } - orderMatches.get(match.sellerOrderId)!.push(match); + orderMatches.get(match.sellerOrderId).push(match); } for (const [orderId, orderMatches] of orderMatches) { @@ -284,25 +331,34 @@ export class MatchingService implements OnModuleInit { return conflicts; } - async resolveConflicts(conflicts: Array<{ matches: Match[]; conflictType: string }>): Promise { + async resolveConflicts( + conflicts: Array<{ matches: Match[]; conflictType: string }>, + ): Promise { const resolvedMatches: Match[] = []; const rejectedMatchIds = new Set(); for (const conflict of conflicts) { const resolution = await this.resolveConflict(conflict); - + resolvedMatches.push(...resolution.resolvedMatches); - resolution.rejectedMatches.forEach(match => rejectedMatchIds.add(match.id)); + resolution.rejectedMatches.forEach((match) => + rejectedMatchIds.add(match.id), + ); } - return resolvedMatches.filter(match => !rejectedMatchIds.has(match.id)); + return resolvedMatches.filter((match) => !rejectedMatchIds.has(match.id)); } - async resolveConflict(conflict: { matches: Match[]; conflictType: string }): Promise { + async resolveConflict(conflict: { + matches: Match[]; + conflictType: string; + }): Promise { const conflictId = `conflict_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; - - const sortedMatches = conflict.matches.sort((a, b) => (b.matchingScore || 0) - (a.matchingScore || 0)); - + + const sortedMatches = conflict.matches.sort( + (a, b) => (b.matchingScore || 0) - (a.matchingScore || 0), + ); + const bestMatch = sortedMatches[0]; const resolvedMatches = [bestMatch]; const rejectedMatches = sortedMatches.slice(1); @@ -317,17 +373,19 @@ export class MatchingService implements OnModuleInit { }; await this.logConflictResolution(resolution); - + return resolution; } async logConflictResolution(resolution: ConflictResolution) { - this.logger.warn(`Conflict resolved: ${resolution.conflictId} - ${resolution.reason}`); - + this.logger.warn( + `Conflict resolved: ${resolution.conflictId} - ${resolution.reason}`, + ); + for (const match of resolution.resolvedMatches) { if (!match.metadata) match.metadata = {}; if (!match.metadata.auditTrail) match.metadata.auditTrail = []; - + match.metadata.auditTrail.push({ timestamp: new Date(), action: 'conflict_resolved', @@ -341,7 +399,7 @@ export class MatchingService implements OnModuleInit { if (matches.length === 0) return []; const savedMatches = await this.matchRepository.save(matches); - + for (const match of savedMatches) { this.emitEvent('match_created', { matchId: match.id, @@ -387,20 +445,23 @@ export class MatchingService implements OnModuleInit { data, timestamp: new Date(), }; - + this.eventEmitter.emit('matching', event); } async updateMetrics(results: any, processingTime: number) { this.metrics.totalOrders += results.rejectedOrders.length; this.metrics.totalMatches += results.matches.length; - this.metrics.successRate = this.metrics.totalMatches / (this.metrics.totalOrders || 1); - this.metrics.averageProcessingTime = + this.metrics.successRate = + this.metrics.totalMatches / (this.metrics.totalOrders || 1); + this.metrics.averageProcessingTime = (this.metrics.averageProcessingTime + processingTime) / 2; for (const match of results.matches) { - this.metrics.matchesByType[match.type] = (this.metrics.matchesByType[match.type] || 0) + 1; - this.metrics.matchesByStatus[match.status] = (this.metrics.matchesByStatus[match.status] || 0) + 1; + this.metrics.matchesByType[match.type] = + (this.metrics.matchesByType[match.type] || 0) + 1; + this.metrics.matchesByStatus[match.status] = + (this.metrics.matchesByStatus[match.status] || 0) + 1; } } @@ -436,7 +497,9 @@ export class MatchingService implements OnModuleInit { } async confirmMatch(matchId: string, userId: string): Promise { - const match = await this.matchRepository.findOne({ where: { id: matchId } }); + const match = await this.matchRepository.findOne({ + where: { id: matchId }, + }); if (!match) { throw new Error(`Match ${matchId} not found`); } @@ -446,10 +509,10 @@ export class MatchingService implements OnModuleInit { } match.status = MatchStatus.CONFIRMED; - + if (!match.metadata) match.metadata = {}; if (!match.metadata.auditTrail) match.metadata.auditTrail = []; - + match.metadata.auditTrail.push({ timestamp: new Date(), action: 'match_confirmed', @@ -458,7 +521,7 @@ export class MatchingService implements OnModuleInit { }); const savedMatch = await this.matchRepository.save(match); - + this.emitEvent('match_confirmed', { matchId: savedMatch.id, confirmedBy: userId, @@ -467,17 +530,23 @@ export class MatchingService implements OnModuleInit { return savedMatch; } - async rejectMatch(matchId: string, userId: string, reason?: string): Promise { - const match = await this.matchRepository.findOne({ where: { id: matchId } }); + async rejectMatch( + matchId: string, + userId: string, + reason?: string, + ): Promise { + const match = await this.matchRepository.findOne({ + where: { id: matchId }, + }); if (!match) { throw new Error(`Match ${matchId} not found`); } match.status = MatchStatus.REJECTED; - + if (!match.metadata) match.metadata = {}; if (!match.metadata.auditTrail) match.metadata.auditTrail = []; - + match.metadata.auditTrail.push({ timestamp: new Date(), action: 'match_rejected', @@ -486,7 +555,7 @@ export class MatchingService implements OnModuleInit { }); const savedMatch = await this.matchRepository.save(match); - + this.emitEvent('match_rejected', { matchId: savedMatch.id, rejectedBy: userId, @@ -505,10 +574,7 @@ export class MatchingService implements OnModuleInit { async getMatchesByOrder(orderId: string): Promise { return this.matchRepository.find({ - where: [ - { buyerOrderId: orderId }, - { sellerOrderId: orderId }, - ], + where: [{ buyerOrderId: orderId }, { sellerOrderId: orderId }], order: { createdAt: 'DESC' }, }); } @@ -532,10 +598,10 @@ export class MatchingService implements OnModuleInit { if (expiredMatches.length > 0) { for (const match of expiredMatches) { match.status = MatchStatus.CANCELLED; - + if (!match.metadata) match.metadata = {}; if (!match.metadata.auditTrail) match.metadata.auditTrail = []; - + match.metadata.auditTrail.push({ timestamp: new Date(), action: 'match_expired', @@ -567,11 +633,15 @@ export class MatchingService implements OnModuleInit { if (allOrders.length === 0) return []; - const buyOrders = allOrders.filter(order => order.type === 'buy'); - const sellOrders = allOrders.filter(order => order.type === 'sell'); + const buyOrders = allOrders.filter((order) => order.type === 'buy'); + const sellOrders = allOrders.filter((order) => order.type === 'sell'); const matchingPreferences = preferences || this.getDefaultPreferences(); - const results = await this.runMatchingAlgorithms(buyOrders, sellOrders, matchingPreferences); + const results = await this.runMatchingAlgorithms( + buyOrders, + sellOrders, + matchingPreferences, + ); const conflicts = await this.detectConflicts(results.matches); if (conflicts.length > 0) { diff --git a/src/monitoring/alerts/alert.service.ts b/src/monitoring/alerts/alert.service.ts index 8b3d9ae..de85ed0 100644 --- a/src/monitoring/alerts/alert.service.ts +++ b/src/monitoring/alerts/alert.service.ts @@ -1,7 +1,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { TransactionStatusEntity, TransactionStatus, TransactionPriority } from '../entities/transaction-status.entity'; +import { + TransactionStatusEntity, + TransactionStatus, + TransactionPriority, +} from '../entities/transaction-status.entity'; export interface AlertChannel { name: string; @@ -20,42 +24,42 @@ export interface Alert { export class EmailAlertChannel implements AlertChannel { name = 'email'; - + isEnabled(): boolean { return process.env.ALERT_EMAIL_ENABLED === 'true'; } async send(alert: Alert): Promise { if (!this.isEnabled()) return; - + this.logger.log(`Email alert sent: ${alert.message}`); } } export class SlackAlertChannel implements AlertChannel { name = 'slack'; - + isEnabled(): boolean { return process.env.ALERT_SLACK_ENABLED === 'true'; } async send(alert: Alert): Promise { if (!this.isEnabled()) return; - + this.logger.log(`Slack alert sent: ${alert.message}`); } } export class WebhookAlertChannel implements AlertChannel { name = 'webhook'; - + isEnabled(): boolean { return process.env.ALERT_WEBHOOK_ENABLED === 'true'; } async send(alert: Alert): Promise { if (!this.isEnabled()) return; - + this.logger.log(`Webhook alert sent: ${alert.message}`); } } @@ -102,7 +106,10 @@ export class AlertService { await this.recordAlert(transaction, alert); } - async sendCriticalAlert(message: string, metadata?: Record): Promise { + async sendCriticalAlert( + message: string, + metadata?: Record, + ): Promise { const alert: Alert = { type: 'critical', severity: 'critical', @@ -119,7 +126,10 @@ export class AlertService { transaction: TransactionStatusEntity, errorMessage: string, ): Promise { - const severity = transaction.priority === TransactionPriority.CRITICAL ? 'critical' : 'high'; + const severity = + transaction.priority === TransactionPriority.CRITICAL + ? 'critical' + : 'high'; const message = `Transaction ${transaction.transactionHash} failed: ${errorMessage}`; const alert: Alert = { @@ -141,7 +151,10 @@ export class AlertService { } async sendTimeoutAlert(transaction: TransactionStatusEntity): Promise { - const severity = transaction.priority === TransactionPriority.CRITICAL ? 'critical' : 'high'; + const severity = + transaction.priority === TransactionPriority.CRITICAL + ? 'critical' + : 'high'; const message = `Transaction ${transaction.transactionHash} timed out after 5 minutes`; const alert: Alert = { @@ -160,7 +173,10 @@ export class AlertService { await this.recordAlert(transaction, alert); } - async sendRetryAlert(transaction: TransactionStatusEntity, attempt: number): Promise { + async sendRetryAlert( + transaction: TransactionStatusEntity, + attempt: number, + ): Promise { const message = `Retrying transaction ${transaction.transactionHash} (attempt ${attempt}/${transaction.maxRetries})`; const alert: Alert = { @@ -211,18 +227,22 @@ export class AlertService { return; } - const enabledChannels = Array.from(this.channels.values()).filter(channel => - channel.isEnabled() && this.shouldSendToChannel(alert.severity, channel.name) + const enabledChannels = Array.from(this.channels.values()).filter( + (channel) => + channel.isEnabled() && + this.shouldSendToChannel(alert.severity, channel.name), ); - const promises = enabledChannels.map(channel => - channel.send(alert).catch(error => - this.logger.error(`Failed to send alert via ${channel.name}:`, error) - ) + const promises = enabledChannels.map((channel) => + channel + .send(alert) + .catch((error) => + this.logger.error(`Failed to send alert via ${channel.name}:`, error), + ), ); await Promise.allSettled(promises); - + this.updateRateLimiter(alert.type); this.logger.log(`Alert sent: ${alert.message} (${alert.severity})`); } @@ -233,11 +253,11 @@ export class AlertService { ): Promise { const alerts = this.alertHistory.get(transaction.transactionHash) || []; alerts.push(alert); - + if (alerts.length > 100) { alerts.shift(); } - + this.alertHistory.set(transaction.transactionHash, alerts); const entityAlerts = transaction.alerts || []; @@ -250,7 +270,7 @@ export class AlertService { await this.transactionStatusRepository.update( { transactionHash: transaction.transactionHash }, - { alerts: entityAlerts } + { alerts: entityAlerts }, ); } @@ -258,14 +278,17 @@ export class AlertService { status: TransactionStatus, priority: TransactionPriority, ): 'low' | 'medium' | 'high' | 'critical' { - if (status === TransactionStatus.FAILED || status === TransactionStatus.TIMEOUT) { + if ( + status === TransactionStatus.FAILED || + status === TransactionStatus.TIMEOUT + ) { return priority === TransactionPriority.CRITICAL ? 'critical' : 'high'; } - + if (status === TransactionStatus.RETRYING) { return priority === TransactionPriority.CRITICAL ? 'high' : 'medium'; } - + return 'low'; } @@ -298,7 +321,7 @@ export class AlertService { async getSystemAlerts(limit: number = 100): Promise { const allAlerts: Alert[] = []; - + for (const alerts of this.alertHistory.values()) { allAlerts.push(...alerts); } @@ -315,20 +338,26 @@ export class AlertService { rateLimitedTypes: string[]; } { const allAlerts: Alert[] = []; - + for (const alerts of this.alertHistory.values()) { allAlerts.push(...alerts); } - const alertsByType = allAlerts.reduce((acc, alert) => { - acc[alert.type] = (acc[alert.type] || 0) + 1; - return acc; - }, {} as Record); + const alertsByType = allAlerts.reduce( + (acc, alert) => { + acc[alert.type] = (acc[alert.type] || 0) + 1; + return acc; + }, + {} as Record, + ); - const alertsBySeverity = allAlerts.reduce((acc, alert) => { - acc[alert.severity] = (acc[alert.severity] || 0) + 1; - return acc; - }, {} as Record); + const alertsBySeverity = allAlerts.reduce( + (acc, alert) => { + acc[alert.severity] = (acc[alert.severity] || 0) + 1; + return acc; + }, + {} as Record, + ); return { totalAlerts: allAlerts.length, diff --git a/src/monitoring/dto/transaction-status.dto.ts b/src/monitoring/dto/transaction-status.dto.ts index 57ef7fd..d47e01a 100644 --- a/src/monitoring/dto/transaction-status.dto.ts +++ b/src/monitoring/dto/transaction-status.dto.ts @@ -1,6 +1,20 @@ -import { IsString, IsEnum, IsOptional, IsNumber, IsDateString, IsObject, IsBoolean, IsArray, ValidateNested, IsUUID } from 'class-validator'; +import { + IsString, + IsEnum, + IsOptional, + IsNumber, + IsDateString, + IsObject, + IsBoolean, + IsArray, + ValidateNested, + IsUUID, +} from 'class-validator'; import { Type } from 'class-transformer'; -import { TransactionStatus, TransactionPriority } from '../entities/transaction-status.entity'; +import { + TransactionStatus, + TransactionPriority, +} from '../entities/transaction-status.entity'; export class CreateTransactionStatusDto { @IsString() @@ -275,11 +289,14 @@ export class TransactionAnalyticsDto { priorityBreakdown: Record; @IsObject() - hourlyStats: Record; + hourlyStats: Record< + string, + { + count: number; + successRate: number; + averageTime: number; + } + >; } export class RetryTransactionDto { diff --git a/src/monitoring/entities/transaction-status.entity.ts b/src/monitoring/entities/transaction-status.entity.ts index 8fb1e4c..ce09221 100644 --- a/src/monitoring/entities/transaction-status.entity.ts +++ b/src/monitoring/entities/transaction-status.entity.ts @@ -1,18 +1,25 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, +} from 'typeorm'; export enum TransactionStatus { PENDING = 'pending', CONFIRMED = 'confirmed', FAILED = 'failed', RETRYING = 'retrying', - TIMEOUT = 'timeout' + TIMEOUT = 'timeout', } export enum TransactionPriority { LOW = 'low', MEDIUM = 'medium', HIGH = 'high', - CRITICAL = 'critical' + CRITICAL = 'critical', } @Entity('transaction_status') @@ -30,14 +37,14 @@ export class TransactionStatusEntity { @Column({ type: 'enum', enum: TransactionStatus, - default: TransactionStatus.PENDING + default: TransactionStatus.PENDING, }) status: TransactionStatus; @Column({ type: 'enum', enum: TransactionPriority, - default: TransactionPriority.MEDIUM + default: TransactionPriority.MEDIUM, }) priority: TransactionPriority; diff --git a/src/monitoring/monitoring.controller.ts b/src/monitoring/monitoring.controller.ts index a4d4fb3..2d0b2bc 100644 --- a/src/monitoring/monitoring.controller.ts +++ b/src/monitoring/monitoring.controller.ts @@ -1,10 +1,15 @@ import { Controller, Get, Post, Body, Query, Param } from '@nestjs/common'; import { TransactionMonitorService } from './transaction-monitor.service'; -import { CreateTransactionStatusDto, TransactionStatusQueryDto } from './dto/transaction-status.dto'; +import { + CreateTransactionStatusDto, + TransactionStatusQueryDto, +} from './dto/transaction-status.dto'; @Controller('monitoring') export class MonitoringController { - constructor(private readonly transactionMonitorService: TransactionMonitorService) {} + constructor( + private readonly transactionMonitorService: TransactionMonitorService, + ) {} @Post('transactions') async createTransaction(@Body() createDto: CreateTransactionStatusDto) { @@ -22,7 +27,9 @@ export class MonitoringController { } @Get('analytics') - async getAnalytics(@Query('timeRange') timeRange: 'hour' | 'day' | 'week' | 'month' = 'day') { + async getAnalytics( + @Query('timeRange') timeRange: 'hour' | 'day' | 'week' | 'month' = 'day', + ) { return this.transactionMonitorService.getTransactionAnalytics(timeRange); } diff --git a/src/monitoring/retry/retry.service.ts b/src/monitoring/retry/retry.service.ts index 968da2c..45f26cc 100644 --- a/src/monitoring/retry/retry.service.ts +++ b/src/monitoring/retry/retry.service.ts @@ -1,7 +1,11 @@ import { Injectable, Logger, OnModuleDestroy } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { TransactionStatusEntity, TransactionStatus, TransactionPriority } from '../entities/transaction-status.entity'; +import { + TransactionStatusEntity, + TransactionStatus, + TransactionPriority, +} from '../entities/transaction-status.entity'; import { RetryTransactionDto } from '../dto/transaction-status.dto'; const StellarSdk = require('stellar-sdk'); @@ -33,9 +37,9 @@ export class ExponentialBackoffStrategy implements RetryStrategy { ]; const errorMessage = error?.message?.toLowerCase() || ''; - - return !nonRetryableErrors.some(nonRetryableError => - errorMessage.includes(nonRetryableError) + + return !nonRetryableErrors.some((nonRetryableError) => + errorMessage.includes(nonRetryableError), ); } @@ -75,8 +79,8 @@ export class LinearBackoffStrategy implements RetryStrategy { ]; const errorMessage = error?.message?.toLowerCase() || ''; - return transientErrors.some(transientError => - errorMessage.includes(transientError) + return transientErrors.some((transientError) => + errorMessage.includes(transientError), ); } @@ -112,26 +116,36 @@ export class RetryService { this.strategies.set('default', new ExponentialBackoffStrategy()); } - async scheduleRetry(transaction: TransactionStatusEntity, strategy: string = 'exponential'): Promise { + async scheduleRetry( + transaction: TransactionStatusEntity, + strategy: string = 'exponential', + ): Promise { if (this.activeRetries.has(transaction.transactionHash)) { - this.logger.warn(`Retry already in progress for transaction ${transaction.transactionHash}`); + this.logger.warn( + `Retry already in progress for transaction ${transaction.transactionHash}`, + ); return; } - const retryStrategy = this.strategies.get(strategy) || this.strategies.get('default')!; - - if (!retryStrategy.shouldRetry( - { message: transaction.errorMessage }, - transaction.retryCount, - transaction.maxRetries - )) { - this.logger.log(`Transaction ${transaction.transactionHash} should not be retried`); + const retryStrategy = + this.strategies.get(strategy) || this.strategies.get('default'); + + if ( + !retryStrategy.shouldRetry( + { message: transaction.errorMessage }, + transaction.retryCount, + transaction.maxRetries, + ) + ) { + this.logger.log( + `Transaction ${transaction.transactionHash} should not be retried`, + ); return; } const delay = retryStrategy.calculateDelay( transaction.retryCount + 1, - transaction.priority + transaction.priority, ); this.activeRetries.add(transaction.transactionHash); @@ -140,7 +154,10 @@ export class RetryService { try { await this.executeRetry(transaction); } catch (error) { - this.logger.error(`Retry failed for transaction ${transaction.transactionHash}:`, error); + this.logger.error( + `Retry failed for transaction ${transaction.transactionHash}:`, + error, + ); } finally { this.activeRetries.delete(transaction.transactionHash); this.retryQueue.delete(transaction.transactionHash); @@ -150,23 +167,32 @@ export class RetryService { this.retryQueue.set(transaction.transactionHash, retryTimeout); await this.updateTransactionForRetry(transaction); - + this.logger.log( - `Scheduled retry for transaction ${transaction.transactionHash} in ${delay}ms (attempt ${transaction.retryCount + 1}/${transaction.maxRetries})` + `Scheduled retry for transaction ${transaction.transactionHash} in ${delay}ms (attempt ${transaction.retryCount + 1}/${transaction.maxRetries})`, ); } - async manualRetry(retryDto: RetryTransactionDto): Promise { + async manualRetry( + retryDto: RetryTransactionDto, + ): Promise { const transaction = await this.transactionStatusRepository.findOne({ where: { id: retryDto.transactionId }, }); if (!transaction) { - throw new Error(`Transaction with ID ${retryDto.transactionId} not found`); + throw new Error( + `Transaction with ID ${retryDto.transactionId} not found`, + ); } - if (transaction.status !== TransactionStatus.FAILED && transaction.status !== TransactionStatus.TIMEOUT) { - throw new Error(`Cannot retry transaction with status ${transaction.status}`); + if ( + transaction.status !== TransactionStatus.FAILED && + transaction.status !== TransactionStatus.TIMEOUT + ) { + throw new Error( + `Cannot retry transaction with status ${transaction.status}`, + ); } if (retryDto.priority) { @@ -185,11 +211,15 @@ export class RetryService { } async executeRetry(transaction: TransactionStatusEntity): Promise { - this.logger.log(`Executing retry for transaction ${transaction.transactionHash}`); + this.logger.log( + `Executing retry for transaction ${transaction.transactionHash}`, + ); try { - const transactionStatus = await this.checkTransactionOnNetwork(transaction.transactionHash); - + const transactionStatus = await this.checkTransactionOnNetwork( + transaction.transactionHash, + ); + if (transactionStatus.successful) { await this.transactionStatusRepository.update( { transactionHash: transaction.transactionHash }, @@ -198,20 +228,23 @@ export class RetryService { confirmedAt: new Date(), ledgerSequence: transactionStatus.ledger, errorMessage: undefined, - } + }, + ); + + this.logger.log( + `Transaction ${transaction.transactionHash} was confirmed during retry check`, ); - - this.logger.log(`Transaction ${transaction.transactionHash} was confirmed during retry check`); return; } if (!transactionStatus.successful) { - throw new Error(`Transaction failed on network: ${transactionStatus.result_xdr}`); + throw new Error( + `Transaction failed on network: ${transactionStatus.result_xdr}`, + ); } - } catch (error: any) { - const retryStrategy = this.strategies.get('exponential')!; - + const retryStrategy = this.strategies.get('exponential'); + transaction.retryCount++; transaction.errorMessage = error.message; transaction.lastRetryAt = new Date(); @@ -219,33 +252,43 @@ export class RetryService { if (transaction.retryCount >= transaction.maxRetries) { transaction.status = TransactionStatus.FAILED; await this.transactionStatusRepository.save(transaction); - + this.logger.error( - `Transaction ${transaction.transactionHash} failed after ${transaction.maxRetries} retries` + `Transaction ${transaction.transactionHash} failed after ${transaction.maxRetries} retries`, + ); + + throw new Error( + `Transaction failed after maximum retries: ${error.message}`, ); - - throw new Error(`Transaction failed after maximum retries: ${error.message}`); } - if (retryStrategy.shouldRetry(error, transaction.retryCount, transaction.maxRetries)) { + if ( + retryStrategy.shouldRetry( + error, + transaction.retryCount, + transaction.maxRetries, + ) + ) { transaction.status = TransactionStatus.RETRYING; await this.transactionStatusRepository.save(transaction); - + await this.scheduleRetry(transaction); } else { transaction.status = TransactionStatus.FAILED; await this.transactionStatusRepository.save(transaction); - + this.logger.error( - `Transaction ${transaction.transactionHash} marked as failed due to non-retryable error: ${error.message}` + `Transaction ${transaction.transactionHash} marked as failed due to non-retryable error: ${error.message}`, ); - + throw new Error(`Non-retryable error: ${error.message}`); } } } - private async checkTransactionOnNetwork(transactionHash: string): Promise { + private async checkTransactionOnNetwork( + transactionHash: string, + ): Promise { const StellarSdk = require('stellar-sdk'); const server = new StellarSdk.Horizon.Server( process.env.STELLAR_HORIZON_URL || 'https://horizon-testnet.stellar.org', @@ -261,14 +304,16 @@ export class RetryService { } } - private async updateTransactionForRetry(transaction: TransactionStatusEntity): Promise { + private async updateTransactionForRetry( + transaction: TransactionStatusEntity, + ): Promise { await this.transactionStatusRepository.update( { transactionHash: transaction.transactionHash }, { status: TransactionStatus.RETRYING, retryCount: transaction.retryCount + 1, lastRetryAt: new Date(), - } + }, ); } @@ -278,23 +323,23 @@ export class RetryService { clearTimeout(retryTimeout); this.retryQueue.delete(transactionHash); this.activeRetries.delete(transactionHash); - + await this.transactionStatusRepository.update( { transactionHash }, - { status: TransactionStatus.FAILED } + { status: TransactionStatus.FAILED }, ); - + this.logger.log(`Cancelled retry for transaction ${transactionHash}`); } } async cancelAllRetries(): Promise { const retryHashes = Array.from(this.retryQueue.keys()); - + for (const hash of retryHashes) { await this.cancelRetry(hash); } - + this.logger.log(`Cancelled ${retryHashes.length} pending retries`); } @@ -336,11 +381,11 @@ export class RetryService { error?: string; delay: number; }> = []; - + for (let i = 1; i <= transaction.retryCount; i++) { - const strategy = this.strategies.get('exponential')!; + const strategy = this.strategies.get('exponential'); const delay = strategy.calculateDelay(i, transaction.priority); - + retryHistory.push({ attempt: i, timestamp: new Date(transaction.createdAt.getTime() + delay * i), @@ -360,10 +405,7 @@ export class RetryService { async prioritizeRetries(): Promise { const retryingTransactions = await this.transactionStatusRepository.find({ where: { status: TransactionStatus.RETRYING }, - order: [ - { priority: 'DESC' }, - { lastRetryAt: 'ASC' }, - ] as any, + order: [{ priority: 'DESC' }, { lastRetryAt: 'ASC' }] as any, }); for (const transaction of retryingTransactions) { @@ -372,7 +414,9 @@ export class RetryService { } } - this.logger.log(`Reprioritized ${retryingTransactions.length} retrying transactions`); + this.logger.log( + `Reprioritized ${retryingTransactions.length} retrying transactions`, + ); } registerRetryStrategy(name: string, strategy: RetryStrategy): void { diff --git a/src/monitoring/transaction-monitor.service.ts b/src/monitoring/transaction-monitor.service.ts index 3866429..fe34dc7 100644 --- a/src/monitoring/transaction-monitor.service.ts +++ b/src/monitoring/transaction-monitor.service.ts @@ -2,8 +2,16 @@ import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, LessThan, MoreThan, Between } from 'typeorm'; import { Cron, CronExpression } from '@nestjs/schedule'; -import { TransactionStatusEntity, TransactionStatus, TransactionPriority } from './entities/transaction-status.entity'; -import { CreateTransactionStatusDto, TransactionStatusQueryDto, TransactionAnalyticsDto } from './dto/transaction-status.dto'; +import { + TransactionStatusEntity, + TransactionStatus, + TransactionPriority, +} from './entities/transaction-status.entity'; +import { + CreateTransactionStatusDto, + TransactionStatusQueryDto, + TransactionAnalyticsDto, +} from './dto/transaction-status.dto'; import { RetryService } from './retry/retry.service'; import { AlertService } from './alerts/alert.service'; @@ -31,7 +39,9 @@ export class TransactionMonitorService implements OnModuleInit { await this.loadPendingTransactions(); } - async createTransaction(createDto: CreateTransactionStatusDto): Promise { + async createTransaction( + createDto: CreateTransactionStatusDto, + ): Promise { const transaction = this.transactionStatusRepository.create({ ...createDto, status: TransactionStatus.PENDING, @@ -39,15 +49,20 @@ export class TransactionMonitorService implements OnModuleInit { maxRetries: createDto.maxRetries || 3, }); - const savedTransaction = await this.transactionStatusRepository.save(transaction); - + const savedTransaction = + await this.transactionStatusRepository.save(transaction); + this.startMonitoring(savedTransaction.transactionHash); - - this.logger.log(`Created transaction monitor for ${savedTransaction.transactionHash}`); + + this.logger.log( + `Created transaction monitor for ${savedTransaction.transactionHash}`, + ); return savedTransaction; } - async getTransaction(transactionHash: string): Promise { + async getTransaction( + transactionHash: string, + ): Promise { return this.transactionStatusRepository.findOne({ where: { transactionHash }, }); @@ -79,7 +94,8 @@ export class TransactionMonitorService implements OnModuleInit { if (sourceAccount) where.sourceAccount = sourceAccount; if (destinationAccount) where.destinationAccount = destinationAccount; if (minAmount !== undefined) where.amount = MoreThan(minAmount); - if (maxAmount !== undefined) where.amount = { ...where.amount, LessThan: maxAmount }; + if (maxAmount !== undefined) + where.amount = { ...where.amount, LessThan: maxAmount }; if (startDate && endDate) { where.createdAt = Between(new Date(startDate), new Date(endDate)); } else if (startDate) { @@ -88,12 +104,13 @@ export class TransactionMonitorService implements OnModuleInit { where.createdAt = LessThan(new Date(endDate)); } - const [transactions, total] = await this.transactionStatusRepository.findAndCount({ - where, - order: { [sortBy]: sortOrder }, - skip: (page - 1) * limit, - take: limit, - }); + const [transactions, total] = + await this.transactionStatusRepository.findAndCount({ + where, + order: { [sortBy]: sortOrder }, + skip: (page - 1) * limit, + take: limit, + }); return { transactions, total }; } @@ -120,13 +137,13 @@ export class TransactionMonitorService implements OnModuleInit { } else if (status === TransactionStatus.FAILED) { transaction.errorMessage = errorMessage || undefined; this.stopMonitoring(transactionHash); - + if (transaction.retryCount < transaction.maxRetries) { await this.retryService.scheduleRetry(transaction); } else { await this.alertService.sendCriticalAlert( `Transaction ${transactionHash} failed after ${transaction.maxRetries} retries`, - { transactionHash, errorMessage, retryCount: transaction.retryCount } + { transactionHash, errorMessage, retryCount: transaction.retryCount }, ); } } @@ -134,7 +151,11 @@ export class TransactionMonitorService implements OnModuleInit { await this.transactionStatusRepository.save(transaction); if (oldStatus !== status) { - await this.alertService.sendStatusChangeAlert(transaction, oldStatus, status); + await this.alertService.sendStatusChangeAlert( + transaction, + oldStatus, + status, + ); } return transaction; @@ -145,8 +166,10 @@ export class TransactionMonitorService implements OnModuleInit { where: { status: TransactionStatus.PENDING }, }); - this.logger.log(`Loading ${pendingTransactions.length} pending transactions for monitoring`); - + this.logger.log( + `Loading ${pendingTransactions.length} pending transactions for monitoring`, + ); + for (const transaction of pendingTransactions) { this.startMonitoring(transaction.transactionHash); } @@ -180,7 +203,8 @@ export class TransactionMonitorService implements OnModuleInit { return; } - const stellarTransaction = await this.server.transactions() + const stellarTransaction = await this.server + .transactions() .transaction(transactionHash) .call(); @@ -189,16 +213,17 @@ export class TransactionMonitorService implements OnModuleInit { transactionHash, TransactionStatus.CONFIRMED, ); - + await this.transactionStatusRepository.update( { transactionHash }, - { ledgerSequence: stellarTransaction.ledger } + { ledgerSequence: stellarTransaction.ledger }, ); } else { await this.updateTransactionStatus( transactionHash, TransactionStatus.FAILED, - stellarTransaction.result_xdr || 'Transaction failed on Stellar network' + stellarTransaction.result_xdr || + 'Transaction failed on Stellar network', ); } } catch (error: any) { @@ -206,18 +231,21 @@ export class TransactionMonitorService implements OnModuleInit { return; } - this.logger.error(`Error checking transaction ${transactionHash}:`, error); - + this.logger.error( + `Error checking transaction ${transactionHash}:`, + error, + ); + const transaction = await this.getTransaction(transactionHash); if (transaction) { const now = new Date(); const timeoutDuration = 5 * 60 * 1000; - + if (now.getTime() - transaction.createdAt.getTime() > timeoutDuration) { await this.updateTransactionStatus( transactionHash, TransactionStatus.TIMEOUT, - 'Transaction timed out' + 'Transaction timed out', ); } } @@ -227,7 +255,7 @@ export class TransactionMonitorService implements OnModuleInit { @Cron(CronExpression.EVERY_MINUTE) async handleTimeoutTransactions(): Promise { const timeoutThreshold = new Date(Date.now() - 5 * 60 * 1000); - + const timeoutTransactions = await this.transactionStatusRepository.find({ where: { status: TransactionStatus.PENDING, @@ -239,12 +267,14 @@ export class TransactionMonitorService implements OnModuleInit { await this.updateTransactionStatus( transaction.transactionHash, TransactionStatus.TIMEOUT, - 'Transaction timed out after 5 minutes' + 'Transaction timed out after 5 minutes', ); } } - async getTransactionAnalytics(timeRange: 'hour' | 'day' | 'week' | 'month' = 'day'): Promise { + async getTransactionAnalytics( + timeRange: 'hour' | 'day' | 'week' | 'month' = 'day', + ): Promise { const now = new Date(); let startDate: Date; @@ -270,35 +300,61 @@ export class TransactionMonitorService implements OnModuleInit { }); const totalTransactions = transactions.length; - const pendingTransactions = transactions.filter(t => t.status === TransactionStatus.PENDING).length; - const confirmedTransactions = transactions.filter(t => t.status === TransactionStatus.CONFIRMED).length; - const failedTransactions = transactions.filter(t => t.status === TransactionStatus.FAILED).length; - const retryingTransactions = transactions.filter(t => t.status === TransactionStatus.RETRYING).length; - const timeoutTransactions = transactions.filter(t => t.status === TransactionStatus.TIMEOUT).length; - - const successRate = totalTransactions > 0 ? (confirmedTransactions / totalTransactions) * 100 : 0; - - const confirmedTx = transactions.filter(t => t.status === TransactionStatus.CONFIRMED && t.confirmedAt); - const averageConfirmationTime = confirmedTx.length > 0 - ? confirmedTx.reduce((sum, tx) => { - const time = tx.confirmedAt!.getTime() - tx.createdAt.getTime(); - return sum + time; - }, 0) / confirmedTx.length / 1000 - : 0; - - const averageRetryCount = transactions.length > 0 - ? transactions.reduce((sum, tx) => sum + tx.retryCount, 0) / transactions.length - : 0; - - const statusBreakdown = transactions.reduce((acc, tx) => { - acc[tx.status] = (acc[tx.status] || 0) + 1; - return acc; - }, {} as Record); - - const priorityBreakdown = transactions.reduce((acc, tx) => { - acc[tx.priority] = (acc[tx.priority] || 0) + 1; - return acc; - }, {} as Record); + const pendingTransactions = transactions.filter( + (t) => t.status === TransactionStatus.PENDING, + ).length; + const confirmedTransactions = transactions.filter( + (t) => t.status === TransactionStatus.CONFIRMED, + ).length; + const failedTransactions = transactions.filter( + (t) => t.status === TransactionStatus.FAILED, + ).length; + const retryingTransactions = transactions.filter( + (t) => t.status === TransactionStatus.RETRYING, + ).length; + const timeoutTransactions = transactions.filter( + (t) => t.status === TransactionStatus.TIMEOUT, + ).length; + + const successRate = + totalTransactions > 0 + ? (confirmedTransactions / totalTransactions) * 100 + : 0; + + const confirmedTx = transactions.filter( + (t) => t.status === TransactionStatus.CONFIRMED && t.confirmedAt, + ); + const averageConfirmationTime = + confirmedTx.length > 0 + ? confirmedTx.reduce((sum, tx) => { + const time = tx.confirmedAt.getTime() - tx.createdAt.getTime(); + return sum + time; + }, 0) / + confirmedTx.length / + 1000 + : 0; + + const averageRetryCount = + transactions.length > 0 + ? transactions.reduce((sum, tx) => sum + tx.retryCount, 0) / + transactions.length + : 0; + + const statusBreakdown = transactions.reduce( + (acc, tx) => { + acc[tx.status] = (acc[tx.status] || 0) + 1; + return acc; + }, + {} as Record, + ); + + const priorityBreakdown = transactions.reduce( + (acc, tx) => { + acc[tx.priority] = (acc[tx.priority] || 0) + 1; + return acc; + }, + {} as Record, + ); const hourlyStats = this.calculateHourlyStats(transactions, startDate, now); @@ -322,32 +378,47 @@ export class TransactionMonitorService implements OnModuleInit { transactions: TransactionStatusEntity[], startDate: Date, endDate: Date, - ): Record { - const hourlyStats: Record = {}; - const hours = Math.ceil((endDate.getTime() - startDate.getTime()) / (60 * 60 * 1000)); + ): Record< + string, + { count: number; successRate: number; averageTime: number } + > { + const hourlyStats: Record< + string, + { count: number; successRate: number; averageTime: number } + > = {}; + const hours = Math.ceil( + (endDate.getTime() - startDate.getTime()) / (60 * 60 * 1000), + ); for (let i = 0; i < hours; i++) { const hourStart = new Date(startDate.getTime() + i * 60 * 60 * 1000); const hourEnd = new Date(hourStart.getTime() + 60 * 60 * 1000); const hourKey = hourStart.toISOString().substring(0, 13); - const hourTransactions = transactions.filter(tx => - tx.createdAt >= hourStart && tx.createdAt < hourEnd + const hourTransactions = transactions.filter( + (tx) => tx.createdAt >= hourStart && tx.createdAt < hourEnd, ); - const confirmedInHour = hourTransactions.filter(tx => tx.status === TransactionStatus.CONFIRMED); - const successRate = hourTransactions.length > 0 - ? (confirmedInHour.length / hourTransactions.length) * 100 - : 0; - - const avgTime = confirmedInHour.length > 0 - ? confirmedInHour.reduce((sum, tx) => { - if (tx.confirmedAt) { - return sum + (tx.confirmedAt.getTime() - tx.createdAt.getTime()) / 1000; - } - return sum; - }, 0) / confirmedInHour.length - : 0; + const confirmedInHour = hourTransactions.filter( + (tx) => tx.status === TransactionStatus.CONFIRMED, + ); + const successRate = + hourTransactions.length > 0 + ? (confirmedInHour.length / hourTransactions.length) * 100 + : 0; + + const avgTime = + confirmedInHour.length > 0 + ? confirmedInHour.reduce((sum, tx) => { + if (tx.confirmedAt) { + return ( + sum + + (tx.confirmedAt.getTime() - tx.createdAt.getTime()) / 1000 + ); + } + return sum; + }, 0) / confirmedInHour.length + : 0; hourlyStats[hourKey] = { count: hourTransactions.length, @@ -361,7 +432,7 @@ export class TransactionMonitorService implements OnModuleInit { async archiveOldTransactions(): Promise { const archiveThreshold = new Date(Date.now() - 365 * 24 * 60 * 60 * 1000); - + const oldTransactions = await this.transactionStatusRepository.find({ where: { createdAt: LessThan(archiveThreshold), @@ -395,11 +466,13 @@ export class TransactionMonitorService implements OnModuleInit { await this.updateTransactionStatus( transaction.transactionHash, TransactionStatus.FAILED, - 'Transaction expired' + 'Transaction expired', ); } - this.logger.log(`Cleaned up ${expiredTransactions.length} expired transactions`); + this.logger.log( + `Cleaned up ${expiredTransactions.length} expired transactions`, + ); } getMonitoringStats(): { diff --git a/src/monitoring/workflows/transaction.workflow.ts b/src/monitoring/workflows/transaction.workflow.ts index 13a0b67..9c2c67a 100644 --- a/src/monitoring/workflows/transaction.workflow.ts +++ b/src/monitoring/workflows/transaction.workflow.ts @@ -1,7 +1,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { TransactionStatusEntity, TransactionStatus, TransactionPriority } from '../entities/transaction-status.entity'; +import { + TransactionStatusEntity, + TransactionStatus, + TransactionPriority, +} from '../entities/transaction-status.entity'; import { TransactionMonitorService } from '../transaction-monitor.service'; import { RetryService } from '../retry/retry.service'; import { AlertService } from '../alerts/alert.service'; @@ -38,13 +42,16 @@ export enum WorkflowStatus { @Injectable() export class TransactionWorkflowService { private readonly logger = new Logger(TransactionWorkflowService.name); - private readonly activeWorkflows = new Map(); + private readonly activeWorkflows = new Map< + string, + { + status: WorkflowStatus; + currentStep: number; + steps: WorkflowStep[]; + context: TransactionWorkflowContext; + startTime: Date; + } + >(); constructor( @InjectRepository(TransactionStatusEntity) @@ -69,15 +76,16 @@ export class TransactionWorkflowService { const steps = this.getWorkflowSteps(workflowType, transaction); const context: TransactionWorkflowContext = { transaction, - server: new (require('stellar-sdk')).Horizon.Server( - process.env.STELLAR_HORIZON_URL || 'https://horizon-testnet.stellar.org', + server: new (require('stellar-sdk').Horizon.Server)( + process.env.STELLAR_HORIZON_URL || + 'https://horizon-testnet.stellar.org', ), metadata: {}, stepResults: new Map(), }; const workflowId = `${transactionHash}_${Date.now()}`; - + this.activeWorkflows.set(workflowId, { status: WorkflowStatus.PENDING, currentStep: 0, @@ -86,8 +94,10 @@ export class TransactionWorkflowService { startTime: new Date(), }); - this.logger.log(`Created workflow ${workflowId} for transaction ${transactionHash}`); - + this.logger.log( + `Created workflow ${workflowId} for transaction ${transactionHash}`, + ); + return workflowId; } @@ -98,16 +108,18 @@ export class TransactionWorkflowService { } workflow.status = WorkflowStatus.RUNNING; - + try { for (let i = workflow.currentStep; i < workflow.steps.length; i++) { const step = workflow.steps[i]; workflow.currentStep = i; - this.logger.log(`Executing step ${i + 1}/${workflow.steps.length}: ${step.name}`); - + this.logger.log( + `Executing step ${i + 1}/${workflow.steps.length}: ${step.name}`, + ); + await this.executeStepWithRetry(step, workflow.context); - + workflow.context.stepResults.set(step.name, { completed: true, timestamp: new Date(), @@ -115,25 +127,24 @@ export class TransactionWorkflowService { } workflow.status = WorkflowStatus.COMPLETED; - + await this.transactionStatusRepository.update( { transactionHash: workflow.context.transaction.transactionHash }, - { status: TransactionStatus.CONFIRMED, confirmedAt: new Date() } + { status: TransactionStatus.CONFIRMED, confirmedAt: new Date() }, ); await this.alertService.sendCriticalAlert( - `Workflow ${workflowId} completed successfully for transaction ${workflow.context.transaction.transactionHash}` + `Workflow ${workflowId} completed successfully for transaction ${workflow.context.transaction.transactionHash}`, ); this.logger.log(`Workflow ${workflowId} completed successfully`); - } catch (error: any) { workflow.status = WorkflowStatus.FAILED; - + await this.handleWorkflowFailure(workflowId, error); - + this.logger.error(`Workflow ${workflowId} failed:`, error); - + throw error; } finally { this.activeWorkflows.delete(workflowId); @@ -153,10 +164,10 @@ export class TransactionWorkflowService { return; } catch (error: any) { lastError = error; - + this.logger.warn( `Step ${step.name} failed (attempt ${attempt}/${maxAttempts}):`, - error.message + error.message, ); if (attempt < maxAttempts) { @@ -171,7 +182,10 @@ export class TransactionWorkflowService { await step.rollback(context); this.logger.log(`Step ${step.name} rolled back successfully`); } catch (rollbackError: any) { - this.logger.error(`Rollback failed for step ${step.name}:`, rollbackError); + this.logger.error( + `Rollback failed for step ${step.name}:`, + rollbackError, + ); } } @@ -180,7 +194,7 @@ export class TransactionWorkflowService { private calculateRetryDelay(step: WorkflowStep, attempt: number): number { if (!step.retryPolicy) return 1000; - + const { delay, backoffMultiplier = 2 } = step.retryPolicy; return delay * Math.pow(backoffMultiplier, attempt - 1); } @@ -193,13 +207,13 @@ export class TransactionWorkflowService { if (!workflow) return; const { transaction } = workflow.context; - + await this.transactionStatusRepository.update( { transactionHash: transaction.transactionHash }, { status: TransactionStatus.FAILED, errorMessage: error.message, - } + }, ); await this.alertService.sendFailureAlert(transaction, error.message); @@ -240,10 +254,11 @@ export class TransactionWorkflowService { name: 'verify_transaction_exists', execute: async (context) => { try { - const stellarTx = await context.server.transactions() + const stellarTx = await context.server + .transactions() .transaction(context.transaction.transactionHash) .call(); - + context.stellarTransaction = stellarTx; context.metadata.verified = true; } catch (error: any) { @@ -259,7 +274,9 @@ export class TransactionWorkflowService { name: 'validate_transaction_success', execute: async (context) => { if (!context.stellarTransaction.successful) { - throw new Error(`Transaction failed: ${context.stellarTransaction.result_xdr}`); + throw new Error( + `Transaction failed: ${context.stellarTransaction.result_xdr}`, + ); } context.metadata.successValidated = true; }, @@ -272,7 +289,7 @@ export class TransactionWorkflowService { { ledgerSequence: context.stellarTransaction.ledger, confirmedAt: new Date(), - } + }, ); context.metadata.ledgerUpdated = true; }, @@ -287,7 +304,9 @@ export class TransactionWorkflowService { { name: 'priority_verification', execute: async (context) => { - if (context.transaction.priority !== TransactionPriority.CRITICAL) { + if ( + context.transaction.priority !== TransactionPriority.CRITICAL + ) { throw new Error('Priority workflow requires critical priority'); } context.metadata.priorityVerified = true; @@ -297,7 +316,7 @@ export class TransactionWorkflowService { name: 'enhanced_monitoring', execute: async (context) => { await this.alertService.sendCriticalAlert( - `Priority transaction ${context.transaction.transactionHash} is being processed with enhanced monitoring` + `Priority transaction ${context.transaction.transactionHash} is being processed with enhanced monitoring`, ); context.metadata.enhancedMonitoring = true; }, @@ -310,13 +329,14 @@ export class TransactionWorkflowService { { name: 'batch_validation', execute: async (context) => { - const batchTransactions = await this.transactionStatusRepository.find({ - where: { - status: TransactionStatus.PENDING, - priority: TransactionPriority.LOW, - }, - take: 10, - }); + const batchTransactions = + await this.transactionStatusRepository.find({ + where: { + status: TransactionStatus.PENDING, + priority: TransactionPriority.LOW, + }, + take: 10, + }); context.metadata.batchSize = batchTransactions.length; context.metadata.batchValidated = true; @@ -337,14 +357,14 @@ export class TransactionWorkflowService { } workflow.status = WorkflowStatus.CANCELLED; - + await this.transactionStatusRepository.update( { transactionHash: workflow.context.transaction.transactionHash }, - { status: TransactionStatus.FAILED, errorMessage: 'Workflow cancelled' } + { status: TransactionStatus.FAILED, errorMessage: 'Workflow cancelled' }, ); this.activeWorkflows.delete(workflowId); - + this.logger.log(`Workflow ${workflowId} cancelled`); } @@ -367,14 +387,16 @@ export class TransactionWorkflowService { }; } - async getActiveWorkflows(): Promise> { + async getActiveWorkflows(): Promise< + Array<{ + workflowId: string; + transactionHash: string; + status: WorkflowStatus; + currentStep: number; + totalSteps: number; + startTime: Date; + }> + > { const workflows: Array<{ workflowId: string; transactionHash: string; @@ -384,7 +406,9 @@ export class TransactionWorkflowService { startTime: Date; }> = []; - for (const [workflowId, workflow] of Array.from(this.activeWorkflows.entries())) { + for (const [workflowId, workflow] of Array.from( + this.activeWorkflows.entries(), + )) { workflows.push({ workflowId, transactionHash: workflow.context.transaction.transactionHash, @@ -402,7 +426,9 @@ export class TransactionWorkflowService { const now = Date.now(); const expiredWorkflows: string[] = []; - for (const [workflowId, workflow] of Array.from(this.activeWorkflows.entries())) { + for (const [workflowId, workflow] of Array.from( + this.activeWorkflows.entries(), + )) { const elapsed = now - workflow.startTime.getTime(); const timeoutMs = 30 * 60 * 1000; @@ -416,12 +442,14 @@ export class TransactionWorkflowService { } if (expiredWorkflows.length > 0) { - this.logger.log(`Cleaned up ${expiredWorkflows.length} expired workflows`); + this.logger.log( + `Cleaned up ${expiredWorkflows.length} expired workflows`, + ); } } private sleep(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); + return new Promise((resolve) => setTimeout(resolve, ms)); } getWorkflowStats(): { @@ -431,17 +459,23 @@ export class TransactionWorkflowService { averageExecutionTime: number; } { const workflows = Array.from(this.activeWorkflows.values()); - - const completed = workflows.filter(w => w.status === WorkflowStatus.COMPLETED).length; - const failed = workflows.filter(w => w.status === WorkflowStatus.FAILED).length; - + + const completed = workflows.filter( + (w) => w.status === WorkflowStatus.COMPLETED, + ).length; + const failed = workflows.filter( + (w) => w.status === WorkflowStatus.FAILED, + ).length; + const executionTimes = workflows - .filter(w => w.status === WorkflowStatus.COMPLETED) - .map(w => Date.now() - w.startTime.getTime()); - - const averageExecutionTime = executionTimes.length > 0 - ? executionTimes.reduce((sum, time) => sum + time, 0) / executionTimes.length - : 0; + .filter((w) => w.status === WorkflowStatus.COMPLETED) + .map((w) => Date.now() - w.startTime.getTime()); + + const averageExecutionTime = + executionTimes.length > 0 + ? executionTimes.reduce((sum, time) => sum + time, 0) / + executionTimes.length + : 0; return { activeWorkflows: workflows.length, diff --git a/src/multisig/dto/multisig.dto.ts b/src/multisig/dto/multisig.dto.ts index 8e2d8ea..9d23c08 100644 --- a/src/multisig/dto/multisig.dto.ts +++ b/src/multisig/dto/multisig.dto.ts @@ -1,4 +1,16 @@ -import { IsString, IsArray, IsNumber, IsEnum, IsOptional, IsJSON, Min, Max, Length, ValidateNested, IsDecimal } from 'class-validator'; +import { + IsString, + IsArray, + IsNumber, + IsEnum, + IsOptional, + IsJSON, + Min, + Max, + Length, + ValidateNested, + IsDecimal, +} from 'class-validator'; import { Type } from 'class-transformer'; import { WalletStatus } from '../entities/multisig-wallet.entity'; import { TransactionType, SignatureStatus } from '../entities/signature.entity'; diff --git a/src/multisig/entities/multisig-wallet.entity.ts b/src/multisig/entities/multisig-wallet.entity.ts index 4bb5cde..40be864 100644 --- a/src/multisig/entities/multisig-wallet.entity.ts +++ b/src/multisig/entities/multisig-wallet.entity.ts @@ -1,11 +1,19 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + OneToMany, + Index, +} from 'typeorm'; import { Signature } from './signature.entity'; export enum WalletStatus { ACTIVE = 'active', LOCKED = 'locked', RECOVERY = 'recovery', - TERMINATED = 'terminated' + TERMINATED = 'terminated', } @Entity('multisig_wallets') @@ -36,7 +44,7 @@ export class MultisigWallet { @Column({ type: 'enum', enum: WalletStatus, - default: WalletStatus.ACTIVE + default: WalletStatus.ACTIVE, }) status: WalletStatus; @@ -61,7 +69,7 @@ export class MultisigWallet { @UpdateDateColumn() updatedAt: Date; - @OneToMany(() => Signature, signature => signature.wallet) + @OneToMany(() => Signature, (signature) => signature.wallet) signatures: Signature[]; @Column({ type: 'timestamp', nullable: true }) @@ -75,8 +83,8 @@ export class MultisigWallet { } get requiredSignatures(): number { - return this.isRecoveryMode && this.recoveryThreshold - ? this.recoveryThreshold + return this.isRecoveryMode && this.recoveryThreshold + ? this.recoveryThreshold : this.threshold; } diff --git a/src/multisig/entities/signature.entity.ts b/src/multisig/entities/signature.entity.ts index b065449..de024a5 100644 --- a/src/multisig/entities/signature.entity.ts +++ b/src/multisig/entities/signature.entity.ts @@ -1,4 +1,12 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + ManyToOne, + JoinColumn, + Index, +} from 'typeorm'; import { MultisigWallet } from './multisig-wallet.entity'; export enum SignatureStatus { @@ -6,7 +14,7 @@ export enum SignatureStatus { COLLECTED = 'collected', EXPIRED = 'expired', REVOKED = 'revoked', - EXECUTED = 'executed' + EXECUTED = 'executed', } export enum TransactionType { @@ -14,7 +22,7 @@ export enum TransactionType { CONTRACT_CALL = 'contract_call', DAO_VOTE = 'dao_vote', ENERGY_TRADE = 'energy_trade', - EMERGENCY_RECOVERY = 'emergency_recovery' + EMERGENCY_RECOVERY = 'emergency_recovery', } @Entity('multisig_signatures') @@ -29,7 +37,9 @@ export class Signature { @Column() walletId: string; - @ManyToOne(() => MultisigWallet, wallet => wallet.signatures, { onDelete: 'CASCADE' }) + @ManyToOne(() => MultisigWallet, (wallet) => wallet.signatures, { + onDelete: 'CASCADE', + }) @JoinColumn({ name: 'walletId' }) wallet: MultisigWallet; @@ -45,13 +55,13 @@ export class Signature { @Column({ type: 'enum', enum: SignatureStatus, - default: SignatureStatus.PENDING + default: SignatureStatus.PENDING, }) status: SignatureStatus; @Column({ type: 'enum', - enum: TransactionType + enum: TransactionType, }) transactionType: TransactionType; diff --git a/src/multisig/multisig.module.ts b/src/multisig/multisig.module.ts index ec94c4b..247af28 100644 --- a/src/multisig/multisig.module.ts +++ b/src/multisig/multisig.module.ts @@ -7,19 +7,9 @@ import { SignatureCollectionWorkflow } from './workflows/signature-collection.wo import { RecoveryService } from './recovery/recovery.service'; @Module({ - imports: [ - TypeOrmModule.forFeature([MultisigWallet, Signature]), - ], - providers: [ - MultisigService, - SignatureCollectionWorkflow, - RecoveryService, - ], - exports: [ - MultisigService, - SignatureCollectionWorkflow, - RecoveryService, - ], + imports: [TypeOrmModule.forFeature([MultisigWallet, Signature])], + providers: [MultisigService, SignatureCollectionWorkflow, RecoveryService], + exports: [MultisigService, SignatureCollectionWorkflow, RecoveryService], controllers: [], }) export class MultisigModule {} diff --git a/src/multisig/multisig.service.ts b/src/multisig/multisig.service.ts index f00111c..8784676 100644 --- a/src/multisig/multisig.service.ts +++ b/src/multisig/multisig.service.ts @@ -1,10 +1,29 @@ -import { Injectable, NotFoundException, BadRequestException, ConflictException, Logger } from '@nestjs/common'; +import { + Injectable, + NotFoundException, + BadRequestException, + ConflictException, + Logger, +} from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, DataSource, LessThan, MoreThanOrEqual } from 'typeorm'; import { Cron, CronExpression } from '@nestjs/schedule'; -import { MultisigWallet, WalletStatus } from './entities/multisig-wallet.entity'; -import { Signature, SignatureStatus, TransactionType } from './entities/signature.entity'; -import { CreateMultisigWalletDto, SignTransactionDto, RevokeSignatureDto, ExecuteTransactionDto, MultisigQueryDto } from './dto/multisig.dto'; +import { + MultisigWallet, + WalletStatus, +} from './entities/multisig-wallet.entity'; +import { + Signature, + SignatureStatus, + TransactionType, +} from './entities/signature.entity'; +import { + CreateMultisigWalletDto, + SignTransactionDto, + RevokeSignatureDto, + ExecuteTransactionDto, + MultisigQueryDto, +} from './dto/multisig.dto'; import { SignatureCollectionWorkflow } from './workflows/signature-collection.workflow'; import { RecoveryService } from './recovery/recovery.service'; @@ -23,21 +42,31 @@ export class MultisigService { private readonly dataSource: DataSource, ) {} - async createWallet(createWalletDto: CreateMultisigWalletDto, creatorId: string): Promise { + async createWallet( + createWalletDto: CreateMultisigWalletDto, + creatorId: string, + ): Promise { this.validateWalletCreation(createWalletDto); - const walletAddress = await this.generateMultisigAddress(createWalletDto.signers, createWalletDto.threshold); + const walletAddress = await this.generateMultisigAddress( + createWalletDto.signers, + createWalletDto.threshold, + ); const wallet = this.walletRepository.create({ ...createWalletDto, address: walletAddress, creatorId, - recoveryThreshold: createWalletDto.recoveryThreshold || Math.ceil(createWalletDto.threshold * 1.5), + recoveryThreshold: + createWalletDto.recoveryThreshold || + Math.ceil(createWalletDto.threshold * 1.5), }); const savedWallet = await this.walletRepository.save(wallet); - this.logger.log(`Created multisig wallet ${savedWallet.id} with address ${savedWallet.address}`); + this.logger.log( + `Created multisig wallet ${savedWallet.id} with address ${savedWallet.address}`, + ); return savedWallet; } @@ -67,14 +96,22 @@ export class MultisigService { return wallet; } - async signTransaction(signTransactionDto: SignTransactionDto, signerId: string): Promise { - const wallet = await this.getWalletByAddress(signTransactionDto.transactionData.walletAddress); + async signTransaction( + signTransactionDto: SignTransactionDto, + signerId: string, + ): Promise { + const wallet = await this.getWalletByAddress( + signTransactionDto.transactionData.walletAddress, + ); if (!wallet.signers.includes(signerId)) { throw new BadRequestException('Signer is not authorized for this wallet'); } - if (wallet.status === WalletStatus.LOCKED || wallet.status === WalletStatus.TERMINATED) { + if ( + wallet.status === WalletStatus.LOCKED || + wallet.status === WalletStatus.TERMINATED + ) { throw new BadRequestException('Wallet is not available for transactions'); } @@ -87,7 +124,9 @@ export class MultisigService { }); if (existingSignature) { - throw new ConflictException('Signature already exists for this transaction'); + throw new ConflictException( + 'Signature already exists for this transaction', + ); } const expiresAt = new Date(); @@ -103,13 +142,21 @@ export class MultisigService { const savedSignature = await this.signatureRepository.save(signature); - await this.signatureCollectionWorkflow.processSignature(wallet, savedSignature); + await this.signatureCollectionWorkflow.processSignature( + wallet, + savedSignature, + ); - this.logger.log(`Signature collected for transaction ${signTransactionDto.transactionHash} by signer ${signerId}`); + this.logger.log( + `Signature collected for transaction ${signTransactionDto.transactionHash} by signer ${signerId}`, + ); return savedSignature; } - async revokeSignature(revokeDto: RevokeSignatureDto, signerId: string): Promise { + async revokeSignature( + revokeDto: RevokeSignatureDto, + signerId: string, + ): Promise { const signature = await this.signatureRepository.findOne({ where: { transactionHash: revokeDto.transactionHash, @@ -133,13 +180,21 @@ export class MultisigService { const revokedSignature = await this.signatureRepository.save(signature); - await this.signatureCollectionWorkflow.processRevocation(signature.wallet, revokedSignature); + await this.signatureCollectionWorkflow.processRevocation( + signature.wallet, + revokedSignature, + ); - this.logger.log(`Signature revoked for transaction ${revokeDto.transactionHash} by signer ${signerId}`); + this.logger.log( + `Signature revoked for transaction ${revokeDto.transactionHash} by signer ${signerId}`, + ); return revokedSignature; } - async executeTransaction(executeDto: ExecuteTransactionDto, executorId: string): Promise { + async executeTransaction( + executeDto: ExecuteTransactionDto, + executorId: string, + ): Promise { const signatures = await this.signatureRepository.find({ where: { transactionHash: executeDto.transactionHash, @@ -149,25 +204,31 @@ export class MultisigService { }); if (signatures.length === 0) { - throw new NotFoundException('No collected signatures found for this transaction'); + throw new NotFoundException( + 'No collected signatures found for this transaction', + ); } const wallet = signatures[0].wallet; if (!wallet.signers.includes(executorId)) { - throw new BadRequestException('Executor is not authorized for this wallet'); + throw new BadRequestException( + 'Executor is not authorized for this wallet', + ); } const requiredSignatures = wallet.requiredSignatures; if (signatures.length < requiredSignatures) { - throw new BadRequestException(`Insufficient signatures. Required: ${requiredSignatures}, Collected: ${signatures.length}`); + throw new BadRequestException( + `Insufficient signatures. Required: ${requiredSignatures}, Collected: ${signatures.length}`, + ); } try { const executionResult = await this.executeMultisigTransaction( wallet.address, executeDto.transactionHash, - signatures.map(s => s.signature), + signatures.map((s) => s.signature), executeDto.executionData, ); @@ -185,11 +246,15 @@ export class MultisigService { wallet.nonce += 1; await this.walletRepository.save(wallet); - this.logger.log(`Transaction ${executeDto.transactionHash} executed successfully`); + this.logger.log( + `Transaction ${executeDto.transactionHash} executed successfully`, + ); return updatedSignatures[0]; - } catch (error) { - this.logger.error(`Failed to execute transaction ${executeDto.transactionHash}:`, error); + this.logger.error( + `Failed to execute transaction ${executeDto.transactionHash}:`, + error, + ); throw new BadRequestException('Transaction execution failed'); } } @@ -205,15 +270,23 @@ export class MultisigService { } const wallet = signatures[0].wallet; - const validSignatures = signatures.filter(s => s.isValid); - const collectedSignatures = signatures.filter(s => s.status === SignatureStatus.COLLECTED); - const executedSignatures = signatures.filter(s => s.status === SignatureStatus.EXECUTED); + const validSignatures = signatures.filter((s) => s.isValid); + const collectedSignatures = signatures.filter( + (s) => s.status === SignatureStatus.COLLECTED, + ); + const executedSignatures = signatures.filter( + (s) => s.status === SignatureStatus.EXECUTED, + ); + + let status: 'pending' | 'ready' | 'executed' | 'expired' | 'failed' = + 'pending'; - let status: 'pending' | 'ready' | 'executed' | 'expired' | 'failed' = 'pending'; - if (executedSignatures.length > 0) { status = 'executed'; - } else if (validSignatures.length === 0 && signatures.some(s => s.isExpired)) { + } else if ( + validSignatures.length === 0 && + signatures.some((s) => s.isExpired) + ) { status = 'expired'; } else if (wallet.canExecute(collectedSignatures.length)) { status = 'ready'; @@ -228,24 +301,33 @@ export class MultisigService { signatures: signatures, status, canExecute: wallet.canExecute(collectedSignatures.length), - timeToExpiry: Math.max(...signatures.map(s => s.timeToExpiry)), + timeToExpiry: Math.max(...signatures.map((s) => s.timeToExpiry)), }; } - async queryMultisigData(queryDto: MultisigQueryDto): Promise<{ wallets: MultisigWallet[]; signatures: Signature[] }> { - const walletQuery = this.walletRepository.createQueryBuilder('wallet') + async queryMultisigData( + queryDto: MultisigQueryDto, + ): Promise<{ wallets: MultisigWallet[]; signatures: Signature[] }> { + const walletQuery = this.walletRepository + .createQueryBuilder('wallet') .leftJoinAndSelect('wallet.signatures', 'signature'); if (queryDto.walletId) { - walletQuery.andWhere('wallet.id = :walletId', { walletId: queryDto.walletId }); + walletQuery.andWhere('wallet.id = :walletId', { + walletId: queryDto.walletId, + }); } if (queryDto.status) { - walletQuery.andWhere('wallet.status = :status', { status: queryDto.status }); + walletQuery.andWhere('wallet.status = :status', { + status: queryDto.status, + }); } if (queryDto.signerId) { - walletQuery.andWhere('JSON_CONTAINS(wallet.signers, :signerId)', { signerId: `"${queryDto.signerId}"` }); + walletQuery.andWhere('JSON_CONTAINS(wallet.signers, :signerId)', { + signerId: `"${queryDto.signerId}"`, + }); } const wallets = await walletQuery @@ -253,27 +335,38 @@ export class MultisigService { .offset(queryDto.offset) .getMany(); - const signatureQuery = this.signatureRepository.createQueryBuilder('signature') + const signatureQuery = this.signatureRepository + .createQueryBuilder('signature') .leftJoinAndSelect('signature.wallet', 'wallet'); if (queryDto.walletId) { - signatureQuery.andWhere('signature.walletId = :walletId', { walletId: queryDto.walletId }); + signatureQuery.andWhere('signature.walletId = :walletId', { + walletId: queryDto.walletId, + }); } if (queryDto.transactionType) { - signatureQuery.andWhere('signature.transactionType = :transactionType', { transactionType: queryDto.transactionType }); + signatureQuery.andWhere('signature.transactionType = :transactionType', { + transactionType: queryDto.transactionType, + }); } if (queryDto.signatureStatus) { - signatureQuery.andWhere('signature.status = :signatureStatus', { signatureStatus: queryDto.signatureStatus }); + signatureQuery.andWhere('signature.status = :signatureStatus', { + signatureStatus: queryDto.signatureStatus, + }); } if (queryDto.fromDate) { - signatureQuery.andWhere('signature.createdAt >= :fromDate', { fromDate: new Date(queryDto.fromDate) }); + signatureQuery.andWhere('signature.createdAt >= :fromDate', { + fromDate: new Date(queryDto.fromDate), + }); } if (queryDto.toDate) { - signatureQuery.andWhere('signature.createdAt <= :toDate', { toDate: new Date(queryDto.toDate) }); + signatureQuery.andWhere('signature.createdAt <= :toDate', { + toDate: new Date(queryDto.toDate), + }); } const signatures = await signatureQuery @@ -297,27 +390,48 @@ export class MultisigService { for (const signature of expiredSignatures) { signature.status = SignatureStatus.EXPIRED; await this.signatureRepository.save(signature); - await this.signatureCollectionWorkflow.processExpiry(signature.wallet, signature); + await this.signatureCollectionWorkflow.processExpiry( + signature.wallet, + signature, + ); } if (expiredSignatures.length > 0) { - this.logger.log(`Cleaned up ${expiredSignatures.length} expired signatures`); + this.logger.log( + `Cleaned up ${expiredSignatures.length} expired signatures`, + ); } } - private validateWalletCreation(createWalletDto: CreateMultisigWalletDto): void { - if (createWalletDto.signers.length < 2 || createWalletDto.signers.length > 15) { - throw new BadRequestException('Number of signers must be between 2 and 15'); + private validateWalletCreation( + createWalletDto: CreateMultisigWalletDto, + ): void { + if ( + createWalletDto.signers.length < 2 || + createWalletDto.signers.length > 15 + ) { + throw new BadRequestException( + 'Number of signers must be between 2 and 15', + ); } - if (createWalletDto.threshold < 2 || createWalletDto.threshold > createWalletDto.signers.length) { - throw new BadRequestException('Threshold must be between 2 and the number of signers'); + if ( + createWalletDto.threshold < 2 || + createWalletDto.threshold > createWalletDto.signers.length + ) { + throw new BadRequestException( + 'Threshold must be between 2 and the number of signers', + ); } if (createWalletDto.recoveryThreshold) { - if (createWalletDto.recoveryThreshold < createWalletDto.threshold || - createWalletDto.recoveryThreshold > createWalletDto.signers.length) { - throw new BadRequestException('Recovery threshold must be between normal threshold and number of signers'); + if ( + createWalletDto.recoveryThreshold < createWalletDto.threshold || + createWalletDto.recoveryThreshold > createWalletDto.signers.length + ) { + throw new BadRequestException( + 'Recovery threshold must be between normal threshold and number of signers', + ); } } @@ -327,7 +441,10 @@ export class MultisigService { } } - private async generateMultisigAddress(signers: string[], threshold: number): Promise { + private async generateMultisigAddress( + signers: string[], + threshold: number, + ): Promise { return `multisig_${signers.join('_')}_${threshold}_${Date.now()}`; } diff --git a/src/multisig/recovery/recovery.service.ts b/src/multisig/recovery/recovery.service.ts index 46adf00..02301d0 100644 --- a/src/multisig/recovery/recovery.service.ts +++ b/src/multisig/recovery/recovery.service.ts @@ -1,9 +1,22 @@ -import { Injectable, NotFoundException, BadRequestException, Logger, ConflictException } from '@nestjs/common'; +import { + Injectable, + NotFoundException, + BadRequestException, + Logger, + ConflictException, +} from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, DataSource } from 'typeorm'; import { Cron, CronExpression } from '@nestjs/schedule'; -import { MultisigWallet, WalletStatus } from '../entities/multisig-wallet.entity'; -import { Signature, SignatureStatus, TransactionType } from '../entities/signature.entity'; +import { + MultisigWallet, + WalletStatus, +} from '../entities/multisig-wallet.entity'; +import { + Signature, + SignatureStatus, + TransactionType, +} from '../entities/signature.entity'; import { InitiateRecoveryDto } from '../dto/multisig.dto'; export interface RecoveryRequest { @@ -32,7 +45,10 @@ export class RecoveryService { private readonly dataSource: DataSource, ) {} - async initiateRecovery(initiateRecoveryDto: InitiateRecoveryDto, initiatorId: string): Promise { + async initiateRecovery( + initiateRecoveryDto: InitiateRecoveryDto, + initiatorId: string, + ): Promise { const wallet = await this.walletRepository.findOne({ where: { id: initiateRecoveryDto.walletId }, relations: ['signatures'], @@ -47,16 +63,22 @@ export class RecoveryService { } if (wallet.status === WalletStatus.RECOVERY) { - throw new ConflictException('Recovery is already in progress for this wallet'); + throw new ConflictException( + 'Recovery is already in progress for this wallet', + ); } if (wallet.status === WalletStatus.TERMINATED) { - throw new BadRequestException('Cannot initiate recovery for terminated wallet'); + throw new BadRequestException( + 'Cannot initiate recovery for terminated wallet', + ); } this.validateRecoveryRequest(wallet, initiateRecoveryDto); - const recoveryTransactionHash = await this.generateRecoveryTransactionHash(wallet.id); + const recoveryTransactionHash = await this.generateRecoveryTransactionHash( + wallet.id, + ); const expiresAt = new Date(); expiresAt.setHours(expiresAt.getHours() + this.RECOVERY_EXPIRY_HOURS); @@ -64,7 +86,7 @@ export class RecoveryService { wallet.status = WalletStatus.RECOVERY; wallet.recoveryInitiatedAt = new Date(); wallet.recoveryInitiatedBy = initiatorId; - + if (initiateRecoveryDto.newThreshold) { wallet.recoveryThreshold = initiateRecoveryDto.newThreshold; } @@ -75,7 +97,10 @@ export class RecoveryService { walletId: wallet.id, transactionHash: recoveryTransactionHash, signerId: initiatorId, - signature: await this.generateRecoverySignature(initiatorId, recoveryTransactionHash), + signature: await this.generateRecoverySignature( + initiatorId, + recoveryTransactionHash, + ), status: SignatureStatus.COLLECTED, transactionType: TransactionType.EMERGENCY_RECOVERY, transactionData: { @@ -97,16 +122,25 @@ export class RecoveryService { await manager.save(recoverySignature); }); - const recoveryRequest = await this.buildRecoveryRequest(wallet, recoveryTransactionHash); + const recoveryRequest = await this.buildRecoveryRequest( + wallet, + recoveryTransactionHash, + ); await this.notifySignersOfRecoveryInitiation(wallet, recoveryRequest); await this.auditRecoveryInitiation(wallet, recoveryRequest, initiatorId); - this.logger.log(`Recovery initiated for wallet ${wallet.id} by ${initiatorId}`); + this.logger.log( + `Recovery initiated for wallet ${wallet.id} by ${initiatorId}`, + ); return recoveryRequest; } - async signRecovery(walletId: string, transactionHash: string, signerId: string): Promise { + async signRecovery( + walletId: string, + transactionHash: string, + signerId: string, + ): Promise { const wallet = await this.walletRepository.findOne({ where: { id: walletId }, }); @@ -140,24 +174,34 @@ export class RecoveryService { }, }); - const requiredSignatures = Math.ceil(wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD); + const requiredSignatures = Math.ceil( + wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD, + ); if (recoverySignatures.length >= requiredSignatures) { - throw new BadRequestException('Sufficient recovery signatures already collected'); + throw new BadRequestException( + 'Sufficient recovery signatures already collected', + ); } const signature = this.signatureRepository.create({ walletId, transactionHash, signerId, - signature: await this.generateRecoverySignature(signerId, transactionHash), + signature: await this.generateRecoverySignature( + signerId, + transactionHash, + ), status: SignatureStatus.COLLECTED, transactionType: TransactionType.EMERGENCY_RECOVERY, transactionData: { recoveryType: 'approval', walletId, }, - expiresAt: new Date(wallet.recoveryInitiatedAt!.getTime() + (this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000)), + expiresAt: new Date( + wallet.recoveryInitiatedAt.getTime() + + this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000, + ), signedAt: new Date(), }); @@ -166,12 +210,19 @@ export class RecoveryService { if (recoverySignatures.length + 1 >= requiredSignatures) { await this.executeRecovery(wallet, transactionHash); } else { - await this.notifyRecoveryProgress(wallet, transactionHash, recoverySignatures.length + 1, requiredSignatures); + await this.notifyRecoveryProgress( + wallet, + transactionHash, + recoverySignatures.length + 1, + requiredSignatures, + ); } await this.auditRecoverySignature(wallet, savedSignature); - this.logger.log(`Recovery signature added for wallet ${walletId} by ${signerId}`); + this.logger.log( + `Recovery signature added for wallet ${walletId} by ${signerId}`, + ); return savedSignature; } @@ -197,10 +248,17 @@ export class RecoveryService { order: { signedAt: 'ASC' }, }); - return await this.buildRecoveryRequest(wallet, recoverySignatures[0]?.transactionHash); + return await this.buildRecoveryRequest( + wallet, + recoverySignatures[0]?.transactionHash, + ); } - async cancelRecovery(walletId: string, cancellerId: string, reason: string): Promise { + async cancelRecovery( + walletId: string, + cancellerId: string, + reason: string, + ): Promise { const wallet = await this.walletRepository.findOne({ where: { id: walletId }, }); @@ -214,31 +272,39 @@ export class RecoveryService { } if (!wallet.signers.includes(cancellerId)) { - throw new BadRequestException('Canceller is not authorized for this wallet'); + throw new BadRequestException( + 'Canceller is not authorized for this wallet', + ); } await this.dataSource.transaction(async (manager) => { wallet.status = WalletStatus.ACTIVE; wallet.recoveryInitiatedAt = null; wallet.recoveryInitiatedBy = null; - + await manager.save(wallet); - await manager.update(Signature, { - walletId, - transactionType: TransactionType.EMERGENCY_RECOVERY, - status: SignatureStatus.PENDING, - }, { - status: SignatureStatus.REVOKED, - revokedAt: new Date(), - revocationReason: `Recovery cancelled: ${reason}`, - }); + await manager.update( + Signature, + { + walletId, + transactionType: TransactionType.EMERGENCY_RECOVERY, + status: SignatureStatus.PENDING, + }, + { + status: SignatureStatus.REVOKED, + revokedAt: new Date(), + revocationReason: `Recovery cancelled: ${reason}`, + }, + ); }); await this.notifyRecoveryCancellation(wallet, reason); await this.auditRecoveryCancellation(wallet, cancellerId, reason); - this.logger.log(`Recovery cancelled for wallet ${walletId} by ${cancellerId}`); + this.logger.log( + `Recovery cancelled for wallet ${walletId} by ${cancellerId}`, + ); } @Cron(CronExpression.EVERY_HOUR) @@ -246,7 +312,9 @@ export class RecoveryService { const expiredRecoveryWallets = await this.walletRepository.find({ where: { status: WalletStatus.RECOVERY, - recoveryInitiatedAt: new Date(Date.now() - (this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000)), + recoveryInitiatedAt: new Date( + Date.now() - this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000, + ), }, }); @@ -255,11 +323,16 @@ export class RecoveryService { } if (expiredRecoveryWallets.length > 0) { - this.logger.log(`Cleaned up ${expiredRecoveryWallets.length} expired recovery processes`); + this.logger.log( + `Cleaned up ${expiredRecoveryWallets.length} expired recovery processes`, + ); } } - private async executeRecovery(wallet: MultisigWallet, transactionHash: string): Promise { + private async executeRecovery( + wallet: MultisigWallet, + transactionHash: string, + ): Promise { try { const recoverySignatures = await this.signatureRepository.find({ where: { @@ -270,18 +343,20 @@ export class RecoveryService { }, }); - const initiationSignature = recoverySignatures.find(s => - s.transactionData?.recoveryType === 'initiation' + const initiationSignature = recoverySignatures.find( + (s) => s.transactionData?.recoveryType === 'initiation', ); - const newSigners = initiationSignature?.transactionData?.newSigners || wallet.signers; - const newThreshold = initiationSignature?.transactionData?.newThreshold || wallet.threshold; + const newSigners = + initiationSignature?.transactionData?.newSigners || wallet.signers; + const newThreshold = + initiationSignature?.transactionData?.newThreshold || wallet.threshold; await this.updateMultisigAccount( wallet.address, newSigners, newThreshold, - recoverySignatures.map(s => s.signature), + recoverySignatures.map((s) => s.signature), ); await this.dataSource.transaction(async (manager) => { @@ -290,25 +365,31 @@ export class RecoveryService { wallet.status = WalletStatus.ACTIVE; wallet.recoveryInitiatedAt = null; wallet.recoveryInitiatedBy = null; - + await manager.save(wallet); - await manager.update(Signature, { - walletId: wallet.id, - transactionHash, - }, { - status: SignatureStatus.EXECUTED, - executedAt: new Date(), - }); + await manager.update( + Signature, + { + walletId: wallet.id, + transactionHash, + }, + { + status: SignatureStatus.EXECUTED, + executedAt: new Date(), + }, + ); }); await this.notifyRecoveryCompletion(wallet, newSigners, newThreshold); await this.auditRecoveryCompletion(wallet, recoverySignatures); this.logger.log(`Recovery completed for wallet ${wallet.id}`); - } catch (error) { - this.logger.error(`Failed to execute recovery for wallet ${wallet.id}:`, error); + this.logger.error( + `Failed to execute recovery for wallet ${wallet.id}:`, + error, + ); throw new BadRequestException('Recovery execution failed'); } } @@ -318,16 +399,20 @@ export class RecoveryService { wallet.status = WalletStatus.ACTIVE; wallet.recoveryInitiatedAt = null; wallet.recoveryInitiatedBy = null; - + await manager.save(wallet); - await manager.update(Signature, { - walletId: wallet.id, - transactionType: TransactionType.EMERGENCY_RECOVERY, - status: SignatureStatus.PENDING, - }, { - status: SignatureStatus.EXPIRED, - }); + await manager.update( + Signature, + { + walletId: wallet.id, + transactionType: TransactionType.EMERGENCY_RECOVERY, + status: SignatureStatus.PENDING, + }, + { + status: SignatureStatus.EXPIRED, + }, + ); }); await this.notifyRecoveryExpiry(wallet); @@ -336,7 +421,10 @@ export class RecoveryService { this.logger.log(`Recovery expired for wallet ${wallet.id}`); } - private async buildRecoveryRequest(wallet: MultisigWallet, transactionHash?: string): Promise { + private async buildRecoveryRequest( + wallet: MultisigWallet, + transactionHash?: string, + ): Promise { const recoverySignatures = await this.signatureRepository.find({ where: { walletId: wallet.id, @@ -346,15 +434,20 @@ export class RecoveryService { order: { signedAt: 'ASC' }, }); - const initiationSignature = recoverySignatures.find(s => - s.transactionData?.recoveryType === 'initiation' + const initiationSignature = recoverySignatures.find( + (s) => s.transactionData?.recoveryType === 'initiation', ); - const requiredSignatures = Math.ceil(wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD); + const requiredSignatures = Math.ceil( + wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD, + ); const isApproved = recoverySignatures.length >= requiredSignatures; let status: RecoveryRequest['status'] = 'pending'; - if (wallet.status === WalletStatus.ACTIVE && recoverySignatures.length > 0) { + if ( + wallet.status === WalletStatus.ACTIVE && + recoverySignatures.length > 0 + ) { status = 'completed'; } else if (isApproved) { status = 'approved'; @@ -370,21 +463,34 @@ export class RecoveryService { newSigners: initiationSignature?.transactionData?.newSigners, recoverySignatures, initiatedAt: wallet.recoveryInitiatedAt || new Date(), - expiresAt: wallet.recoveryInitiatedAt ? - new Date(wallet.recoveryInitiatedAt.getTime() + (this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000)) : - new Date(), + expiresAt: wallet.recoveryInitiatedAt + ? new Date( + wallet.recoveryInitiatedAt.getTime() + + this.RECOVERY_EXPIRY_HOURS * 60 * 60 * 1000, + ) + : new Date(), status, }; } - private validateRecoveryRequest(wallet: MultisigWallet, dto: InitiateRecoveryDto): void { - if (dto.newSigners && (dto.newSigners.length < 2 || dto.newSigners.length > 15)) { - throw new BadRequestException('New signers count must be between 2 and 15'); + private validateRecoveryRequest( + wallet: MultisigWallet, + dto: InitiateRecoveryDto, + ): void { + if ( + dto.newSigners && + (dto.newSigners.length < 2 || dto.newSigners.length > 15) + ) { + throw new BadRequestException( + 'New signers count must be between 2 and 15', + ); } if (dto.newThreshold && dto.newSigners) { if (dto.newThreshold < 2 || dto.newThreshold > dto.newSigners.length) { - throw new BadRequestException('New threshold must be between 2 and new signers count'); + throw new BadRequestException( + 'New threshold must be between 2 and new signers count', + ); } } @@ -395,17 +501,26 @@ export class RecoveryService { } } - const superMajorityRequired = Math.ceil(wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD); + const superMajorityRequired = Math.ceil( + wallet.signers.length * this.SUPER_MAJORITY_THRESHOLD, + ); if (wallet.signers.length < superMajorityRequired) { - throw new BadRequestException('Insufficient signers for super-majority recovery'); + throw new BadRequestException( + 'Insufficient signers for super-majority recovery', + ); } } - private async generateRecoveryTransactionHash(walletId: string): Promise { + private async generateRecoveryTransactionHash( + walletId: string, + ): Promise { return `recovery_${walletId}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; } - private async generateRecoverySignature(signerId: string, transactionHash: string): Promise { + private async generateRecoverySignature( + signerId: string, + transactionHash: string, + ): Promise { return `recovery_sig_${signerId}_${transactionHash}_${Date.now()}`; } @@ -413,20 +528,41 @@ export class RecoveryService { console.log(`Recovery expired for wallet ${wallet.id}`); } - private async notifySignersOfRecoveryInitiation(wallet: MultisigWallet, recoveryRequest: RecoveryRequest): Promise { - console.log(`Notifying signers of recovery initiation for wallet ${wallet.id}`); + private async notifySignersOfRecoveryInitiation( + wallet: MultisigWallet, + recoveryRequest: RecoveryRequest, + ): Promise { + console.log( + `Notifying signers of recovery initiation for wallet ${wallet.id}`, + ); } - private async notifyRecoveryProgress(wallet: MultisigWallet, transactionHash: string, collected: number, required: number): Promise { - console.log(`Notifying recovery progress: ${collected}/${required} for wallet ${wallet.id}`); + private async notifyRecoveryProgress( + wallet: MultisigWallet, + transactionHash: string, + collected: number, + required: number, + ): Promise { + console.log( + `Notifying recovery progress: ${collected}/${required} for wallet ${wallet.id}`, + ); } - private async notifyRecoveryCompletion(wallet: MultisigWallet, newSigners: string[], newThreshold: number): Promise { + private async notifyRecoveryCompletion( + wallet: MultisigWallet, + newSigners: string[], + newThreshold: number, + ): Promise { console.log(`Notifying recovery completion for wallet ${wallet.id}`); } - private async notifyRecoveryCancellation(wallet: MultisigWallet, reason: string): Promise { - console.log(`Notifying recovery cancellation for wallet ${wallet.id}: ${reason}`); + private async notifyRecoveryCancellation( + wallet: MultisigWallet, + reason: string, + ): Promise { + console.log( + `Notifying recovery cancellation for wallet ${wallet.id}: ${reason}`, + ); } private async updateMultisigAccount( @@ -436,22 +572,44 @@ export class RecoveryService { signatures: string[], ): Promise { // Placeholder for Stellar account update - console.log(`Updating multisig account ${walletAddress} with ${newSigners.length} signers and threshold ${newThreshold}`); + console.log( + `Updating multisig account ${walletAddress} with ${newSigners.length} signers and threshold ${newThreshold}`, + ); } - private async auditRecoveryInitiation(wallet: MultisigWallet, recoveryRequest: RecoveryRequest, initiatorId: string): Promise { + private async auditRecoveryInitiation( + wallet: MultisigWallet, + recoveryRequest: RecoveryRequest, + initiatorId: string, + ): Promise { console.log(`Recovery initiated for wallet ${wallet.id} by ${initiatorId}`); } - private async auditRecoverySignature(wallet: MultisigWallet, signature: Signature): Promise { - console.log(`Recovery signature added for wallet ${wallet.id} by ${signature.signerId}`); + private async auditRecoverySignature( + wallet: MultisigWallet, + signature: Signature, + ): Promise { + console.log( + `Recovery signature added for wallet ${wallet.id} by ${signature.signerId}`, + ); } - private async auditRecoveryCompletion(wallet: MultisigWallet, signatures: Signature[]): Promise { - console.log(`Recovery completed for wallet ${wallet.id} with ${signatures.length} signatures`); + private async auditRecoveryCompletion( + wallet: MultisigWallet, + signatures: Signature[], + ): Promise { + console.log( + `Recovery completed for wallet ${wallet.id} with ${signatures.length} signatures`, + ); } - private async auditRecoveryCancellation(wallet: MultisigWallet, cancellerId: string, reason: string): Promise { - console.log(`Recovery cancelled for wallet ${wallet.id} by ${cancellerId}: ${reason}`); + private async auditRecoveryCancellation( + wallet: MultisigWallet, + cancellerId: string, + reason: string, + ): Promise { + console.log( + `Recovery cancelled for wallet ${wallet.id} by ${cancellerId}: ${reason}`, + ); } } diff --git a/src/multisig/workflows/signature-collection.workflow.ts b/src/multisig/workflows/signature-collection.workflow.ts index 035ef85..294aab6 100644 --- a/src/multisig/workflows/signature-collection.workflow.ts +++ b/src/multisig/workflows/signature-collection.workflow.ts @@ -1,11 +1,18 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { MultisigWallet, WalletStatus } from '../entities/multisig-wallet.entity'; +import { + MultisigWallet, + WalletStatus, +} from '../entities/multisig-wallet.entity'; import { Signature, SignatureStatus } from '../entities/signature.entity'; export interface SignatureWorkflowEvent { - type: 'signature_collected' | 'signature_revoked' | 'signature_expired' | 'threshold_reached'; + type: + | 'signature_collected' + | 'signature_revoked' + | 'signature_expired' + | 'threshold_reached'; wallet: MultisigWallet; signature?: Signature; signatures?: Signature[]; @@ -21,17 +28,24 @@ export class SignatureCollectionWorkflow { private readonly signatureRepository: Repository, ) {} - async processSignature(wallet: MultisigWallet, signature: Signature): Promise { + async processSignature( + wallet: MultisigWallet, + signature: Signature, + ): Promise { const startTime = Date.now(); - + try { await this.validateSignature(wallet, signature); - + signature.status = SignatureStatus.COLLECTED; await this.signatureRepository.save(signature); - const allSignatures = await this.getSignaturesForTransaction(signature.transactionHash); - const collectedSignatures = allSignatures.filter(s => s.status === SignatureStatus.COLLECTED); + const allSignatures = await this.getSignaturesForTransaction( + signature.transactionHash, + ); + const collectedSignatures = allSignatures.filter( + (s) => s.status === SignatureStatus.COLLECTED, + ); await this.auditLog({ eventType: 'signature_collected', @@ -46,22 +60,37 @@ export class SignatureCollectionWorkflow { await this.notifySigners(wallet, signature, collectedSignatures); if (wallet.canExecute(collectedSignatures.length)) { - await this.handleThresholdReached(wallet, signature.transactionHash, collectedSignatures); + await this.handleThresholdReached( + wallet, + signature.transactionHash, + collectedSignatures, + ); } const processingTime = Date.now() - startTime; - this.logger.log(`Signature processed in ${processingTime}ms for transaction ${signature.transactionHash}`); - + this.logger.log( + `Signature processed in ${processingTime}ms for transaction ${signature.transactionHash}`, + ); } catch (error) { - this.logger.error(`Failed to process signature for transaction ${signature.transactionHash}:`, error); + this.logger.error( + `Failed to process signature for transaction ${signature.transactionHash}:`, + error, + ); throw error; } } - async processRevocation(wallet: MultisigWallet, signature: Signature): Promise { + async processRevocation( + wallet: MultisigWallet, + signature: Signature, + ): Promise { try { - const allSignatures = await this.getSignaturesForTransaction(signature.transactionHash); - const activeSignatures = allSignatures.filter(s => s.status === SignatureStatus.COLLECTED); + const allSignatures = await this.getSignaturesForTransaction( + signature.transactionHash, + ); + const activeSignatures = allSignatures.filter( + (s) => s.status === SignatureStatus.COLLECTED, + ); await this.auditLog({ eventType: 'signature_revoked', @@ -76,18 +105,29 @@ export class SignatureCollectionWorkflow { await this.notifySignersOfRevocation(wallet, signature, activeSignatures); - this.logger.log(`Signature revoked for transaction ${signature.transactionHash} by signer ${signature.signerId}`); - + this.logger.log( + `Signature revoked for transaction ${signature.transactionHash} by signer ${signature.signerId}`, + ); } catch (error) { - this.logger.error(`Failed to process signature revocation for transaction ${signature.transactionHash}:`, error); + this.logger.error( + `Failed to process signature revocation for transaction ${signature.transactionHash}:`, + error, + ); throw error; } } - async processExpiry(wallet: MultisigWallet, signature: Signature): Promise { + async processExpiry( + wallet: MultisigWallet, + signature: Signature, + ): Promise { try { - const allSignatures = await this.getSignaturesForTransaction(signature.transactionHash); - const activeSignatures = allSignatures.filter(s => s.status === SignatureStatus.COLLECTED); + const allSignatures = await this.getSignaturesForTransaction( + signature.transactionHash, + ); + const activeSignatures = allSignatures.filter( + (s) => s.status === SignatureStatus.COLLECTED, + ); await this.auditLog({ eventType: 'signature_expired', @@ -102,15 +142,21 @@ export class SignatureCollectionWorkflow { await this.notifySignersOfExpiry(wallet, signature, activeSignatures); - this.logger.log(`Signature expired for transaction ${signature.transactionHash} from signer ${signature.signerId}`); - + this.logger.log( + `Signature expired for transaction ${signature.transactionHash} from signer ${signature.signerId}`, + ); } catch (error) { - this.logger.error(`Failed to process signature expiry for transaction ${signature.transactionHash}:`, error); + this.logger.error( + `Failed to process signature expiry for transaction ${signature.transactionHash}:`, + error, + ); throw error; } } - async getSignaturesForTransaction(transactionHash: string): Promise { + async getSignaturesForTransaction( + transactionHash: string, + ): Promise { return this.signatureRepository.find({ where: { transactionHash }, order: { createdAt: 'ASC' }, @@ -128,22 +174,34 @@ export class SignatureCollectionWorkflow { timeToExpiry: number; }> { const signatures = await this.getSignaturesForTransaction(transactionHash); - + if (signatures.length === 0) { throw new Error('No signatures found for transaction'); } - const wallet = signatures[0].wallet || (await this.signatureRepository.findOne({ - where: { transactionHash }, - relations: ['wallet'] - })).wallet; - - const collected = signatures.filter(s => s.status === SignatureStatus.COLLECTED).length; - const pending = signatures.filter(s => s.status === SignatureStatus.PENDING && !s.isExpired).length; - const expired = signatures.filter(s => s.status === SignatureStatus.EXPIRED || s.isExpired).length; - const revoked = signatures.filter(s => s.status === SignatureStatus.REVOKED).length; - - const timeToExpiry = Math.max(...signatures.map(s => s.timeToExpiry)); + const wallet = + signatures[0].wallet || + ( + await this.signatureRepository.findOne({ + where: { transactionHash }, + relations: ['wallet'], + }) + ).wallet; + + const collected = signatures.filter( + (s) => s.status === SignatureStatus.COLLECTED, + ).length; + const pending = signatures.filter( + (s) => s.status === SignatureStatus.PENDING && !s.isExpired, + ).length; + const expired = signatures.filter( + (s) => s.status === SignatureStatus.EXPIRED || s.isExpired, + ).length; + const revoked = signatures.filter( + (s) => s.status === SignatureStatus.REVOKED, + ).length; + + const timeToExpiry = Math.max(...signatures.map((s) => s.timeToExpiry)); return { totalSigners: wallet.signers.length, @@ -157,8 +215,14 @@ export class SignatureCollectionWorkflow { }; } - private async validateSignature(wallet: MultisigWallet, signature: Signature): Promise { - if (wallet.status === WalletStatus.LOCKED || wallet.status === WalletStatus.TERMINATED) { + private async validateSignature( + wallet: MultisigWallet, + signature: Signature, + ): Promise { + if ( + wallet.status === WalletStatus.LOCKED || + wallet.status === WalletStatus.TERMINATED + ) { throw new Error('Wallet is not available for transactions'); } @@ -180,16 +244,16 @@ export class SignatureCollectionWorkflow { } private async handleThresholdReached( - wallet: MultisigWallet, - transactionHash: string, - signatures: Signature[] + wallet: MultisigWallet, + transactionHash: string, + signatures: Signature[], ): Promise { try { await this.auditLog({ eventType: 'threshold_reached', walletId: wallet.id, transactionHash, - signerIds: signatures.map(s => s.signerId), + signerIds: signatures.map((s) => s.signerId), signatureCount: signatures.length, requiredSignatures: wallet.requiredSignatures, timestamp: new Date(), @@ -197,17 +261,21 @@ export class SignatureCollectionWorkflow { await this.notifyThresholdReached(wallet, transactionHash, signatures); - this.logger.log(`Threshold reached for transaction ${transactionHash} with ${signatures.length} signatures`); - + this.logger.log( + `Threshold reached for transaction ${transactionHash} with ${signatures.length} signatures`, + ); } catch (error) { - this.logger.error(`Failed to handle threshold reached for transaction ${transactionHash}:`, error); + this.logger.error( + `Failed to handle threshold reached for transaction ${transactionHash}:`, + error, + ); } } private async notifySigners( - wallet: MultisigWallet, - signature: Signature, - collectedSignatures: Signature[] + wallet: MultisigWallet, + signature: Signature, + collectedSignatures: Signature[], ): Promise { const notificationData = { type: 'signature_collected', @@ -225,9 +293,9 @@ export class SignatureCollectionWorkflow { } private async notifySignersOfRevocation( - wallet: MultisigWallet, - signature: Signature, - activeSignatures: Signature[] + wallet: MultisigWallet, + signature: Signature, + activeSignatures: Signature[], ): Promise { const notificationData = { type: 'signature_revoked', @@ -244,9 +312,9 @@ export class SignatureCollectionWorkflow { } private async notifySignersOfExpiry( - wallet: MultisigWallet, - signature: Signature, - activeSignatures: Signature[] + wallet: MultisigWallet, + signature: Signature, + activeSignatures: Signature[], ): Promise { const notificationData = { type: 'signature_expired', @@ -263,16 +331,16 @@ export class SignatureCollectionWorkflow { } private async notifyThresholdReached( - wallet: MultisigWallet, - transactionHash: string, - signatures: Signature[] + wallet: MultisigWallet, + transactionHash: string, + signatures: Signature[], ): Promise { const notificationData = { type: 'threshold_reached', walletId: wallet.id, walletName: wallet.name, transactionHash, - signerIds: signatures.map(s => s.signerId), + signerIds: signatures.map((s) => s.signerId), signatureCount: signatures.length, requiredSignatures: wallet.requiredSignatures, canExecute: true, @@ -281,7 +349,10 @@ export class SignatureCollectionWorkflow { await this.sendNotificationsToSigners(wallet.signers, notificationData); } - private async sendNotificationsToSigners(signers: string[], data: any): Promise { + private async sendNotificationsToSigners( + signers: string[], + data: any, + ): Promise { console.log('Sending notifications to signers:', data); } diff --git a/src/pricing/algorithms/dynamic-pricing.algorithm.ts b/src/pricing/algorithms/dynamic-pricing.algorithm.ts index facd7b6..7c9daa5 100644 --- a/src/pricing/algorithms/dynamic-pricing.algorithm.ts +++ b/src/pricing/algorithms/dynamic-pricing.algorithm.ts @@ -4,7 +4,11 @@ import { Injectable, Logger } from '@nestjs/common'; export class DynamicPricingAlgorithm { private readonly logger = new Logger(DynamicPricingAlgorithm.name); - calculateBasePrice(supply: number, demand: number, basePrice?: number): number { + calculateBasePrice( + supply: number, + demand: number, + basePrice?: number, + ): number { if (supply <= 0) { this.logger.warn('Supply is zero or negative, using maximum price'); return 1000; @@ -16,7 +20,7 @@ export class DynamicPricingAlgorithm { } const supplyDemandRatio = supply / demand; - + if (basePrice) { return this.applySupplyDemandAdjustment(basePrice, supplyDemandRatio); } @@ -24,7 +28,10 @@ export class DynamicPricingAlgorithm { return this.calculateMarketBasedPrice(supplyDemandRatio); } - private applySupplyDemandAdjustment(basePrice: number, ratio: number): number { + private applySupplyDemandAdjustment( + basePrice: number, + ratio: number, + ): number { if (ratio >= 1.5) { return basePrice * 0.7; } else if (ratio >= 1.2) { @@ -40,7 +47,7 @@ export class DynamicPricingAlgorithm { private calculateMarketBasedPrice(ratio: number): number { const marketBasePrice = 50; - + if (ratio >= 2.0) { return marketBasePrice * 0.5; } else if (ratio >= 1.5) { @@ -61,24 +68,34 @@ export class DynamicPricingAlgorithm { return 1.0; } - const returns = historicalPrices.slice(1).map((price, index) => - (price - historicalPrices[index]) / historicalPrices[index] - ); + const returns = historicalPrices + .slice(1) + .map( + (price, index) => + (price - historicalPrices[index]) / historicalPrices[index], + ); - const meanReturn = returns.reduce((sum, ret) => sum + ret, 0) / returns.length; - const variance = returns.reduce((sum, ret) => sum + Math.pow(ret - meanReturn, 2), 0) / returns.length; + const meanReturn = + returns.reduce((sum, ret) => sum + ret, 0) / returns.length; + const variance = + returns.reduce((sum, ret) => sum + Math.pow(ret - meanReturn, 2), 0) / + returns.length; const volatility = Math.sqrt(variance); return Math.min(Math.max(1.0 + volatility * 10, 0.8), 1.5); } - applyPriceBounds(price: number, minPrice: number = 0.01, maxPrice: number = 1000): number { + applyPriceBounds( + price: number, + minPrice: number = 0.01, + maxPrice: number = 1000, + ): number { return Math.max(minPrice, Math.min(maxPrice, price)); } calculateElasticityAdjustment(supply: number, demand: number): number { const ratio = supply / demand; - + if (ratio < 0.3) { return 1.2; } else if (ratio < 0.6) { diff --git a/src/pricing/algorithms/location-adjustment.algorithm.ts b/src/pricing/algorithms/location-adjustment.algorithm.ts index 059c242..08326f7 100644 --- a/src/pricing/algorithms/location-adjustment.algorithm.ts +++ b/src/pricing/algorithms/location-adjustment.algorithm.ts @@ -18,12 +18,12 @@ export class LocationAdjustmentAlgorithm { key: 'new-york', value: { latitude: 40.7128, - longitude: -74.0060, + longitude: -74.006, gridDistance: 50, populationDensity: 10000, infrastructureQuality: 0.9, - localDemand: 1000 - } + localDemand: 1000, + }, }, { key: 'london', @@ -33,8 +33,8 @@ export class LocationAdjustmentAlgorithm { gridDistance: 30, populationDensity: 5700, infrastructureQuality: 0.85, - localDemand: 800 - } + localDemand: 800, + }, }, { key: 'tokyo', @@ -44,19 +44,19 @@ export class LocationAdjustmentAlgorithm { gridDistance: 20, populationDensity: 15000, infrastructureQuality: 0.95, - localDemand: 1200 - } + localDemand: 1200, + }, }, { key: 'berlin', value: { - latitude: 52.5200, - longitude: 13.4050, + latitude: 52.52, + longitude: 13.405, gridDistance: 40, populationDensity: 4000, infrastructureQuality: 0.8, - localDemand: 600 - } + localDemand: 600, + }, }, { key: 'paris', @@ -66,26 +66,38 @@ export class LocationAdjustmentAlgorithm { gridDistance: 35, populationDensity: 21000, infrastructureQuality: 0.88, - localDemand: 900 - } - } + localDemand: 900, + }, + }, ]); calculateLocationMultiplier(location: string): number { const locationData = this.getLocationData(location); - + if (!locationData) { - this.logger.warn(`Location data not found for ${location}, using default multiplier`); + this.logger.warn( + `Location data not found for ${location}, using default multiplier`, + ); return 1.0; } - const gridDistanceMultiplier = this.calculateGridDistanceMultiplier(locationData.gridDistance); - const populationDensityMultiplier = this.calculatePopulationDensityMultiplier(locationData.populationDensity); - const infrastructureMultiplier = this.calculateInfrastructureMultiplier(locationData.infrastructureQuality); - const demandMultiplier = this.calculateLocalDemandMultiplier(locationData.localDemand); - - const finalMultiplier = gridDistanceMultiplier * populationDensityMultiplier * - infrastructureMultiplier * demandMultiplier; + const gridDistanceMultiplier = this.calculateGridDistanceMultiplier( + locationData.gridDistance, + ); + const populationDensityMultiplier = + this.calculatePopulationDensityMultiplier(locationData.populationDensity); + const infrastructureMultiplier = this.calculateInfrastructureMultiplier( + locationData.infrastructureQuality, + ); + const demandMultiplier = this.calculateLocalDemandMultiplier( + locationData.localDemand, + ); + + const finalMultiplier = + gridDistanceMultiplier * + populationDensityMultiplier * + infrastructureMultiplier * + demandMultiplier; return Math.round(finalMultiplier * 100) / 100; } @@ -123,7 +135,10 @@ export class LocationAdjustmentAlgorithm { return 0.95; } - calculateDistanceBasedMultiplier(location1: string, location2: string): number { + calculateDistanceBasedMultiplier( + location1: string, + location2: string, + ): number { const data1 = this.getLocationData(location1); const data2 = this.getLocationData(location2); @@ -132,7 +147,7 @@ export class LocationAdjustmentAlgorithm { } const distance = this.calculateDistance(data1, data2); - + if (distance <= 100) return 1.0; if (distance <= 500) return 1.05; if (distance <= 1000) return 1.1; @@ -144,11 +159,14 @@ export class LocationAdjustmentAlgorithm { const R = 6371; const dLat = this.toRadians(loc2.latitude - loc1.latitude); const dLon = this.toRadians(loc2.longitude - loc1.longitude); - - const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(this.toRadians(loc1.latitude)) * Math.cos(this.toRadians(loc2.latitude)) * - Math.sin(dLon / 2) * Math.sin(dLon / 2); - + + const a = + Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(this.toRadians(loc1.latitude)) * + Math.cos(this.toRadians(loc2.latitude)) * + Math.sin(dLon / 2) * + Math.sin(dLon / 2); + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; } diff --git a/src/pricing/algorithms/prediction.algorithm.ts b/src/pricing/algorithms/prediction.algorithm.ts index f983950..3bdfd17 100644 --- a/src/pricing/algorithms/prediction.algorithm.ts +++ b/src/pricing/algorithms/prediction.algorithm.ts @@ -9,29 +9,40 @@ export class PredictionAlgorithm { historicalData: PriceHistory[], hoursAhead: number, currentSupply?: number, - currentDemand?: number + currentDemand?: number, ): { predictedPrice: number; confidence: number; factors: any } { if (historicalData.length < 5) { return { predictedPrice: 50, confidence: 0.3, - factors: { method: 'default', reason: 'insufficient_data' } + factors: { method: 'default', reason: 'insufficient_data' }, }; } - const trendPrediction = this.calculateTrendPrediction(historicalData, hoursAhead); - const seasonalPrediction = this.calculateSeasonalPrediction(historicalData, hoursAhead); - const volatilityPrediction = this.calculateVolatilityPrediction(historicalData); - const supplyDemandPrediction = this.calculateSupplyDemandPrediction(historicalData, currentSupply, currentDemand); + const trendPrediction = this.calculateTrendPrediction( + historicalData, + hoursAhead, + ); + const seasonalPrediction = this.calculateSeasonalPrediction( + historicalData, + hoursAhead, + ); + const volatilityPrediction = + this.calculateVolatilityPrediction(historicalData); + const supplyDemandPrediction = this.calculateSupplyDemandPrediction( + historicalData, + currentSupply, + currentDemand, + ); const weights = { trend: 0.3, seasonal: 0.25, volatility: 0.2, - supplyDemand: 0.25 + supplyDemand: 0.25, }; - const predictedPrice = + const predictedPrice = trendPrediction.price * weights.trend + seasonalPrediction.price * weights.seasonal + volatilityPrediction.price * weights.volatility + @@ -39,10 +50,10 @@ export class PredictionAlgorithm { const confidence = Math.min( trendPrediction.confidence * weights.trend + - seasonalPrediction.confidence * weights.seasonal + - volatilityPrediction.confidence * weights.volatility + - supplyDemandPrediction.confidence * weights.supplyDemand, - 0.95 + seasonalPrediction.confidence * weights.seasonal + + volatilityPrediction.confidence * weights.volatility + + supplyDemandPrediction.confidence * weights.supplyDemand, + 0.95, ); return { @@ -52,65 +63,96 @@ export class PredictionAlgorithm { trend: trendPrediction, seasonal: seasonalPrediction, volatility: volatilityPrediction, - supplyDemand: supplyDemandPrediction - } + supplyDemand: supplyDemandPrediction, + }, }; } - private calculateTrendPrediction(historicalData: PriceHistory[], hoursAhead: number): { price: number; confidence: number } { - const prices = historicalData.map(d => d.finalPrice); + private calculateTrendPrediction( + historicalData: PriceHistory[], + hoursAhead: number, + ): { price: number; confidence: number } { + const prices = historicalData.map((d) => d.finalPrice); const trend = this.calculateLinearTrend(prices); - - const predictedPrice = prices[prices.length - 1] + (trend.slope * hoursAhead); - const confidence = Math.max(0.3, Math.min(0.9, 1 - Math.abs(trend.correlation) * 0.3)); - + + const predictedPrice = prices[prices.length - 1] + trend.slope * hoursAhead; + const confidence = Math.max( + 0.3, + Math.min(0.9, 1 - Math.abs(trend.correlation) * 0.3), + ); + return { price: predictedPrice, confidence }; } - private calculateSeasonalPrediction(historicalData: PriceHistory[], hoursAhead: number): { price: number; confidence: number } { - const targetHour = new Date(Date.now() + hoursAhead * 60 * 60 * 1000).getHours(); - const targetDayOfWeek = new Date(Date.now() + hoursAhead * 60 * 60 * 1000).getDay(); - - const similarTimeData = historicalData.filter(d => { + private calculateSeasonalPrediction( + historicalData: PriceHistory[], + hoursAhead: number, + ): { price: number; confidence: number } { + const targetHour = new Date( + Date.now() + hoursAhead * 60 * 60 * 1000, + ).getHours(); + const targetDayOfWeek = new Date( + Date.now() + hoursAhead * 60 * 60 * 1000, + ).getDay(); + + const similarTimeData = historicalData.filter((d) => { const dataDate = new Date(d.timestamp); - return dataDate.getHours() === targetHour && dataDate.getDay() === targetDayOfWeek; + return ( + dataDate.getHours() === targetHour && + dataDate.getDay() === targetDayOfWeek + ); }); if (similarTimeData.length === 0) { - const hourlyData = historicalData.filter(d => new Date(d.timestamp).getHours() === targetHour); + const hourlyData = historicalData.filter( + (d) => new Date(d.timestamp).getHours() === targetHour, + ); if (hourlyData.length > 0) { - const avgPrice = hourlyData.reduce((sum, d) => sum + d.finalPrice, 0) / hourlyData.length; + const avgPrice = + hourlyData.reduce((sum, d) => sum + d.finalPrice, 0) / + hourlyData.length; return { price: avgPrice, confidence: 0.5 }; } - + return { price: 50, confidence: 0.3 }; } - const avgPrice = similarTimeData.reduce((sum, d) => sum + d.finalPrice, 0) / similarTimeData.length; + const avgPrice = + similarTimeData.reduce((sum, d) => sum + d.finalPrice, 0) / + similarTimeData.length; const confidence = Math.min(0.8, similarTimeData.length / 10); - + return { price: avgPrice, confidence }; } - private calculateVolatilityPrediction(historicalData: PriceHistory[]): { price: number; confidence: number } { - const prices = historicalData.map(d => d.finalPrice); + private calculateVolatilityPrediction(historicalData: PriceHistory[]): { + price: number; + confidence: number; + } { + const prices = historicalData.map((d) => d.finalPrice); const recentPrices = prices.slice(-24); - - const avgPrice = recentPrices.reduce((sum, price) => sum + price, 0) / recentPrices.length; - const variance = recentPrices.reduce((sum, price) => sum + Math.pow(price - avgPrice, 2), 0) / recentPrices.length; + + const avgPrice = + recentPrices.reduce((sum, price) => sum + price, 0) / recentPrices.length; + const variance = + recentPrices.reduce( + (sum, price) => sum + Math.pow(price - avgPrice, 2), + 0, + ) / recentPrices.length; const standardDeviation = Math.sqrt(variance); - + const volatilityFactor = standardDeviation / avgPrice; - const predictedPrice = avgPrice * (1 + (Math.random() - 0.5) * volatilityFactor * 0.5); + const predictedPrice = + avgPrice * (1 + (Math.random() - 0.5) * volatilityFactor * 0.5); const confidence = Math.max(0.4, Math.min(0.8, 1 - volatilityFactor)); - + return { price: predictedPrice, confidence }; } private calculateSupplyDemandPrediction( historicalData: PriceHistory[], currentSupply?: number, - currentDemand?: number + currentDemand?: number, ): { price: number; confidence: number } { if (currentSupply === undefined || currentDemand === undefined) { const latestData = historicalData[historicalData.length - 1]; @@ -118,7 +160,7 @@ export class PredictionAlgorithm { } const ratio = currentSupply / currentDemand; - + let priceAdjustment = 1; if (ratio < 0.5) priceAdjustment = 1.8; else if (ratio < 0.8) priceAdjustment = 1.3; @@ -129,11 +171,14 @@ export class PredictionAlgorithm { const basePrice = historicalData[historicalData.length - 1].finalPrice; const predictedPrice = basePrice * priceAdjustment; const confidence = 0.7; - + return { price: predictedPrice, confidence }; } - private calculateLinearTrend(values: number[]): { slope: number; correlation: number } { + private calculateLinearTrend(values: number[]): { + slope: number; + correlation: number; + } { const n = values.length; const x = Array.from({ length: n }, (_, i) => i); const sumX = x.reduce((a, b) => a + b, 0); @@ -142,27 +187,44 @@ export class PredictionAlgorithm { const sumXX = x.reduce((sum, xi) => sum + xi * xi, 0); const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX); - + const meanX = sumX / n; const meanY = sumY / n; - const numerator = x.reduce((sum, xi, i) => sum + (xi - meanX) * (values[i] - meanY), 0); - const denominatorX = Math.sqrt(x.reduce((sum, xi) => sum + Math.pow(xi - meanX, 2), 0)); - const denominatorY = Math.sqrt(values.reduce((sum, yi) => sum + Math.pow(yi - meanY, 2), 0)); - - const correlation = denominatorX * denominatorY === 0 ? 0 : numerator / (denominatorX * denominatorY); - + const numerator = x.reduce( + (sum, xi, i) => sum + (xi - meanX) * (values[i] - meanY), + 0, + ); + const denominatorX = Math.sqrt( + x.reduce((sum, xi) => sum + Math.pow(xi - meanX, 2), 0), + ); + const denominatorY = Math.sqrt( + values.reduce((sum, yi) => sum + Math.pow(yi - meanY, 2), 0), + ); + + const correlation = + denominatorX * denominatorY === 0 + ? 0 + : numerator / (denominatorX * denominatorY); + return { slope, correlation }; } - calculatePredictionAccuracy(predictions: Array<{ predicted: number; actual: number }>): number { + calculatePredictionAccuracy( + predictions: Array<{ predicted: number; actual: number }>, + ): number { if (predictions.length === 0) return 0; - - const totalAbsoluteError = predictions.reduce((sum, p) => sum + Math.abs(p.predicted - p.actual), 0); - const averageActualPrice = predictions.reduce((sum, p) => sum + p.actual, 0) / predictions.length; - - const meanAbsolutePercentageError = (totalAbsoluteError / predictions.length) / averageActualPrice; + + const totalAbsoluteError = predictions.reduce( + (sum, p) => sum + Math.abs(p.predicted - p.actual), + 0, + ); + const averageActualPrice = + predictions.reduce((sum, p) => sum + p.actual, 0) / predictions.length; + + const meanAbsolutePercentageError = + totalAbsoluteError / predictions.length / averageActualPrice; const accuracy = Math.max(0, 1 - meanAbsolutePercentageError); - + return Math.round(accuracy * 100) / 100; } } diff --git a/src/pricing/algorithms/time-pricing.algorithm.ts b/src/pricing/algorithms/time-pricing.algorithm.ts index 9c5d7be..d25ac23 100644 --- a/src/pricing/algorithms/time-pricing.algorithm.ts +++ b/src/pricing/algorithms/time-pricing.algorithm.ts @@ -8,13 +8,14 @@ export class TimePricingAlgorithm { const date = new Date(timestamp); const hour = date.getHours(); const dayOfWeek = date.getDay(); - + const hourlyMultiplier = this.calculateHourlyMultiplier(hour); const dailyMultiplier = this.calculateDailyMultiplier(dayOfWeek); const seasonalMultiplier = this.calculateSeasonalMultiplier(date); - - const finalMultiplier = hourlyMultiplier * dailyMultiplier * seasonalMultiplier; - + + const finalMultiplier = + hourlyMultiplier * dailyMultiplier * seasonalMultiplier; + return Math.round(finalMultiplier * 100) / 100; } @@ -32,7 +33,7 @@ export class TimePricingAlgorithm { } else if (hour >= 22 || hour < 6) { return 0.7; } - + return 1.0; } @@ -44,14 +45,14 @@ export class TimePricingAlgorithm { } else if (dayOfWeek === 5) { return 1.05; } - + return 1.0; } private calculateSeasonalMultiplier(date: Date): number { const month = date.getMonth(); const day = date.getDate(); - + if (month === 11 && day >= 20) { return 1.2; } else if (month === 0 && day <= 5) { @@ -63,7 +64,7 @@ export class TimePricingAlgorithm { } else if (month === 4 || month === 5 || month === 9 || month === 10) { return 0.95; } - + return 1.0; } @@ -71,32 +72,35 @@ export class TimePricingAlgorithm { const date = new Date(timestamp); const hour = date.getHours(); const dayOfWeek = date.getDay(); - + if (dayOfWeek === 0 || dayOfWeek === 6) { return false; } - + return (hour >= 7 && hour < 10) || (hour >= 17 && hour < 20); } isOffPeakHour(timestamp: number): boolean { const date = new Date(timestamp); const hour = date.getHours(); - + return hour >= 22 || hour < 6; } - calculateTimeBasedDemandForecast(timestamp: number, baseDemand: number): number { + calculateTimeBasedDemandForecast( + timestamp: number, + baseDemand: number, + ): number { const timeMultiplier = this.calculateTimeMultiplier(timestamp); const seasonalAdjustment = this.getSeasonalDemandAdjustment(timestamp); - + return baseDemand * timeMultiplier * seasonalAdjustment; } private getSeasonalDemandAdjustment(timestamp: number): number { const date = new Date(timestamp); const month = date.getMonth(); - + const seasonalFactors = { 0: 1.1, 1: 1.05, @@ -109,33 +113,36 @@ export class TimePricingAlgorithm { 8: 1.1, 9: 0.95, 10: 0.9, - 11: 1.05 + 11: 1.05, }; - + return seasonalFactors[month] || 1.0; } getPeakHoursForDay(timestamp: number): { start: number; end: number }[] { const date = new Date(timestamp); const dayOfWeek = date.getDay(); - + if (dayOfWeek === 0 || dayOfWeek === 6) { return [ { start: 8, end: 11 }, - { start: 17, end: 20 } + { start: 17, end: 20 }, ]; } - + return [ { start: 6, end: 9 }, - { start: 17, end: 20 } + { start: 17, end: 20 }, ]; } - calculateDurationBasedMultiplier(startTimestamp: number, endTimestamp: number): number { + calculateDurationBasedMultiplier( + startTimestamp: number, + endTimestamp: number, + ): number { const duration = endTimestamp - startTimestamp; const hours = duration / (1000 * 60 * 60); - + if (hours <= 1) return 1.2; if (hours <= 4) return 1.1; if (hours <= 8) return 1.0; diff --git a/src/pricing/dto/calculate-price.dto.ts b/src/pricing/dto/calculate-price.dto.ts index 025649e..19c9d7b 100644 --- a/src/pricing/dto/calculate-price.dto.ts +++ b/src/pricing/dto/calculate-price.dto.ts @@ -1,4 +1,12 @@ -import { IsString, IsNumber, IsOptional, IsBoolean, Min, Max, IsEnum } from 'class-validator'; +import { + IsString, + IsNumber, + IsOptional, + IsBoolean, + Min, + Max, + IsEnum, +} from 'class-validator'; import { Type } from 'class-transformer'; export enum EnergyType { @@ -7,7 +15,7 @@ export enum EnergyType { HYDRO = 'hydro', NUCLEAR = 'nuclear', FOSSIL = 'fossil', - GEOTHERMAL = 'geothermal' + GEOTHERMAL = 'geothermal', } export class CalculatePriceDto { diff --git a/src/pricing/entities/price-history.entity.ts b/src/pricing/entities/price-history.entity.ts index de39447..51b258b 100644 --- a/src/pricing/entities/price-history.entity.ts +++ b/src/pricing/entities/price-history.entity.ts @@ -1,4 +1,10 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + Index, +} from 'typeorm'; @Entity('price_history') @Index(['timestamp', 'location']) diff --git a/src/pricing/pricing.controller.ts b/src/pricing/pricing.controller.ts index 556377a..eb28d9b 100644 --- a/src/pricing/pricing.controller.ts +++ b/src/pricing/pricing.controller.ts @@ -1,7 +1,11 @@ import { Controller, Get, Post, Body, Query } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiResponse, ApiQuery } from '@nestjs/swagger'; import { PricingService } from './pricing.service'; -import { CalculatePriceDto, PriceHistoryQueryDto, PricePredictionDto } from './dto/calculate-price.dto'; +import { + CalculatePriceDto, + PriceHistoryQueryDto, + PricePredictionDto, +} from './dto/calculate-price.dto'; @ApiTags('pricing') @Controller('pricing') @@ -17,18 +21,40 @@ export class PricingController { @Post('predict') @ApiOperation({ summary: 'Predict future energy prices' }) - @ApiResponse({ status: 200, description: 'Price prediction generated successfully' }) + @ApiResponse({ + status: 200, + description: 'Price prediction generated successfully', + }) async predictPrice(@Body() predictionDto: PricePredictionDto) { return this.pricingService.predictPrice(predictionDto); } @Get('history') @ApiOperation({ summary: 'Get price history' }) - @ApiResponse({ status: 200, description: 'Price history retrieved successfully' }) - @ApiQuery({ name: 'location', required: false, description: 'Filter by location' }) - @ApiQuery({ name: 'energyType', required: false, description: 'Filter by energy type' }) - @ApiQuery({ name: 'startDate', required: false, description: 'Start date timestamp' }) - @ApiQuery({ name: 'endDate', required: false, description: 'End date timestamp' }) + @ApiResponse({ + status: 200, + description: 'Price history retrieved successfully', + }) + @ApiQuery({ + name: 'location', + required: false, + description: 'Filter by location', + }) + @ApiQuery({ + name: 'energyType', + required: false, + description: 'Filter by energy type', + }) + @ApiQuery({ + name: 'startDate', + required: false, + description: 'Start date timestamp', + }) + @ApiQuery({ + name: 'endDate', + required: false, + description: 'End date timestamp', + }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) async getPriceHistory(@Query() query: PriceHistoryQueryDto) { @@ -38,8 +64,16 @@ export class PricingController { @Get('analytics') @ApiOperation({ summary: 'Get pricing analytics and statistics' }) @ApiResponse({ status: 200, description: 'Analytics retrieved successfully' }) - @ApiQuery({ name: 'location', required: false, description: 'Filter by location' }) - @ApiQuery({ name: 'energyType', required: false, description: 'Filter by energy type' }) + @ApiQuery({ + name: 'location', + required: false, + description: 'Filter by location', + }) + @ApiQuery({ + name: 'energyType', + required: false, + description: 'Filter by energy type', + }) async getAnalytics( @Query('location') location?: string, @Query('energyType') energyType?: string, diff --git a/src/pricing/pricing.service.spec.ts b/src/pricing/pricing.service.spec.ts index c2b0781..38fcd73 100644 --- a/src/pricing/pricing.service.spec.ts +++ b/src/pricing/pricing.service.spec.ts @@ -68,10 +68,17 @@ describe('PricingService', () => { .compile(); service = module.get(PricingService); - priceHistoryRepository = module.get>(getRepositoryToken(PriceHistory)); - dynamicPricingAlgorithm = module.get(DynamicPricingAlgorithm); - locationAdjustmentAlgorithm = module.get(LocationAdjustmentAlgorithm); - timePricingAlgorithm = module.get(TimePricingAlgorithm); + priceHistoryRepository = module.get>( + getRepositoryToken(PriceHistory), + ); + dynamicPricingAlgorithm = module.get( + DynamicPricingAlgorithm, + ); + locationAdjustmentAlgorithm = module.get( + LocationAdjustmentAlgorithm, + ); + timePricingAlgorithm = + module.get(TimePricingAlgorithm); predictionAlgorithm = module.get(PredictionAlgorithm); }); @@ -91,7 +98,9 @@ describe('PricingService', () => { }; mockDynamicPricingAlgorithm.calculateBasePrice.mockReturnValue(50); - mockLocationAdjustmentAlgorithm.calculateLocationMultiplier.mockReturnValue(1.2); + mockLocationAdjustmentAlgorithm.calculateLocationMultiplier.mockReturnValue( + 1.2, + ); mockTimePricingAlgorithm.calculateTimeMultiplier.mockReturnValue(1.1); mockTimePricingAlgorithm.isPeakHour.mockReturnValue(false); mockDynamicPricingAlgorithm.applyPriceBounds.mockReturnValue(66); @@ -108,9 +117,15 @@ describe('PricingService', () => { isPeakHour: false, }); - expect(mockDynamicPricingAlgorithm.calculateBasePrice).toHaveBeenCalledWith(1000, 800, undefined); - expect(mockLocationAdjustmentAlgorithm.calculateLocationMultiplier).toHaveBeenCalledWith('new-york'); - expect(mockTimePricingAlgorithm.calculateTimeMultiplier).toHaveBeenCalled(); + expect( + mockDynamicPricingAlgorithm.calculateBasePrice, + ).toHaveBeenCalledWith(1000, 800, undefined); + expect( + mockLocationAdjustmentAlgorithm.calculateLocationMultiplier, + ).toHaveBeenCalledWith('new-york'); + expect( + mockTimePricingAlgorithm.calculateTimeMultiplier, + ).toHaveBeenCalled(); expect(mockPriceHistoryRepository.create).toHaveBeenCalled(); expect(mockPriceHistoryRepository.save).toHaveBeenCalled(); }); @@ -133,7 +148,9 @@ describe('PricingService', () => { ]; mockDynamicPricingAlgorithm.calculateBasePrice.mockReturnValue(50); - mockLocationAdjustmentAlgorithm.calculateLocationMultiplier.mockReturnValue(1.2); + mockLocationAdjustmentAlgorithm.calculateLocationMultiplier.mockReturnValue( + 1.2, + ); mockTimePricingAlgorithm.calculateTimeMultiplier.mockReturnValue(1.1); mockTimePricingAlgorithm.isPeakHour.mockReturnValue(false); mockDynamicPricingAlgorithm.applyPriceBounds.mockReturnValue(66); @@ -148,28 +165,41 @@ describe('PricingService', () => { expect(result.predictedPrice).toBe(68); expect(result.predictionAccuracy).toBe(85); - expect(mockPredictionAlgorithm.predictPrice).toHaveBeenCalledWith(historicalData, 2, 1000, 800); + expect(mockPredictionAlgorithm.predictPrice).toHaveBeenCalledWith( + historicalData, + 2, + 1000, + 800, + ); }); }); describe('calculateRenewablePremium', () => { it('should return correct premium for solar energy', () => { - const premium = (service as any).calculateRenewablePremium(EnergyType.SOLAR); + const premium = (service as any).calculateRenewablePremium( + EnergyType.SOLAR, + ); expect(premium).toBe(0.05); }); it('should return correct premium for wind energy', () => { - const premium = (service as any).calculateRenewablePremium(EnergyType.WIND); + const premium = (service as any).calculateRenewablePremium( + EnergyType.WIND, + ); expect(premium).toBe(0.08); }); it('should return negative premium for nuclear energy', () => { - const premium = (service as any).calculateRenewablePremium(EnergyType.NUCLEAR); + const premium = (service as any).calculateRenewablePremium( + EnergyType.NUCLEAR, + ); expect(premium).toBe(-0.02); }); it('should return positive premium for fossil fuel', () => { - const premium = (service as any).calculateRenewablePremium(EnergyType.FOSSIL); + const premium = (service as any).calculateRenewablePremium( + EnergyType.FOSSIL, + ); expect(premium).toBe(0.15); }); }); @@ -179,11 +209,15 @@ describe('PricingService', () => { expect((service as any).isRenewableEnergy(EnergyType.SOLAR)).toBe(true); expect((service as any).isRenewableEnergy(EnergyType.WIND)).toBe(true); expect((service as any).isRenewableEnergy(EnergyType.HYDRO)).toBe(true); - expect((service as any).isRenewableEnergy(EnergyType.GEOTHERMAL)).toBe(true); + expect((service as any).isRenewableEnergy(EnergyType.GEOTHERMAL)).toBe( + true, + ); }); it('should return false for non-renewable energy types', () => { - expect((service as any).isRenewableEnergy(EnergyType.NUCLEAR)).toBe(false); + expect((service as any).isRenewableEnergy(EnergyType.NUCLEAR)).toBe( + false, + ); expect((service as any).isRenewableEnergy(EnergyType.FOSSIL)).toBe(false); }); }); @@ -230,9 +264,24 @@ describe('PricingService', () => { describe('getPricingAnalytics', () => { it('should return pricing analytics', async () => { const history = [ - { finalPrice: 60, isPeakHour: true, isRenewable: true, predictionAccuracy: 85 }, - { finalPrice: 65, isPeakHour: false, isRenewable: false, predictionAccuracy: 90 }, - { finalPrice: 70, isPeakHour: true, isRenewable: true, predictionAccuracy: 80 }, + { + finalPrice: 60, + isPeakHour: true, + isRenewable: true, + predictionAccuracy: 85, + }, + { + finalPrice: 65, + isPeakHour: false, + isRenewable: false, + predictionAccuracy: 90, + }, + { + finalPrice: 70, + isPeakHour: true, + isRenewable: true, + predictionAccuracy: 80, + }, ]; mockPriceHistoryRepository.find.mockResolvedValue(history as any); diff --git a/src/pricing/pricing.service.ts b/src/pricing/pricing.service.ts index cc3c48e..275f84c 100644 --- a/src/pricing/pricing.service.ts +++ b/src/pricing/pricing.service.ts @@ -3,7 +3,12 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository, LessThan } from 'typeorm'; import { Cron, CronExpression } from '@nestjs/schedule'; import { PriceHistory } from './entities/price-history.entity'; -import { CalculatePriceDto, PriceHistoryQueryDto, PricePredictionDto, EnergyType } from './dto/calculate-price.dto'; +import { + CalculatePriceDto, + PriceHistoryQueryDto, + PricePredictionDto, + EnergyType, +} from './dto/calculate-price.dto'; import { DynamicPricingAlgorithm } from './algorithms/dynamic-pricing.algorithm'; import { LocationAdjustmentAlgorithm } from './algorithms/location-adjustment.algorithm'; import { TimePricingAlgorithm } from './algorithms/time-pricing.algorithm'; @@ -33,22 +38,37 @@ export class PricingService { predictedPrice?: number; predictionAccuracy?: number; }> { - const { supply, demand, location, energyType, timestamp = Date.now(), basePrice, includePrediction = false, predictionHorizonHours = 1 } = calculatePriceDto; - + const { + supply, + demand, + location, + energyType, + timestamp = Date.now(), + basePrice, + includePrediction = false, + predictionHorizonHours = 1, + } = calculatePriceDto; + const supplyDemandRatio = supply / demand; - const calculatedBasePrice = this.dynamicPricingAlgorithm.calculateBasePrice(supply, demand, basePrice); - - const locationMultiplier = this.locationAdjustmentAlgorithm.calculateLocationMultiplier(location); - const timeMultiplier = this.timePricingAlgorithm.calculateTimeMultiplier(timestamp); + const calculatedBasePrice = this.dynamicPricingAlgorithm.calculateBasePrice( + supply, + demand, + basePrice, + ); + + const locationMultiplier = + this.locationAdjustmentAlgorithm.calculateLocationMultiplier(location); + const timeMultiplier = + this.timePricingAlgorithm.calculateTimeMultiplier(timestamp); const renewablePremium = this.calculateRenewablePremium(energyType); const isPeakHour = this.timePricingAlgorithm.isPeakHour(timestamp); - + let finalPrice = calculatedBasePrice * locationMultiplier * timeMultiplier; - + if (this.isRenewableEnergy(energyType)) { - finalPrice *= (1 + renewablePremium); + finalPrice *= 1 + renewablePremium; } - + finalPrice = this.dynamicPricingAlgorithm.applyPriceBounds(finalPrice); const result: any = { @@ -62,9 +82,18 @@ export class PricingService { }; if (includePrediction) { - const historicalData = await this.getHistoricalData(location, energyType, 168); - const prediction = this.predictionAlgorithm.predictPrice(historicalData, predictionHorizonHours, supply, demand); - + const historicalData = await this.getHistoricalData( + location, + energyType, + 168, + ); + const prediction = this.predictionAlgorithm.predictPrice( + historicalData, + predictionHorizonHours, + supply, + demand, + ); + result.predictedPrice = Math.round(prediction.predictedPrice * 100) / 100; result.predictionAccuracy = Math.round(prediction.confidence * 100); } @@ -104,7 +133,12 @@ export class PricingService { } private isRenewableEnergy(energyType: EnergyType): boolean { - return [EnergyType.SOLAR, EnergyType.WIND, EnergyType.HYDRO, EnergyType.GEOTHERMAL].includes(energyType); + return [ + EnergyType.SOLAR, + EnergyType.WIND, + EnergyType.HYDRO, + EnergyType.GEOTHERMAL, + ].includes(energyType); } async predictPrice(predictionDto: PricePredictionDto): Promise<{ @@ -112,15 +146,20 @@ export class PricingService { confidence: number; factors: any; }> { - const { location, energyType, hoursAhead, expectedSupply, expectedDemand } = predictionDto; - - const historicalData = await this.getHistoricalData(location, energyType, 168); - + const { location, energyType, hoursAhead, expectedSupply, expectedDemand } = + predictionDto; + + const historicalData = await this.getHistoricalData( + location, + energyType, + 168, + ); + const prediction = this.predictionAlgorithm.predictPrice( historicalData, hoursAhead, expectedSupply, - expectedDemand + expectedDemand, ); return { @@ -137,10 +176,17 @@ export class PricingService { minPrice: number; maxPrice: number; }> { - const { location, energyType, startDate, endDate, page = 1, limit = 10 } = query; - + const { + location, + energyType, + startDate, + endDate, + page = 1, + limit = 10, + } = query; + const whereClause: any = {}; - + if (location) whereClause.location = location; if (energyType) whereClause.energyType = energyType; if (startDate) whereClause.timestamp = { $gte: new Date(startDate) }; @@ -153,8 +199,11 @@ export class PricingService { take: limit, }); - const prices = history.map(h => h.finalPrice); - const averagePrice = prices.length > 0 ? prices.reduce((sum, price) => sum + price, 0) / prices.length : 0; + const prices = history.map((h) => h.finalPrice); + const averagePrice = + prices.length > 0 + ? prices.reduce((sum, price) => sum + price, 0) / prices.length + : 0; const minPrice = prices.length > 0 ? Math.min(...prices) : 0; const maxPrice = prices.length > 0 ? Math.max(...prices) : 0; @@ -167,9 +216,13 @@ export class PricingService { }; } - private async getHistoricalData(location: string, energyType: string, hours: number): Promise { + private async getHistoricalData( + location: string, + energyType: string, + hours: number, + ): Promise { const startDate = new Date(Date.now() - hours * 60 * 60 * 1000); - + return this.priceHistoryRepository.find({ where: { location, @@ -181,12 +234,17 @@ export class PricingService { }); } - private async savePriceHistory(priceData: Partial): Promise { + private async savePriceHistory( + priceData: Partial, + ): Promise { const priceHistory = this.priceHistoryRepository.create(priceData); await this.priceHistoryRepository.save(priceHistory); } - async getPricingAnalytics(location?: string, energyType?: string): Promise<{ + async getPricingAnalytics( + location?: string, + energyType?: string, + ): Promise<{ totalTransactions: number; averagePrice: number; priceVolatility: number; @@ -217,40 +275,70 @@ export class PricingService { }; } - const prices = history.map(h => h.finalPrice); - const averagePrice = prices.reduce((sum, price) => sum + price, 0) / prices.length; - - const variance = prices.reduce((sum, price) => sum + Math.pow(price - averagePrice, 2), 0) / prices.length; + const prices = history.map((h) => h.finalPrice); + const averagePrice = + prices.reduce((sum, price) => sum + price, 0) / prices.length; + + const variance = + prices.reduce( + (sum, price) => sum + Math.pow(price - averagePrice, 2), + 0, + ) / prices.length; const priceVolatility = Math.sqrt(variance); - const peakHourPrices = history.filter(h => h.isPeakHour).map(h => h.finalPrice); - const offPeakHourPrices = history.filter(h => !h.isPeakHour).map(h => h.finalPrice); - - const peakHourAverage = peakHourPrices.length > 0 - ? peakHourPrices.reduce((sum, price) => sum + price, 0) / peakHourPrices.length - : 0; - - const offPeakHourAverage = offPeakHourPrices.length > 0 - ? offPeakHourPrices.reduce((sum, price) => sum + price, 0) / offPeakHourPrices.length - : 0; - - const renewablePrices = history.filter(h => h.isRenewable).map(h => h.finalPrice); - const nonRenewablePrices = history.filter(h => !h.isRenewable).map(h => h.finalPrice); - - const renewableAverage = renewablePrices.length > 0 - ? renewablePrices.reduce((sum, price) => sum + price, 0) / renewablePrices.length - : 0; - - const nonRenewableAverage = nonRenewablePrices.length > 0 - ? nonRenewablePrices.reduce((sum, price) => sum + price, 0) / nonRenewablePrices.length - : 0; - - const renewablePremium = nonRenewableAverage > 0 ? (renewableAverage - nonRenewableAverage) / nonRenewableAverage : 0; - - const predictionsWithAccuracy = history.filter(h => h.predictionAccuracy !== null); - const predictionAccuracy = predictionsWithAccuracy.length > 0 - ? predictionsWithAccuracy.reduce((sum, h) => sum + h.predictionAccuracy, 0) / predictionsWithAccuracy.length - : 0; + const peakHourPrices = history + .filter((h) => h.isPeakHour) + .map((h) => h.finalPrice); + const offPeakHourPrices = history + .filter((h) => !h.isPeakHour) + .map((h) => h.finalPrice); + + const peakHourAverage = + peakHourPrices.length > 0 + ? peakHourPrices.reduce((sum, price) => sum + price, 0) / + peakHourPrices.length + : 0; + + const offPeakHourAverage = + offPeakHourPrices.length > 0 + ? offPeakHourPrices.reduce((sum, price) => sum + price, 0) / + offPeakHourPrices.length + : 0; + + const renewablePrices = history + .filter((h) => h.isRenewable) + .map((h) => h.finalPrice); + const nonRenewablePrices = history + .filter((h) => !h.isRenewable) + .map((h) => h.finalPrice); + + const renewableAverage = + renewablePrices.length > 0 + ? renewablePrices.reduce((sum, price) => sum + price, 0) / + renewablePrices.length + : 0; + + const nonRenewableAverage = + nonRenewablePrices.length > 0 + ? nonRenewablePrices.reduce((sum, price) => sum + price, 0) / + nonRenewablePrices.length + : 0; + + const renewablePremium = + nonRenewableAverage > 0 + ? (renewableAverage - nonRenewableAverage) / nonRenewableAverage + : 0; + + const predictionsWithAccuracy = history.filter( + (h) => h.predictionAccuracy !== null, + ); + const predictionAccuracy = + predictionsWithAccuracy.length > 0 + ? predictionsWithAccuracy.reduce( + (sum, h) => sum + h.predictionAccuracy, + 0, + ) / predictionsWithAccuracy.length + : 0; return { totalTransactions: history.length, @@ -266,7 +354,7 @@ export class PricingService { @Cron(CronExpression.EVERY_HOUR) async cleanupOldData(): Promise { const cutoffDate = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000); - + const result = await this.priceHistoryRepository.delete({ timestamp: LessThan(cutoffDate), }); diff --git a/src/scheduler/controllers/scheduler.controller.ts b/src/scheduler/controllers/scheduler.controller.ts index 1661516..e49992c 100644 --- a/src/scheduler/controllers/scheduler.controller.ts +++ b/src/scheduler/controllers/scheduler.controller.ts @@ -1,21 +1,33 @@ -import { - Controller, - Get, - Post, - Put, - Delete, - Body, - Param, - Query, +import { + Controller, + Get, + Post, + Put, + Delete, + Body, + Param, + Query, UseGuards, Request, HttpStatus, - HttpCode + HttpCode, } from '@nestjs/common'; -import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiQuery } from '@nestjs/swagger'; +import { + ApiTags, + ApiOperation, + ApiResponse, + ApiParam, + ApiQuery, +} from '@nestjs/swagger'; import { SchedulerService } from '../scheduler.service'; import { MarketHoursService } from '../services/market-hours.service'; -import { ScheduleTradeDto, UpdateScheduleDto, BulkScheduleDto, EmergencyStopDto, JobQueryDto } from '../dto/schedule-trade.dto'; +import { + ScheduleTradeDto, + UpdateScheduleDto, + BulkScheduleDto, + EmergencyStopDto, + JobQueryDto, +} from '../dto/schedule-trade.dto'; import { ScheduledJob } from '../entities/scheduled-job.entity'; @ApiTags('scheduler') @@ -28,22 +40,41 @@ export class SchedulerController { @Post('jobs/schedule') @ApiOperation({ summary: 'Schedule a new job' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Job scheduled successfully', type: ScheduledJob }) - @ApiResponse({ status: HttpStatus.BAD_REQUEST, description: 'Invalid job data' }) - async scheduleJob(@Body() scheduleTradeDto: ScheduleTradeDto, @Request() req): Promise { + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Job scheduled successfully', + type: ScheduledJob, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Invalid job data', + }) + async scheduleJob( + @Body() scheduleTradeDto: ScheduleTradeDto, + @Request() req, + ): Promise { return this.schedulerService.scheduleTrade(scheduleTradeDto, req.user?.id); } @Post('jobs/bulk-schedule') @ApiOperation({ summary: 'Schedule multiple jobs' }) - @ApiResponse({ status: HttpStatus.CREATED, description: 'Jobs scheduled successfully' }) - async bulkScheduleJobs(@Body() bulkScheduleDto: BulkScheduleDto, @Request() req): Promise { + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Jobs scheduled successfully', + }) + async bulkScheduleJobs( + @Body() bulkScheduleDto: BulkScheduleDto, + @Request() req, + ): Promise { return this.schedulerService.bulkSchedule(bulkScheduleDto, req.user?.id); } @Get('jobs') @ApiOperation({ summary: 'Get scheduled jobs with filtering' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Jobs retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Jobs retrieved successfully', + }) @ApiQuery({ name: 'type', required: false }) @ApiQuery({ name: 'status', required: false }) @ApiQuery({ name: 'priority', required: false }) @@ -55,7 +86,11 @@ export class SchedulerController { @Get('jobs/:id') @ApiOperation({ summary: 'Get job by ID' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Job retrieved successfully', type: ScheduledJob }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Job retrieved successfully', + type: ScheduledJob, + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' }) @ApiParam({ name: 'id', description: 'Job ID' }) async getJob(@Param('id') id: string): Promise { @@ -64,16 +99,31 @@ export class SchedulerController { @Put('jobs/:id') @ApiOperation({ summary: 'Update scheduled job' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Job updated successfully', type: ScheduledJob }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Job updated successfully', + type: ScheduledJob, + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' }) @ApiParam({ name: 'id', description: 'Job ID' }) - async updateJob(@Param('id') id: string, @Body() updateScheduleDto: UpdateScheduleDto, @Request() req): Promise { - return this.schedulerService.updateSchedule(id, updateScheduleDto, req.user?.id); + async updateJob( + @Param('id') id: string, + @Body() updateScheduleDto: UpdateScheduleDto, + @Request() req, + ): Promise { + return this.schedulerService.updateSchedule( + id, + updateScheduleDto, + req.user?.id, + ); } @Post('jobs/:id/execute') @ApiOperation({ summary: 'Execute a job immediately' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Job executed successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Job executed successfully', + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' }) @ApiParam({ name: 'id', description: 'Job ID' }) async executeJob(@Param('id') id: string): Promise { @@ -83,16 +133,26 @@ export class SchedulerController { @Delete('jobs/:id') @HttpCode(HttpStatus.OK) @ApiOperation({ summary: 'Cancel a scheduled job' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Job cancelled successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Job cancelled successfully', + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' }) @ApiParam({ name: 'id', description: 'Job ID' }) - async cancelJob(@Param('id') id: string, @Body() body: { reason?: string }, @Request() req): Promise { + async cancelJob( + @Param('id') id: string, + @Body() body: { reason?: string }, + @Request() req, + ): Promise { return this.schedulerService.cancelJob(id, req.user?.id, body.reason); } @Get('jobs/:id/metrics') @ApiOperation({ summary: 'Get job execution metrics' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Metrics retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Metrics retrieved successfully', + }) @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' }) @ApiParam({ name: 'id', description: 'Job ID' }) async getJobMetrics(@Param('id') id: string): Promise { @@ -101,28 +161,43 @@ export class SchedulerController { @Post('emergency-stop') @ApiOperation({ summary: 'Emergency stop all or specific jobs' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Emergency stop executed successfully' }) - async emergencyStop(@Body() emergencyStopDto: EmergencyStopDto, @Request() req): Promise { + @ApiResponse({ + status: HttpStatus.OK, + description: 'Emergency stop executed successfully', + }) + async emergencyStop( + @Body() emergencyStopDto: EmergencyStopDto, + @Request() req, + ): Promise { return this.schedulerService.emergencyStop(emergencyStopDto, req.user?.id); } @Post('emergency-resume') @ApiOperation({ summary: 'Resume emergency stopped jobs' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Jobs resumed successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Jobs resumed successfully', + }) async resumeEmergencyStops(@Request() req): Promise { return this.schedulerService.resumeEmergencyStops(req.user?.id); } @Get('metrics') @ApiOperation({ summary: 'Get scheduler metrics' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Metrics retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Metrics retrieved successfully', + }) async getMetrics(): Promise { return this.schedulerService.getSchedulerMetrics(); } @Get('market-hours/:market') @ApiOperation({ summary: 'Get market hours for a specific market' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Market hours retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Market hours retrieved successfully', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) async getMarketHours(@Param('market') market: string): Promise { return this.marketHoursService.getMarketHours(market); @@ -130,7 +205,10 @@ export class SchedulerController { @Get('market-hours/:market/status') @ApiOperation({ summary: 'Get current market status' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Market status retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Market status retrieved successfully', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) async getMarketStatus(@Param('market') market: string): Promise { return this.marketHoursService.getMarketStatus(market); @@ -138,48 +216,72 @@ export class SchedulerController { @Get('market-hours/:market/is-open') @ApiOperation({ summary: 'Check if market is open' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Market status retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Market status retrieved successfully', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) - async isMarketOpen(@Param('market') market: string): Promise<{ isOpen: boolean }> { + async isMarketOpen( + @Param('market') market: string, + ): Promise<{ isOpen: boolean }> { const isOpen = await this.marketHoursService.isMarketOpen(market); return { isOpen }; } @Get('market-hours/:market/next-open') @ApiOperation({ summary: 'Get next market opening time' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Next opening time retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Next opening time retrieved successfully', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) - async getNextMarketOpen(@Param('market') market: string): Promise<{ nextOpen: Date }> { + async getNextMarketOpen( + @Param('market') market: string, + ): Promise<{ nextOpen: Date }> { const nextOpen = await this.marketHoursService.getNextMarketOpen(market); return { nextOpen }; } @Get('market-hours/:market/next-close') @ApiOperation({ summary: 'Get next market closing time' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Next closing time retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Next closing time retrieved successfully', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) - async getNextMarketClose(@Param('market') market: string): Promise<{ nextClose: Date }> { + async getNextMarketClose( + @Param('market') market: string, + ): Promise<{ nextClose: Date }> { const nextClose = await this.marketHoursService.getNextMarketClose(market); return { nextClose }; } @Get('market-hours/all') @ApiOperation({ summary: 'Get all market statuses' }) - @ApiResponse({ status: HttpStatus.OK, description: 'All market statuses retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'All market statuses retrieved successfully', + }) async getAllMarketStatuses(): Promise> { return this.marketHoursService.getAllMarketStatuses(); } @Get('market-hours/active') @ApiOperation({ summary: 'Get currently active markets' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Active markets retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Active markets retrieved successfully', + }) async getActiveMarkets(): Promise { return this.marketHoursService.getActiveMarkets(); } @Get('market-hours/is-globally-open') @ApiOperation({ summary: 'Check if any market is globally open' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Global market status retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Global market status retrieved successfully', + }) async isGloballyOpen(): Promise<{ isOpen: boolean }> { const isOpen = await this.marketHoursService.isGloballyOpen(); return { isOpen }; @@ -187,11 +289,14 @@ export class SchedulerController { @Post('market-hours/:market/validate-time') @ApiOperation({ summary: 'Validate execution time for market hours' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Time validation completed' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Time validation completed', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) async validateExecutionTime( @Param('market') market: string, - @Body() body: { executionTime: string } + @Body() body: { executionTime: string }, ): Promise { const executionTime = new Date(body.executionTime); return this.marketHoursService.validateExecutionTime(market, executionTime); @@ -199,40 +304,61 @@ export class SchedulerController { @Post('market-hours/:market/adjust-time') @ApiOperation({ summary: 'Adjust execution time to market hours' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Time adjustment completed' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Time adjustment completed', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) async adjustForMarketHours( @Param('market') market: string, - @Body() body: { executionTime: string } + @Body() body: { executionTime: string }, ): Promise<{ adjustedTime: Date }> { const executionTime = new Date(body.executionTime); - const adjustedTime = await this.marketHoursService.adjustForMarketHours(market, executionTime); + const adjustedTime = await this.marketHoursService.adjustForMarketHours( + market, + executionTime, + ); return { adjustedTime }; } @Get('market-hours/:market/holidays/:year?') @ApiOperation({ summary: 'Get market holidays for a specific year' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Holidays retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Holidays retrieved successfully', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) @ApiParam({ name: 'year', description: 'Year (optional)', required: false }) - async getHolidays(@Param('market') market: string, @Param('year') year?: string): Promise { + async getHolidays( + @Param('market') market: string, + @Param('year') year?: string, + ): Promise { const yearNum = year ? parseInt(year) : undefined; return this.marketHoursService.getHolidays(market, yearNum); } @Get('market-hours/:market/calendar/:year') @ApiOperation({ summary: 'Get complete trading calendar for a year' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Trading calendar retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Trading calendar retrieved successfully', + }) @ApiParam({ name: 'market', description: 'Market code (US, EU, ASIA)' }) @ApiParam({ name: 'year', description: 'Year' }) - async getTradingCalendar(@Param('market') market: string, @Param('year') year: string): Promise { + async getTradingCalendar( + @Param('market') market: string, + @Param('year') year: string, + ): Promise { const yearNum = parseInt(year); return this.marketHoursService.getTradingCalendar(market, yearNum); } @Get('health') @ApiOperation({ summary: 'Get scheduler health status' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Health status retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Health status retrieved successfully', + }) async getHealth(): Promise<{ status: 'healthy' | 'degraded' | 'unhealthy'; timestamp: Date; @@ -242,13 +368,13 @@ export class SchedulerController { lastExecution: Date | null; }> { const metrics = await this.schedulerService.getSchedulerMetrics(); - + let status: 'healthy' | 'degraded' | 'unhealthy' = 'healthy'; - + if (metrics.failedJobs > metrics.completedJobs * 0.1) { status = 'degraded'; } - + if (metrics.failedJobs > metrics.completedJobs * 0.5) { status = 'unhealthy'; } @@ -265,7 +391,10 @@ export class SchedulerController { @Get('status') @ApiOperation({ summary: 'Get comprehensive scheduler status' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Status retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Status retrieved successfully', + }) async getStatus(): Promise<{ scheduler: { isRunning: boolean; @@ -288,7 +417,7 @@ export class SchedulerController { }> { const metrics = await this.schedulerService.getSchedulerMetrics(); const marketStatuses = await this.marketHoursService.getAllMarketStatuses(); - + const memUsage = process.memoryUsage(); const memoryUsagePercent = (memUsage.heapUsed / memUsage.heapTotal) * 100; @@ -316,8 +445,13 @@ export class SchedulerController { @Post('maintenance/trigger') @ApiOperation({ summary: 'Trigger manual maintenance job' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Maintenance job triggered successfully' }) - async triggerMaintenance(@Body() body: { type: string; parameters?: any }): Promise { + @ApiResponse({ + status: HttpStatus.OK, + description: 'Maintenance job triggered successfully', + }) + async triggerMaintenance( + @Body() body: { type: string; parameters?: any }, + ): Promise { // This would trigger a maintenance job return { success: true, @@ -328,7 +462,10 @@ export class SchedulerController { @Get('maintenance/status') @ApiOperation({ summary: 'Get maintenance status' }) - @ApiResponse({ status: HttpStatus.OK, description: 'Maintenance status retrieved successfully' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Maintenance status retrieved successfully', + }) async getMaintenanceStatus(): Promise { // This would get maintenance status from the maintenance job return { diff --git a/src/scheduler/dto/schedule-trade.dto.ts b/src/scheduler/dto/schedule-trade.dto.ts index ef72782..8a9a5c9 100644 --- a/src/scheduler/dto/schedule-trade.dto.ts +++ b/src/scheduler/dto/schedule-trade.dto.ts @@ -1,7 +1,23 @@ -import { IsString, IsNumber, IsEnum, IsOptional, IsBoolean, IsArray, IsObject, ValidateNested, IsDateString, Min, Max } from 'class-validator'; +import { + IsString, + IsNumber, + IsEnum, + IsOptional, + IsBoolean, + IsArray, + IsObject, + ValidateNested, + IsDateString, + Min, + Max, +} from 'class-validator'; import { Type } from 'class-transformer'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { JobType, JobPriority, RetryStrategy } from '../entities/scheduled-job.entity'; +import { + JobType, + JobPriority, + RetryStrategy, +} from '../entities/scheduled-job.entity'; export class ExecutionContextDto { @ApiPropertyOptional({ example: 'America/New_York' }) @@ -130,7 +146,10 @@ export class SchedulingDto { @IsBoolean() skipIfRunning?: boolean; - @ApiPropertyOptional({ enum: ['allow', 'forbid', 'replace'], example: 'forbid' }) + @ApiPropertyOptional({ + enum: ['allow', 'forbid', 'replace'], + example: 'forbid', + }) @IsOptional() @IsEnum(['allow', 'forbid', 'replace']) concurrency?: 'allow' | 'forbid' | 'replace'; @@ -175,7 +194,10 @@ export class ScheduleTradeDto { customData?: Record; }; - @ApiPropertyOptional({ enum: RetryStrategy, example: RetryStrategy.EXPONENTIAL_BACKOFF }) + @ApiPropertyOptional({ + enum: RetryStrategy, + example: RetryStrategy.EXPONENTIAL_BACKOFF, + }) @IsOptional() @IsEnum(RetryStrategy) retryStrategy?: RetryStrategy; @@ -333,18 +355,25 @@ export class EmergencyStopDto { @IsString() reason: string; - @ApiPropertyOptional({ enum: ['all', 'type', 'priority', 'specific'], example: 'all' }) + @ApiPropertyOptional({ + enum: ['all', 'type', 'priority', 'specific'], + example: 'all', + }) @IsOptional() @IsEnum(['all', 'type', 'priority', 'specific']) scope?: 'all' | 'type' | 'priority' | 'specific'; - @ApiPropertyOptional({ example: [JobType.TRADE_EXECUTION, JobType.SETTLEMENT] }) + @ApiPropertyOptional({ + example: [JobType.TRADE_EXECUTION, JobType.SETTLEMENT], + }) @IsOptional() @IsArray() @IsEnum(JobType, { each: true }) jobTypes?: JobType[]; - @ApiPropertyOptional({ example: [JobPriority.CRITICAL, JobPriority.EMERGENCY] }) + @ApiPropertyOptional({ + example: [JobPriority.CRITICAL, JobPriority.EMERGENCY], + }) @IsOptional() @IsArray() @IsEnum(JobPriority, { each: true }) @@ -373,9 +402,25 @@ export class JobQueryDto { @IsEnum(JobType) type?: JobType; - @ApiPropertyOptional({ enum: ['pending', 'running', 'completed', 'failed', 'cancelled', 'retrying'] }) - @IsOptional() - @IsEnum(['pending', 'running', 'completed', 'failed', 'cancelled', 'retrying']) + @ApiPropertyOptional({ + enum: [ + 'pending', + 'running', + 'completed', + 'failed', + 'cancelled', + 'retrying', + ], + }) + @IsOptional() + @IsEnum([ + 'pending', + 'running', + 'completed', + 'failed', + 'cancelled', + 'retrying', + ]) status?: string; @ApiPropertyOptional({ enum: JobPriority }) @@ -432,7 +477,10 @@ export class JobQueryDto { @Max(100) limit?: number; - @ApiPropertyOptional({ enum: ['createdAt', 'scheduledAt', 'priority', 'status'], example: 'scheduledAt' }) + @ApiPropertyOptional({ + enum: ['createdAt', 'scheduledAt', 'priority', 'status'], + example: 'scheduledAt', + }) @IsOptional() @IsEnum(['createdAt', 'scheduledAt', 'priority', 'status']) sortBy?: string; diff --git a/src/scheduler/entities/scheduled-job.entity.ts b/src/scheduler/entities/scheduled-job.entity.ts index c67fe58..fb74a24 100644 --- a/src/scheduler/entities/scheduled-job.entity.ts +++ b/src/scheduler/entities/scheduled-job.entity.ts @@ -1,4 +1,10 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, +} from 'typeorm'; export enum JobType { TRADE_EXECUTION = 'trade_execution', @@ -128,7 +134,13 @@ export class ScheduledJob { @Column({ name: 'retry_count', default: 0 }) retryCount: number; - @Column({ name: 'retry_delay', type: 'decimal', precision: 5, scale: 2, nullable: true }) + @Column({ + name: 'retry_delay', + type: 'decimal', + precision: 5, + scale: 2, + nullable: true, + }) retryDelay?: number; @Column({ name: 'timeout_seconds', default: 300 }) diff --git a/src/scheduler/jobs/maintenance.job.ts b/src/scheduler/jobs/maintenance.job.ts index 2d1ead7..5afe1fc 100644 --- a/src/scheduler/jobs/maintenance.job.ts +++ b/src/scheduler/jobs/maintenance.job.ts @@ -2,7 +2,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, DataSource, LessThan } from 'typeorm'; -import { ScheduledJob, JobStatus, RetryStrategy } from '../entities/scheduled-job.entity'; +import { + ScheduledJob, + JobStatus, + RetryStrategy, +} from '../entities/scheduled-job.entity'; import { Trade, TradeStatus } from '../../energy/entities/trade.entity'; export interface MaintenanceResult { @@ -94,7 +98,7 @@ export class MaintenanceJob { async executeMaintenanceJob(job: ScheduledJob): Promise { const startTime = Date.now(); - + this.logger.log(`Executing maintenance job: ${job.id} - ${job.name}`); try { @@ -134,8 +138,14 @@ export class MaintenanceJob { operations.push(await this.performRoutineMaintenance(details)); } - const totalProcessed = operations.reduce((sum, op) => sum + op.processed, 0); - const totalErrors = operations.reduce((sum, op) => sum + op.errors.length, 0); + const totalProcessed = operations.reduce( + (sum, op) => sum + op.processed, + 0, + ); + const totalErrors = operations.reduce( + (sum, op) => sum + op.errors.length, + 0, + ); const success = totalErrors === 0; const result = { @@ -149,10 +159,11 @@ export class MaintenanceJob { await this.updateJobCompletion(job, result); - this.logger.log(`Maintenance job ${job.id} completed in ${result.executionTime}ms. Success: ${result.success}, Operations: ${operations.length}`); + this.logger.log( + `Maintenance job ${job.id} completed in ${result.executionTime}ms. Success: ${result.success}, Operations: ${operations.length}`, + ); return result; - } catch (error) { const executionTime = Date.now() - startTime; this.logger.error(`Maintenance job ${job.id} failed`, error); @@ -202,7 +213,6 @@ export class MaintenanceJob { details.dataCleanup.spaceFreed += tempCleanupResult.spaceFreed; this.logger.log(`Data cleanup completed. Deleted ${processed} records`); - } catch (error) { errors.push(`Data cleanup failed: ${error.message}`); this.logger.error('Data cleanup failed', error); @@ -239,8 +249,9 @@ export class MaintenanceJob { const statsResult = await this.updateDatabaseStatistics(); processed += statsResult.updated; - this.logger.log(`System optimization completed. Optimized ${processed} items`); - + this.logger.log( + `System optimization completed. Optimized ${processed} items`, + ); } catch (error) { errors.push(`System optimization failed: ${error.message}`); this.logger.error('System optimization failed', error); @@ -281,8 +292,9 @@ export class MaintenanceJob { } } - this.logger.log(`Health checks completed. Passed: ${details.healthChecks.checksPassed}, Failed: ${details.healthChecks.checksFailed}`); - + this.logger.log( + `Health checks completed. Passed: ${details.healthChecks.checksPassed}, Failed: ${details.healthChecks.checksFailed}`, + ); } catch (error) { errors.push(`Health checks failed: ${error.message}`); this.logger.error('Health checks failed', error); @@ -316,12 +328,15 @@ export class MaintenanceJob { processed++; details.reportGeneration.reportsGenerated++; } else { - errors.push(`Report generation failed: ${report.name} - ${report.error}`); + errors.push( + `Report generation failed: ${report.name} - ${report.error}`, + ); } } - this.logger.log(`Report generation completed. Generated ${processed} reports`); - + this.logger.log( + `Report generation completed. Generated ${processed} reports`, + ); } catch (error) { errors.push(`Report generation failed: ${error.message}`); this.logger.error('Report generation failed', error); @@ -349,8 +364,9 @@ export class MaintenanceJob { await this.clearApplicationCache(); processed = 2; - this.logger.log(`Routine maintenance completed. Processed ${processed} items`); - + this.logger.log( + `Routine maintenance completed. Processed ${processed} items`, + ); } catch (error) { errors.push(`Routine maintenance failed: ${error.message}`); this.logger.error('Routine maintenance failed', error); @@ -365,7 +381,10 @@ export class MaintenanceJob { }; } - private async cleanupOldAuditTrails(): Promise<{ deleted: number; spaceFreed: number }> { + private async cleanupOldAuditTrails(): Promise<{ + deleted: number; + spaceFreed: number; + }> { const cutoffDate = new Date(); cutoffDate.setDate(cutoffDate.getDate() - 90); // Keep 90 days @@ -381,7 +400,10 @@ export class MaintenanceJob { }; } - private async cleanupOldScheduledJobs(): Promise<{ deleted: number; spaceFreed: number }> { + private async cleanupOldScheduledJobs(): Promise<{ + deleted: number; + spaceFreed: number; + }> { const cutoffDate = new Date(); cutoffDate.setDate(cutoffDate.getDate() - 30); // Keep 30 days @@ -389,7 +411,9 @@ export class MaintenanceJob { .createQueryBuilder() .delete() .where('createdAt < :cutoffDate', { cutoffDate }) - .andWhere('status IN (:...statuses)', { statuses: [JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.CANCELLED] }) + .andWhere('status IN (:...statuses)', { + statuses: [JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.CANCELLED], + }) .execute(); return { @@ -398,7 +422,10 @@ export class MaintenanceJob { }; } - private async cleanupTemporaryData(): Promise<{ deleted: number; spaceFreed: number }> { + private async cleanupTemporaryData(): Promise<{ + deleted: number; + spaceFreed: number; + }> { // This would clean up any temporary tables, cache entries, etc. // For now, return placeholder values return { @@ -418,7 +445,10 @@ export class MaintenanceJob { } } - private async clearApplicationCache(): Promise<{ cleared: number; success: boolean }> { + private async clearApplicationCache(): Promise<{ + cleared: number; + success: boolean; + }> { try { // This would clear application caches // For now, return placeholder @@ -440,7 +470,11 @@ export class MaintenanceJob { } } - private async checkDatabaseHealth(): Promise<{ name: string; passed: boolean; error?: string }> { + private async checkDatabaseHealth(): Promise<{ + name: string; + passed: boolean; + error?: string; + }> { try { await this.dataSource.query('SELECT 1'); return { name: 'database', passed: true }; @@ -449,7 +483,11 @@ export class MaintenanceJob { } } - private async checkSchedulerHealth(): Promise<{ name: string; passed: boolean; error?: string }> { + private async checkSchedulerHealth(): Promise<{ + name: string; + passed: boolean; + error?: string; + }> { try { const pendingJobs = await this.scheduledJobRepository.count({ where: { status: JobStatus.PENDING }, @@ -460,7 +498,11 @@ export class MaintenanceJob { } } - private async checkMemoryUsage(): Promise<{ name: string; passed: boolean; error?: string }> { + private async checkMemoryUsage(): Promise<{ + name: string; + passed: boolean; + error?: string; + }> { try { const memUsage = process.memoryUsage(); const totalMemory = memUsage.heapTotal; @@ -468,7 +510,11 @@ export class MaintenanceJob { const memoryUsagePercent = (usedMemory / totalMemory) * 100; if (memoryUsagePercent > 90) { - return { name: 'memory', passed: false, error: `Memory usage at ${memoryUsagePercent.toFixed(2)}%` }; + return { + name: 'memory', + passed: false, + error: `Memory usage at ${memoryUsagePercent.toFixed(2)}%`, + }; } return { name: 'memory', passed: true }; @@ -477,7 +523,11 @@ export class MaintenanceJob { } } - private async checkDiskSpace(): Promise<{ name: string; passed: boolean; error?: string }> { + private async checkDiskSpace(): Promise<{ + name: string; + passed: boolean; + error?: string; + }> { try { // This would check disk space // For now, assume it passes @@ -487,7 +537,11 @@ export class MaintenanceJob { } } - private async checkConnectivity(): Promise<{ name: string; passed: boolean; error?: string }> { + private async checkConnectivity(): Promise<{ + name: string; + passed: boolean; + error?: string; + }> { try { // This would check external connectivity // For now, assume it passes @@ -497,36 +551,60 @@ export class MaintenanceJob { } } - private async generateSchedulerReport(): Promise<{ name: string; success: boolean; error?: string }> { + private async generateSchedulerReport(): Promise<{ + name: string; + success: boolean; + error?: string; + }> { try { const totalJobs = await this.scheduledJobRepository.count(); - const pendingJobs = await this.scheduledJobRepository.count({ where: { status: JobStatus.PENDING } }); - const failedJobs = await this.scheduledJobRepository.count({ where: { status: JobStatus.FAILED } }); + const pendingJobs = await this.scheduledJobRepository.count({ + where: { status: JobStatus.PENDING }, + }); + const failedJobs = await this.scheduledJobRepository.count({ + where: { status: JobStatus.FAILED }, + }); - this.logger.log(`Scheduler Report - Total: ${totalJobs}, Pending: ${pendingJobs}, Failed: ${failedJobs}`); + this.logger.log( + `Scheduler Report - Total: ${totalJobs}, Pending: ${pendingJobs}, Failed: ${failedJobs}`, + ); return { name: 'scheduler_report', success: true }; } catch (error) { return { name: 'scheduler_report', success: false, error: error.message }; } } - private async generateSystemReport(): Promise<{ name: string; success: boolean; error?: string }> { + private async generateSystemReport(): Promise<{ + name: string; + success: boolean; + error?: string; + }> { try { const memUsage = process.memoryUsage(); - this.logger.log(`System Report - Memory: ${Math.round(memUsage.heapUsed / 1024 / 1024)}MB`); + this.logger.log( + `System Report - Memory: ${Math.round(memUsage.heapUsed / 1024 / 1024)}MB`, + ); return { name: 'system_report', success: true }; } catch (error) { return { name: 'system_report', success: false, error: error.message }; } } - private async generatePerformanceReport(): Promise<{ name: string; success: boolean; error?: string }> { + private async generatePerformanceReport(): Promise<{ + name: string; + success: boolean; + error?: string; + }> { try { // This would generate performance metrics this.logger.log('Performance report generated'); return { name: 'performance_report', success: true }; } catch (error) { - return { name: 'performance_report', success: false, error: error.message }; + return { + name: 'performance_report', + success: false, + error: error.message, + }; } } @@ -581,7 +659,10 @@ export class MaintenanceJob { return await this.scheduledJobRepository.save(job); } - private async updateJobStatus(job: ScheduledJob, status: JobStatus): Promise { + private async updateJobStatus( + job: ScheduledJob, + status: JobStatus, + ): Promise { job.status = status; job.updatedAt = new Date(); @@ -592,7 +673,10 @@ export class MaintenanceJob { await this.scheduledJobRepository.save(job); } - private async updateJobCompletion(job: ScheduledJob, result: MaintenanceResult): Promise { + private async updateJobCompletion( + job: ScheduledJob, + result: MaintenanceResult, + ): Promise { job.status = result.success ? JobStatus.COMPLETED : JobStatus.FAILED; job.completedAt = new Date(); job.result = { @@ -603,15 +687,16 @@ export class MaintenanceJob { duration: result.executionTime, }; - if (!job.metrics) job.metrics = { - executionCount: 0, - successCount: 0, - failureCount: 0, - avgExecutionTime: 0, - minExecutionTime: 0, - maxExecutionTime: 0, - totalExecutionTime: 0, - }; + if (!job.metrics) + job.metrics = { + executionCount: 0, + successCount: 0, + failureCount: 0, + avgExecutionTime: 0, + minExecutionTime: 0, + maxExecutionTime: 0, + totalExecutionTime: 0, + }; job.metrics.executionCount++; if (result.success) { @@ -621,12 +706,16 @@ export class MaintenanceJob { } job.metrics.totalExecutionTime += result.executionTime; - job.metrics.avgExecutionTime = job.metrics.totalExecutionTime / job.metrics.executionCount; - - if (job.metrics.minExecutionTime === 0 || result.executionTime < job.metrics.minExecutionTime) { + job.metrics.avgExecutionTime = + job.metrics.totalExecutionTime / job.metrics.executionCount; + + if ( + job.metrics.minExecutionTime === 0 || + result.executionTime < job.metrics.minExecutionTime + ) { job.metrics.minExecutionTime = result.executionTime; } - + if (result.executionTime > job.metrics.maxExecutionTime) { job.metrics.maxExecutionTime = result.executionTime; } @@ -639,7 +728,11 @@ export class MaintenanceJob { await this.scheduledJobRepository.save(job); } - private async handleJobFailure(job: ScheduledJob, error: any, executionTime: number): Promise { + private async handleJobFailure( + job: ScheduledJob, + error: any, + executionTime: number, + ): Promise { job.retryCount++; job.status = JobStatus.FAILED; job.completedAt = new Date(); @@ -675,7 +768,9 @@ export class MaintenanceJob { ]; const errorMessage = error?.message?.toUpperCase() || ''; - return retryableErrors.some(retryableError => errorMessage.includes(retryableError)); + return retryableErrors.some((retryableError) => + errorMessage.includes(retryableError), + ); } private calculateNextRetryTime(job: ScheduledJob): Date { @@ -707,7 +802,7 @@ export class MaintenanceJob { private calculateNextRunTime(job: ScheduledJob): Date { const now = new Date(); - + if (job.cronExpression.includes('0 2 * * *')) { // Daily job - schedule for next day at 2 AM const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000); @@ -716,11 +811,13 @@ export class MaintenanceJob { } else if (job.cronExpression.includes('0 3 * * 0')) { // Weekly job - schedule for next Sunday at 3 AM const daysUntilSunday = (7 - now.getDay()) % 7 || 7; - const nextSunday = new Date(now.getTime() + daysUntilSunday * 24 * 60 * 60 * 1000); + const nextSunday = new Date( + now.getTime() + daysUntilSunday * 24 * 60 * 60 * 1000, + ); nextSunday.setUTCHours(3, 0, 0, 0); return nextSunday; } - + // Default to next day return new Date(now.getTime() + 24 * 60 * 60 * 1000); } @@ -733,10 +830,13 @@ export class MaintenanceJob { }); const totalJobs = recentJobs.length; - const successfulJobs = recentJobs.filter(job => job.status === JobStatus.COMPLETED).length; - const avgExecutionTime = recentJobs.reduce((sum, job) => { - return sum + (job.metrics?.avgExecutionTime || 0); - }, 0) / totalJobs; + const successfulJobs = recentJobs.filter( + (job) => job.status === JobStatus.COMPLETED, + ).length; + const avgExecutionTime = + recentJobs.reduce((sum, job) => { + return sum + (job.metrics?.avgExecutionTime || 0); + }, 0) / totalJobs; return { totalMaintenanceJobs: totalJobs, @@ -749,7 +849,7 @@ export class MaintenanceJob { private async getNextScheduledMaintenance(): Promise { const nextJob = await this.scheduledJobRepository.findOne({ - where: { + where: { type: 'maintenance' as any, status: JobStatus.PENDING, isActive: true, diff --git a/src/scheduler/jobs/settlement.job.ts b/src/scheduler/jobs/settlement.job.ts index 0e4e269..2c0aedd 100644 --- a/src/scheduler/jobs/settlement.job.ts +++ b/src/scheduler/jobs/settlement.job.ts @@ -2,8 +2,17 @@ import { Injectable, Logger } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, DataSource, LessThan } from 'typeorm'; -import { ScheduledJob, JobStatus, RetryStrategy } from '../entities/scheduled-job.entity'; -import { Trade, TradeStatus, PaymentStatus, DeliveryStatus } from '../../energy/entities/trade.entity'; +import { + ScheduledJob, + JobStatus, + RetryStrategy, +} from '../entities/scheduled-job.entity'; +import { + Trade, + TradeStatus, + PaymentStatus, + DeliveryStatus, +} from '../../energy/entities/trade.entity'; export interface SettlementResult { success: boolean; @@ -70,7 +79,7 @@ export class SettlementJob { async executeSettlementJob(job: ScheduledJob): Promise { const startTime = Date.now(); - + this.logger.log(`Executing settlement job: ${job.id} - ${job.name}`); try { @@ -91,10 +100,11 @@ export class SettlementJob { await this.updateJobCompletion(job, result); const executionTime = Date.now() - startTime; - this.logger.log(`Settlement job ${job.id} completed in ${executionTime}ms. Settled: ${result.settledTrades.length}, Amount: ${result.totalAmount}`); + this.logger.log( + `Settlement job ${job.id} completed in ${executionTime}ms. Settled: ${result.settledTrades.length}, Amount: ${result.totalAmount}`, + ); return result; - } catch (error) { const executionTime = Date.now() - startTime; this.logger.error(`Settlement job ${job.id} failed`, error); @@ -110,7 +120,9 @@ export class SettlementJob { } } - private async processSettlement(job: ScheduledJob): Promise { + private async processSettlement( + job: ScheduledJob, + ): Promise { const parameters = job.parameters || {}; const settlementId = parameters.settlementId; @@ -121,7 +133,10 @@ export class SettlementJob { } } - private async processSingleSettlement(settlementId: string, job: ScheduledJob): Promise { + private async processSingleSettlement( + settlementId: string, + job: ScheduledJob, + ): Promise { const startTime = Date.now(); try { @@ -135,7 +150,9 @@ export class SettlementJob { } if (!this.isTradeSettleable(trade)) { - throw new Error(`Trade ${settlementId} is not ready for settlement: ${trade.status}/${trade.deliveryStatus}`); + throw new Error( + `Trade ${settlementId} is not ready for settlement: ${trade.status}/${trade.deliveryStatus}`, + ); } const result = await this.performSettlement(trade, job); @@ -149,16 +166,17 @@ export class SettlementJob { executionTime: Date.now() - startTime, details: result, }; - } catch (error) { return { success: false, settledTrades: [], - failedSettlements: [{ - tradeId: settlementId, - error: error.message, - retryable: this.isRetryableError(error), - }], + failedSettlements: [ + { + tradeId: settlementId, + error: error.message, + retryable: this.isRetryableError(error), + }, + ], totalAmount: 0, processedCount: 0, executionTime: Date.now() - startTime, @@ -172,11 +190,18 @@ export class SettlementJob { } } - private async processBatchSettlements(job: ScheduledJob): Promise { + private async processBatchSettlements( + job: ScheduledJob, + ): Promise { const startTime = Date.now(); const batchSize = job.parameters?.batchSize || 20; const settledTrades: string[] = []; - const failedSettlements: Array<{ tradeId: string; error: string; retryable: boolean; amount?: number }> = []; + const failedSettlements: Array<{ + tradeId: string; + error: string; + retryable: boolean; + amount?: number; + }> = []; let totalAmount = 0; const details = { @@ -189,7 +214,9 @@ export class SettlementJob { try { const eligibleTrades = await this.getSettleableTrades(batchSize); - this.logger.log(`Processing batch settlement of ${eligibleTrades.length} trades`); + this.logger.log( + `Processing batch settlement of ${eligibleTrades.length} trades`, + ); for (const trade of eligibleTrades) { try { @@ -201,7 +228,7 @@ export class SettlementJob { details.deliveriesConfirmed += result.deliveriesConfirmed || 0; details.commissionsCollected += result.commissionsCollected || 0; details.refundsProcessed += result.refundsProcessed || 0; - + this.logger.debug(`Successfully settled trade ${trade.id}`); } catch (error) { failedSettlements.push({ @@ -210,7 +237,7 @@ export class SettlementJob { retryable: this.isRetryableError(error), amount: trade.finalAmount, }); - + this.logger.error(`Failed to settle trade ${trade.id}`, error); } } @@ -227,7 +254,6 @@ export class SettlementJob { executionTime: Date.now() - startTime, details, }; - } catch (error) { return { success: false, @@ -263,14 +289,20 @@ export class SettlementJob { private isTradeSettleable(trade: Trade): boolean { return ( - (trade.status === TradeStatus.IN_PROGRESS || trade.status === TradeStatus.CONFIRMED) && - (trade.deliveryStatus === DeliveryStatus.DELIVERED || trade.deliveryStatus === DeliveryStatus.CONFIRMED) && - (trade.paymentStatus === PaymentStatus.PENDING || trade.paymentStatus === PaymentStatus.PROCESSING) + (trade.status === TradeStatus.IN_PROGRESS || + trade.status === TradeStatus.CONFIRMED) && + (trade.deliveryStatus === DeliveryStatus.DELIVERED || + trade.deliveryStatus === DeliveryStatus.CONFIRMED) && + (trade.paymentStatus === PaymentStatus.PENDING || + trade.paymentStatus === PaymentStatus.PROCESSING) ); } - private async performSettlement(trade: Trade, job: ScheduledJob): Promise { - return await this.dataSource.transaction(async manager => { + private async performSettlement( + trade: Trade, + job: ScheduledJob, + ): Promise { + return await this.dataSource.transaction(async (manager) => { const settlementDetails = { settledAt: new Date(), settledBy: job.id, @@ -291,7 +323,10 @@ export class SettlementJob { await this.confirmDelivery(trade, manager); } - const commission = await this.calculateAndCollectCommission(trade, manager); + const commission = await this.calculateAndCollectCommission( + trade, + manager, + ); commissionsCollected = commission > 0 ? 1 : 0; if (this.shouldProcessRefund(trade)) { @@ -303,7 +338,7 @@ export class SettlementJob { trade.paymentStatus = PaymentStatus.COMPLETED; trade.completedAt = new Date(); trade.paymentCompletedAt = new Date(); - + if (!trade.auditTrail) trade.auditTrail = []; trade.auditTrail.push({ timestamp: new Date(), @@ -315,7 +350,11 @@ export class SettlementJob { await manager.save(trade); - await this.triggerSettlementNotifications(trade, 'settlement_completed', manager); + await this.triggerSettlementNotifications( + trade, + 'settlement_completed', + manager, + ); const result = { tradeId: trade.id, @@ -358,12 +397,17 @@ export class SettlementJob { await manager.save(trade); } - private async calculateAndCollectCommission(trade: Trade, manager: any): Promise { + private async calculateAndCollectCommission( + trade: Trade, + manager: any, + ): Promise { const commissionRate = 0.02; // 2% commission const commission = (trade.finalAmount || 0) * commissionRate; if (commission > 0) { - this.logger.log(`Collecting commission of ${commission} for trade ${trade.id}`); + this.logger.log( + `Collecting commission of ${commission} for trade ${trade.id}`, + ); if (!trade.paymentDetails) trade.paymentDetails = {}; trade.paymentDetails.commission = commission; @@ -378,9 +422,7 @@ export class SettlementJob { private shouldProcessRefund(trade: Trade): boolean { return ( - trade.isDisputed || - trade.refundAmount > 0 || - trade.penaltyAmount > 0 + trade.isDisputed || trade.refundAmount > 0 || trade.penaltyAmount > 0 ); } @@ -392,22 +434,29 @@ export class SettlementJob { if (refundAmount > 0) { trade.paymentStatus = PaymentStatus.REFUNDED; trade.refundedAt = new Date(); - + if (!trade.paymentDetails) trade.paymentDetails = {}; trade.paymentDetails.refundAmount = refundAmount; - trade.paymentDetails.refundReason = trade.disputeReason || 'Settlement refund'; + trade.paymentDetails.refundReason = + trade.disputeReason || 'Settlement refund'; trade.paymentDetails.refundTransactionId = `refund_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; await manager.save(trade); } } - private async triggerSettlementNotifications(trade: Trade, event: string, manager: any): Promise { + private async triggerSettlementNotifications( + trade: Trade, + event: string, + manager: any, + ): Promise { this.logger.log(`Triggering ${event} notifications for trade ${trade.id}`); - } - private async updateJobStatus(job: ScheduledJob, status: JobStatus): Promise { + private async updateJobStatus( + job: ScheduledJob, + status: JobStatus, + ): Promise { job.status = status; job.updatedAt = new Date(); @@ -418,7 +467,10 @@ export class SettlementJob { await this.scheduledJobRepository.save(job); } - private async updateJobCompletion(job: ScheduledJob, result: SettlementResult): Promise { + private async updateJobCompletion( + job: ScheduledJob, + result: SettlementResult, + ): Promise { job.status = result.success ? JobStatus.COMPLETED : JobStatus.FAILED; job.completedAt = new Date(); job.result = { @@ -429,15 +481,16 @@ export class SettlementJob { duration: result.executionTime, }; - if (!job.metrics) job.metrics = { - executionCount: 0, - successCount: 0, - failureCount: 0, - avgExecutionTime: 0, - minExecutionTime: 0, - maxExecutionTime: 0, - totalExecutionTime: 0, - }; + if (!job.metrics) + job.metrics = { + executionCount: 0, + successCount: 0, + failureCount: 0, + avgExecutionTime: 0, + minExecutionTime: 0, + maxExecutionTime: 0, + totalExecutionTime: 0, + }; job.metrics.executionCount++; if (result.success) { @@ -447,12 +500,16 @@ export class SettlementJob { } job.metrics.totalExecutionTime += result.executionTime; - job.metrics.avgExecutionTime = job.metrics.totalExecutionTime / job.metrics.executionCount; - - if (job.metrics.minExecutionTime === 0 || result.executionTime < job.metrics.minExecutionTime) { + job.metrics.avgExecutionTime = + job.metrics.totalExecutionTime / job.metrics.executionCount; + + if ( + job.metrics.minExecutionTime === 0 || + result.executionTime < job.metrics.minExecutionTime + ) { job.metrics.minExecutionTime = result.executionTime; } - + if (result.executionTime > job.metrics.maxExecutionTime) { job.metrics.maxExecutionTime = result.executionTime; } @@ -465,7 +522,11 @@ export class SettlementJob { await this.scheduledJobRepository.save(job); } - private async handleJobFailure(job: ScheduledJob, error: any, executionTime: number): Promise { + private async handleJobFailure( + job: ScheduledJob, + error: any, + executionTime: number, + ): Promise { job.retryCount++; job.status = JobStatus.FAILED; job.completedAt = new Date(); @@ -502,7 +563,9 @@ export class SettlementJob { ]; const errorMessage = error?.message?.toUpperCase() || ''; - return retryableErrors.some(retryableError => errorMessage.includes(retryableError)); + return retryableErrors.some((retryableError) => + errorMessage.includes(retryableError), + ); } private calculateNextRetryTime(job: ScheduledJob): Date { @@ -535,7 +598,7 @@ export class SettlementJob { private calculateNextRunTime(job: ScheduledJob): Date { const now = new Date(); const nextRun = new Date(now.getTime() + 24 * 60 * 60 * 1000); // Next day by default - + if (job.scheduling?.endDate && nextRun > job.scheduling.endDate) { job.scheduling.isActive = false; } @@ -545,28 +608,31 @@ export class SettlementJob { private isWithinMarketHours(timeZone: string = 'UTC'): boolean { const now = new Date(); - + try { const options: Intl.DateTimeFormatOptions = { timeZone, hour: '2-digit', hour12: false, }; - + const timeString = now.toLocaleTimeString('en-US', options); const currentHour = parseInt(timeString); - + const dayOptions: Intl.DateTimeFormatOptions = { timeZone, weekday: 'long', }; - + const dayString = now.toLocaleDateString('en-US', dayOptions); const isWeekday = !['Saturday', 'Sunday'].includes(dayString); - + return isWeekday && currentHour >= 9 && currentHour < 17; } catch (error) { - this.logger.warn(`Error checking market hours for timezone ${timeZone}`, error); + this.logger.warn( + `Error checking market hours for timezone ${timeZone}`, + error, + ); return true; // Default to allowing execution } } @@ -575,34 +641,41 @@ export class SettlementJob { const nextMarketOpen = this.getNextMarketOpen(job.timeZone); job.scheduledAt = nextMarketOpen; job.status = JobStatus.PENDING; - + await this.scheduledJobRepository.save(job); - - this.logger.log(`Settlement job ${job.id} rescheduled for market open at ${nextMarketOpen.toISOString()}`); + + this.logger.log( + `Settlement job ${job.id} rescheduled for market open at ${nextMarketOpen.toISOString()}`, + ); } private getNextMarketOpen(timeZone: string = 'UTC'): Date { const now = new Date(); const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000); - + try { const marketOpen = new Date(tomorrow); marketOpen.setUTCHours(14, 0, 0, 0); // 9:00 AM EST (2:00 PM UTC) - + const options: Intl.DateTimeFormatOptions = { timeZone, weekday: 'long', }; - + const dayString = marketOpen.toLocaleDateString('en-US', options); - + if (['Saturday', 'Sunday'].includes(dayString)) { - marketOpen.setDate(marketOpen.getDate() + (dayString === 'Saturday' ? 2 : 1)); + marketOpen.setDate( + marketOpen.getDate() + (dayString === 'Saturday' ? 2 : 1), + ); } - + return marketOpen; } catch (error) { - this.logger.warn(`Error calculating next market open for timezone ${timeZone}`, error); + this.logger.warn( + `Error calculating next market open for timezone ${timeZone}`, + error, + ); return new Date(Date.now() + 60 * 60 * 1000); // 1 hour from now as fallback } } @@ -610,7 +683,12 @@ export class SettlementJob { private createResult( success: boolean, settledTrades: string[], - failedSettlements: Array<{ tradeId: string; error: string; retryable: boolean; amount?: number }>, + failedSettlements: Array<{ + tradeId: string; + error: string; + retryable: boolean; + amount?: number; + }>, totalAmount: number, executionTime: number, details: any, @@ -646,13 +724,19 @@ export class SettlementJob { }); const totalSettled = recentTrades.length; - const totalAmount = recentTrades.reduce((sum, trade) => sum + (trade.finalAmount || 0), 0); - const avgSettlementTime = recentTrades.reduce((sum, trade) => { - if (trade.completedAt && trade.createdAt) { - return sum + (trade.completedAt.getTime() - trade.createdAt.getTime()); - } - return sum; - }, 0) / totalSettled; + const totalAmount = recentTrades.reduce( + (sum, trade) => sum + (trade.finalAmount || 0), + 0, + ); + const avgSettlementTime = + recentTrades.reduce((sum, trade) => { + if (trade.completedAt && trade.createdAt) { + return ( + sum + (trade.completedAt.getTime() - trade.createdAt.getTime()) + ); + } + return sum; + }, 0) / totalSettled; return { jobId: job.id, diff --git a/src/scheduler/jobs/trade-execution.job.ts b/src/scheduler/jobs/trade-execution.job.ts index 37e51f2..dc294e6 100644 --- a/src/scheduler/jobs/trade-execution.job.ts +++ b/src/scheduler/jobs/trade-execution.job.ts @@ -2,8 +2,17 @@ import { Injectable, Logger } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, DataSource } from 'typeorm'; -import { ScheduledJob, JobStatus, RetryStrategy } from '../entities/scheduled-job.entity'; -import { Trade, TradeStatus, PaymentStatus, DeliveryStatus } from '../../energy/entities/trade.entity'; +import { + ScheduledJob, + JobStatus, + RetryStrategy, +} from '../entities/scheduled-job.entity'; +import { + Trade, + TradeStatus, + PaymentStatus, + DeliveryStatus, +} from '../../energy/entities/trade.entity'; export interface TradeExecutionResult { success: boolean; @@ -51,7 +60,9 @@ export class TradeExecutionJob { return; } - this.logger.log(`Found ${pendingJobs.length} pending trade execution jobs`); + this.logger.log( + `Found ${pendingJobs.length} pending trade execution jobs`, + ); for (const job of pendingJobs) { await this.executeTradeJob(job); @@ -63,7 +74,7 @@ export class TradeExecutionJob { async executeTradeJob(job: ScheduledJob): Promise { const startTime = Date.now(); - + this.logger.log(`Executing trade job: ${job.id} - ${job.name}`); try { @@ -71,7 +82,9 @@ export class TradeExecutionJob { if (job.marketHoursOnly && !this.isWithinMarketHours(job.timeZone)) { await this.rescheduleForMarketHours(job); - return this.createResult(false, [], [], 0, Date.now() - startTime, { reason: 'Outside market hours' }); + return this.createResult(false, [], [], 0, Date.now() - startTime, { + reason: 'Outside market hours', + }); } const result = await this.processTradeExecution(job); @@ -79,21 +92,26 @@ export class TradeExecutionJob { await this.updateJobCompletion(job, result); const executionTime = Date.now() - startTime; - this.logger.log(`Trade job ${job.id} completed in ${executionTime}ms. Processed: ${result.totalProcessed}, Success: ${result.success}`); + this.logger.log( + `Trade job ${job.id} completed in ${executionTime}ms. Processed: ${result.totalProcessed}, Success: ${result.success}`, + ); return result; - } catch (error) { const executionTime = Date.now() - startTime; this.logger.error(`Trade job ${job.id} failed`, error); await this.handleJobFailure(job, error, executionTime); - return this.createResult(false, [], [], 0, executionTime, { error: error.message }); + return this.createResult(false, [], [], 0, executionTime, { + error: error.message, + }); } } - private async processTradeExecution(job: ScheduledJob): Promise { + private async processTradeExecution( + job: ScheduledJob, + ): Promise { const parameters = job.parameters || {}; const tradeId = parameters.tradeId; @@ -104,7 +122,10 @@ export class TradeExecutionJob { } } - private async executeSingleTrade(tradeId: string, job: ScheduledJob): Promise { + private async executeSingleTrade( + tradeId: string, + job: ScheduledJob, + ): Promise { const startTime = Date.now(); try { @@ -117,8 +138,13 @@ export class TradeExecutionJob { throw new Error(`Trade ${tradeId} not found`); } - if (trade.status !== TradeStatus.PENDING && trade.status !== TradeStatus.CONFIRMED) { - throw new Error(`Trade ${tradeId} is not in executable status: ${trade.status}`); + if ( + trade.status !== TradeStatus.PENDING && + trade.status !== TradeStatus.CONFIRMED + ) { + throw new Error( + `Trade ${tradeId} is not in executable status: ${trade.status}`, + ); } const result = await this.performTradeExecution(trade, job); @@ -131,16 +157,17 @@ export class TradeExecutionJob { executionTime: Date.now() - startTime, details: result, }; - } catch (error) { return { success: false, processedTrades: [], - failedTrades: [{ - tradeId, - error: error.message, - retryable: this.isRetryableError(error), - }], + failedTrades: [ + { + tradeId, + error: error.message, + retryable: this.isRetryableError(error), + }, + ], totalProcessed: 0, executionTime: Date.now() - startTime, details: { error: error.message }, @@ -148,11 +175,17 @@ export class TradeExecutionJob { } } - private async executeBatchTrades(job: ScheduledJob): Promise { + private async executeBatchTrades( + job: ScheduledJob, + ): Promise { const startTime = Date.now(); const batchSize = job.parameters?.batchSize || 10; const processedTrades: string[] = []; - const failedTrades: Array<{ tradeId: string; error: string; retryable: boolean }> = []; + const failedTrades: Array<{ + tradeId: string; + error: string; + retryable: boolean; + }> = []; try { const pendingTrades = await this.tradeRepository.find({ @@ -171,7 +204,7 @@ export class TradeExecutionJob { try { const result = await this.performTradeExecution(trade, job); processedTrades.push(trade.id); - + this.logger.debug(`Successfully executed trade ${trade.id}`); } catch (error) { failedTrades.push({ @@ -179,7 +212,7 @@ export class TradeExecutionJob { error: error.message, retryable: this.isRetryableError(error), }); - + this.logger.error(`Failed to execute trade ${trade.id}`, error); } } @@ -198,7 +231,6 @@ export class TradeExecutionJob { successRate: processedTrades.length / totalProcessed, }, }; - } catch (error) { return { success: false, @@ -211,8 +243,11 @@ export class TradeExecutionJob { } } - private async performTradeExecution(trade: Trade, job: ScheduledJob): Promise { - return await this.dataSource.transaction(async manager => { + private async performTradeExecution( + trade: Trade, + job: ScheduledJob, + ): Promise { + return await this.dataSource.transaction(async (manager) => { const executionDetails = { executedAt: new Date(), executedBy: job.id, @@ -221,7 +256,7 @@ export class TradeExecutionJob { trade.status = TradeStatus.IN_PROGRESS; trade.deliveryStatus = DeliveryStatus.SCHEDULED; - + if (!trade.auditTrail) trade.auditTrail = []; trade.auditTrail.push({ timestamp: new Date(), @@ -249,7 +284,10 @@ export class TradeExecutionJob { }); } - private async initializeDeliveryProcess(trade: Trade, manager: any): Promise { + private async initializeDeliveryProcess( + trade: Trade, + manager: any, + ): Promise { if (trade.deliveryDetails?.deliveryDate) { const deliveryDate = new Date(trade.deliveryDetails.deliveryDate); const now = new Date(); @@ -265,12 +303,18 @@ export class TradeExecutionJob { } } - private async triggerNotifications(trade: Trade, event: string, manager: any): Promise { + private async triggerNotifications( + trade: Trade, + event: string, + manager: any, + ): Promise { this.logger.log(`Triggering ${event} notifications for trade ${trade.id}`); - } - private async updateJobStatus(job: ScheduledJob, status: JobStatus): Promise { + private async updateJobStatus( + job: ScheduledJob, + status: JobStatus, + ): Promise { job.status = status; job.updatedAt = new Date(); @@ -281,7 +325,10 @@ export class TradeExecutionJob { await this.scheduledJobRepository.save(job); } - private async updateJobCompletion(job: ScheduledJob, result: TradeExecutionResult): Promise { + private async updateJobCompletion( + job: ScheduledJob, + result: TradeExecutionResult, + ): Promise { job.status = result.success ? JobStatus.COMPLETED : JobStatus.FAILED; job.completedAt = new Date(); job.result = { @@ -292,15 +339,16 @@ export class TradeExecutionJob { duration: result.executionTime, }; - if (!job.metrics) job.metrics = { - executionCount: 0, - successCount: 0, - failureCount: 0, - avgExecutionTime: 0, - minExecutionTime: 0, - maxExecutionTime: 0, - totalExecutionTime: 0, - }; + if (!job.metrics) + job.metrics = { + executionCount: 0, + successCount: 0, + failureCount: 0, + avgExecutionTime: 0, + minExecutionTime: 0, + maxExecutionTime: 0, + totalExecutionTime: 0, + }; job.metrics.executionCount++; if (result.success) { @@ -310,12 +358,16 @@ export class TradeExecutionJob { } job.metrics.totalExecutionTime += result.executionTime; - job.metrics.avgExecutionTime = job.metrics.totalExecutionTime / job.metrics.executionCount; - - if (job.metrics.minExecutionTime === 0 || result.executionTime < job.metrics.minExecutionTime) { + job.metrics.avgExecutionTime = + job.metrics.totalExecutionTime / job.metrics.executionCount; + + if ( + job.metrics.minExecutionTime === 0 || + result.executionTime < job.metrics.minExecutionTime + ) { job.metrics.minExecutionTime = result.executionTime; } - + if (result.executionTime > job.metrics.maxExecutionTime) { job.metrics.maxExecutionTime = result.executionTime; } @@ -328,7 +380,11 @@ export class TradeExecutionJob { await this.scheduledJobRepository.save(job); } - private async handleJobFailure(job: ScheduledJob, error: any, executionTime: number): Promise { + private async handleJobFailure( + job: ScheduledJob, + error: any, + executionTime: number, + ): Promise { job.retryCount++; job.status = JobStatus.FAILED; job.completedAt = new Date(); @@ -364,7 +420,9 @@ export class TradeExecutionJob { ]; const errorMessage = error?.message?.toUpperCase() || ''; - return retryableErrors.some(retryableError => errorMessage.includes(retryableError)); + return retryableErrors.some((retryableError) => + errorMessage.includes(retryableError), + ); } private calculateNextRetryTime(job: ScheduledJob): Date { @@ -397,7 +455,7 @@ export class TradeExecutionJob { private calculateNextRunTime(job: ScheduledJob): Date { const now = new Date(); const nextRun = new Date(now.getTime() + 24 * 60 * 60 * 1000); // Next day by default - + if (job.scheduling?.endDate && nextRun > job.scheduling.endDate) { job.scheduling.isActive = false; } @@ -407,28 +465,31 @@ export class TradeExecutionJob { private isWithinMarketHours(timeZone: string = 'UTC'): boolean { const now = new Date(); - + try { const options: Intl.DateTimeFormatOptions = { timeZone, hour: '2-digit', hour12: false, }; - + const timeString = now.toLocaleTimeString('en-US', options); const currentHour = parseInt(timeString); - + const dayOptions: Intl.DateTimeFormatOptions = { timeZone, weekday: 'long', }; - + const dayString = now.toLocaleDateString('en-US', dayOptions); const isWeekday = !['Saturday', 'Sunday'].includes(dayString); - + return isWeekday && currentHour >= 9 && currentHour < 17; } catch (error) { - this.logger.warn(`Error checking market hours for timezone ${timeZone}`, error); + this.logger.warn( + `Error checking market hours for timezone ${timeZone}`, + error, + ); return true; // Default to allowing execution } } @@ -437,34 +498,41 @@ export class TradeExecutionJob { const nextMarketOpen = this.getNextMarketOpen(job.timeZone); job.scheduledAt = nextMarketOpen; job.status = JobStatus.PENDING; - + await this.scheduledJobRepository.save(job); - - this.logger.log(`Job ${job.id} rescheduled for market open at ${nextMarketOpen.toISOString()}`); + + this.logger.log( + `Job ${job.id} rescheduled for market open at ${nextMarketOpen.toISOString()}`, + ); } private getNextMarketOpen(timeZone: string = 'UTC'): Date { const now = new Date(); const tomorrow = new Date(now.getTime() + 24 * 60 * 60 * 1000); - + try { const marketOpen = new Date(tomorrow); marketOpen.setUTCHours(14, 0, 0, 0); // 9:00 AM EST (2:00 PM UTC) - + const options: Intl.DateTimeFormatOptions = { timeZone, weekday: 'long', }; - + const dayString = marketOpen.toLocaleDateString('en-US', options); - + if (['Saturday', 'Sunday'].includes(dayString)) { - marketOpen.setDate(marketOpen.getDate() + (dayString === 'Saturday' ? 2 : 1)); + marketOpen.setDate( + marketOpen.getDate() + (dayString === 'Saturday' ? 2 : 1), + ); } - + return marketOpen; } catch (error) { - this.logger.warn(`Error calculating next market open for timezone ${timeZone}`, error); + this.logger.warn( + `Error calculating next market open for timezone ${timeZone}`, + error, + ); return new Date(Date.now() + 60 * 60 * 1000); // 1 hour from now as fallback } } diff --git a/src/scheduler/scheduler.module.ts b/src/scheduler/scheduler.module.ts index 0ee262b..cbce00e 100644 --- a/src/scheduler/scheduler.module.ts +++ b/src/scheduler/scheduler.module.ts @@ -24,4 +24,4 @@ import { SchedulerController } from './controllers/scheduler.controller'; ], exports: [SchedulerService, MarketHoursService], }) -export class SchedulerModule { } +export class SchedulerModule {} diff --git a/src/scheduler/scheduler.service.ts b/src/scheduler/scheduler.service.ts index 3f3b34c..aebf2bd 100644 --- a/src/scheduler/scheduler.service.ts +++ b/src/scheduler/scheduler.service.ts @@ -2,8 +2,20 @@ import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, DataSource, LessThan, MoreThan } from 'typeorm'; import { Cron, CronExpression, SchedulerRegistry } from '@nestjs/schedule'; -import { ScheduledJob, JobStatus, JobType, JobPriority, RetryStrategy } from './entities/scheduled-job.entity'; -import { ScheduleTradeDto, UpdateScheduleDto, BulkScheduleDto, EmergencyStopDto, JobQueryDto } from './dto/schedule-trade.dto'; +import { + ScheduledJob, + JobStatus, + JobType, + JobPriority, + RetryStrategy, +} from './entities/scheduled-job.entity'; +import { + ScheduleTradeDto, + UpdateScheduleDto, + BulkScheduleDto, + EmergencyStopDto, + JobQueryDto, +} from './dto/schedule-trade.dto'; import { TradeExecutionJob } from './jobs/trade-execution.job'; import { SettlementJob } from './jobs/settlement.job'; import { MaintenanceJob } from './jobs/maintenance.job'; @@ -50,18 +62,21 @@ export class SchedulerService implements OnModuleInit { async onModuleInit() { this.logger.log('Initializing scheduler service...'); - + this.jobExecutors.set(JobType.TRADE_EXECUTION, this.tradeExecutionJob); this.jobExecutors.set(JobType.SETTLEMENT, this.settlementJob); this.jobExecutors.set(JobType.MAINTENANCE, this.maintenanceJob); await this.initializeSystemJobs(); await this.recoverPendingJobs(); - + this.logger.log('Scheduler service initialized successfully'); } - async scheduleTrade(scheduleTradeDto: ScheduleTradeDto, userId?: string): Promise { + async scheduleTrade( + scheduleTradeDto: ScheduleTradeDto, + userId?: string, + ): Promise { this.logger.log(`Scheduling trade execution: ${scheduleTradeDto.name}`); const job = this.scheduledJobRepository.create({ @@ -92,14 +107,18 @@ export class SchedulerService implements OnModuleInit { } const savedJob = await this.scheduledJobRepository.save(job); - + this.logger.log(`Trade execution scheduled: ${savedJob.id}`); return savedJob; } - async updateSchedule(jobId: string, updateScheduleDto: UpdateScheduleDto, userId?: string): Promise { + async updateSchedule( + jobId: string, + updateScheduleDto: UpdateScheduleDto, + userId?: string, + ): Promise { const job = await this.getJobById(jobId); - + if (job.status === JobStatus.RUNNING) { throw new Error('Cannot update a job that is currently running'); } @@ -116,22 +135,25 @@ export class SchedulerService implements OnModuleInit { } const updatedJob = await this.scheduledJobRepository.save(job); - + this.logger.log(`Schedule updated: ${jobId}`); return updatedJob; } - async bulkSchedule(bulkScheduleDto: BulkScheduleDto, userId?: string): Promise { + async bulkSchedule( + bulkScheduleDto: BulkScheduleDto, + userId?: string, + ): Promise { this.logger.log(`Bulk scheduling ${bulkScheduleDto.jobs.length} jobs`); const jobs: ScheduledJob[] = []; for (let i = 0; i < bulkScheduleDto.jobs.length; i++) { const jobDto = bulkScheduleDto.jobs[i]; - + if (bulkScheduleDto.executeSequentially && i > 0) { const delay = bulkScheduleDto.delayBetweenJobs || 30; - const scheduledAt = new Date(Date.now() + (i * delay * 1000)); + const scheduledAt = new Date(Date.now() + i * delay * 1000); jobDto.scheduledAt = scheduledAt.toISOString(); } @@ -174,7 +196,7 @@ export class SchedulerService implements OnModuleInit { try { const executionResult = await executor.executeTradeJob(job); - + result = { success: executionResult.success, jobId, @@ -184,7 +206,6 @@ export class SchedulerService implements OnModuleInit { }; this.logger.log(`Job ${jobId} execution completed successfully`); - } catch (error) { result = { success: false, @@ -199,7 +220,11 @@ export class SchedulerService implements OnModuleInit { return result; } - async cancelJob(jobId: string, userId?: string, reason?: string): Promise { + async cancelJob( + jobId: string, + userId?: string, + reason?: string, + ): Promise { const job = await this.getJobById(jobId); if (job.status === JobStatus.RUNNING) { @@ -222,31 +247,45 @@ export class SchedulerService implements OnModuleInit { }); const cancelledJob = await this.scheduledJobRepository.save(job); - + this.logger.log(`Job cancelled: ${jobId}${reason ? ` - ${reason}` : ''}`); return cancelledJob; } - async emergencyStop(emergencyStopDto: EmergencyStopDto, userId?: string): Promise<{ stoppedJobs: number; affectedJobs: string[] }> { + async emergencyStop( + emergencyStopDto: EmergencyStopDto, + userId?: string, + ): Promise<{ stoppedJobs: number; affectedJobs: string[] }> { this.logger.warn(`Emergency stop initiated: ${emergencyStopDto.reason}`); this.isEmergencyMode = true; this.emergencyReason = emergencyStopDto.reason; - let queryBuilder = this.scheduledJobRepository.createQueryBuilder('job') - .where('job.status IN (:...statuses)', { statuses: [JobStatus.PENDING, JobStatus.RETRYING] }) - .andWhere('job.isEmergencyStop = :isEmergencyStop', { isEmergencyStop: false }); + const queryBuilder = this.scheduledJobRepository + .createQueryBuilder('job') + .where('job.status IN (:...statuses)', { + statuses: [JobStatus.PENDING, JobStatus.RETRYING], + }) + .andWhere('job.isEmergencyStop = :isEmergencyStop', { + isEmergencyStop: false, + }); if (emergencyStopDto.scope === 'type' && emergencyStopDto.jobTypes) { - queryBuilder.andWhere('job.type IN (:...jobTypes)', { jobTypes: emergencyStopDto.jobTypes }); + queryBuilder.andWhere('job.type IN (:...jobTypes)', { + jobTypes: emergencyStopDto.jobTypes, + }); } if (emergencyStopDto.scope === 'priority' && emergencyStopDto.priorities) { - queryBuilder.andWhere('job.priority IN (:...priorities)', { priorities: emergencyStopDto.priorities }); + queryBuilder.andWhere('job.priority IN (:...priorities)', { + priorities: emergencyStopDto.priorities, + }); } if (emergencyStopDto.scope === 'specific' && emergencyStopDto.jobIds) { - queryBuilder.andWhere('job.id IN (:...jobIds)', { jobIds: emergencyStopDto.jobIds }); + queryBuilder.andWhere('job.id IN (:...jobIds)', { + jobIds: emergencyStopDto.jobIds, + }); } const jobsToStop = await queryBuilder.getMany(); @@ -272,7 +311,9 @@ export class SchedulerService implements OnModuleInit { affectedJobs.push(updatedJob.id); } - this.logger.warn(`Emergency stop completed: ${stoppedJobs.length} jobs stopped`); + this.logger.warn( + `Emergency stop completed: ${stoppedJobs.length} jobs stopped`, + ); return { stoppedJobs: stoppedJobs.length, @@ -280,7 +321,9 @@ export class SchedulerService implements OnModuleInit { }; } - async resumeEmergencyStops(userId?: string): Promise<{ resumedJobs: number; affectedJobs: string[] }> { + async resumeEmergencyStops( + userId?: string, + ): Promise<{ resumedJobs: number; affectedJobs: string[] }> { if (!this.isEmergencyMode) { throw new Error('No emergency mode is currently active'); } @@ -322,7 +365,9 @@ export class SchedulerService implements OnModuleInit { this.isEmergencyMode = false; this.emergencyReason = ''; - this.logger.log(`Emergency stop resumed: ${resumedJobs.length} jobs resumed`); + this.logger.log( + `Emergency stop resumed: ${resumedJobs.length} jobs resumed`, + ); return { resumedJobs: resumedJobs.length, @@ -330,7 +375,12 @@ export class SchedulerService implements OnModuleInit { }; } - async getJobs(query: JobQueryDto = {}): Promise<{ jobs: ScheduledJob[]; total: number; page: number; limit: number }> { + async getJobs(query: JobQueryDto = {}): Promise<{ + jobs: ScheduledJob[]; + total: number; + page: number; + limit: number; + }> { const queryBuilder = this.scheduledJobRepository.createQueryBuilder('job'); if (query.type) { @@ -342,15 +392,21 @@ export class SchedulerService implements OnModuleInit { } if (query.priority) { - queryBuilder.andWhere('job.priority = :priority', { priority: query.priority }); + queryBuilder.andWhere('job.priority = :priority', { + priority: query.priority, + }); } if (query.name) { - queryBuilder.andWhere('job.name ILIKE :name', { name: `%${query.name}%` }); + queryBuilder.andWhere('job.name ILIKE :name', { + name: `%${query.name}%`, + }); } if (query.createdBy) { - queryBuilder.andWhere('job.createdBy = :createdBy', { createdBy: query.createdBy }); + queryBuilder.andWhere('job.createdBy = :createdBy', { + createdBy: query.createdBy, + }); } if (query.tags && query.tags.length > 0) { @@ -358,19 +414,27 @@ export class SchedulerService implements OnModuleInit { } if (query.scheduledAfter) { - queryBuilder.andWhere('job.scheduledAt >= :scheduledAfter', { scheduledAfter: new Date(query.scheduledAfter) }); + queryBuilder.andWhere('job.scheduledAt >= :scheduledAfter', { + scheduledAfter: new Date(query.scheduledAfter), + }); } if (query.scheduledBefore) { - queryBuilder.andWhere('job.scheduledAt <= :scheduledBefore', { scheduledBefore: new Date(query.scheduledBefore) }); + queryBuilder.andWhere('job.scheduledAt <= :scheduledBefore', { + scheduledBefore: new Date(query.scheduledBefore), + }); } if (query.isActive !== undefined) { - queryBuilder.andWhere('job.isActive = :isActive', { isActive: query.isActive }); + queryBuilder.andWhere('job.isActive = :isActive', { + isActive: query.isActive, + }); } if (query.isEmergencyStop !== undefined) { - queryBuilder.andWhere('job.isEmergencyStop = :isEmergencyStop', { isEmergencyStop: query.isEmergencyStop }); + queryBuilder.andWhere('job.isEmergencyStop = :isEmergencyStop', { + isEmergencyStop: query.isEmergencyStop, + }); } const sortBy = query.sortBy || 'createdAt'; @@ -439,10 +503,18 @@ export class SchedulerService implements OnModuleInit { ] = await Promise.all([ this.scheduledJobRepository.count(), this.scheduledJobRepository.count({ where: { isActive: true } }), - this.scheduledJobRepository.count({ where: { status: JobStatus.PENDING } }), - this.scheduledJobRepository.count({ where: { status: JobStatus.RUNNING } }), - this.scheduledJobRepository.count({ where: { status: JobStatus.COMPLETED } }), - this.scheduledJobRepository.count({ where: { status: JobStatus.FAILED } }), + this.scheduledJobRepository.count({ + where: { status: JobStatus.PENDING }, + }), + this.scheduledJobRepository.count({ + where: { status: JobStatus.RUNNING }, + }), + this.scheduledJobRepository.count({ + where: { status: JobStatus.COMPLETED }, + }), + this.scheduledJobRepository.count({ + where: { status: JobStatus.FAILED }, + }), this.scheduledJobRepository.count({ where: { isEmergencyStop: true } }), ]); @@ -607,7 +679,9 @@ export class SchedulerService implements OnModuleInit { }; await this.scheduledJobRepository.save(job); - this.logger.warn(`Job ${job.id} marked as failed due to timeout during recovery`); + this.logger.warn( + `Job ${job.id} marked as failed due to timeout during recovery`, + ); } } } @@ -632,7 +706,7 @@ export class SchedulerService implements OnModuleInit { private async getJobsByType(): Promise> { const result = {} as Record; - + for (const jobType of Object.values(JobType)) { result[jobType] = await this.scheduledJobRepository.count({ where: { type: jobType }, @@ -644,7 +718,7 @@ export class SchedulerService implements OnModuleInit { private async getJobsByPriority(): Promise> { const result = {} as Record; - + for (const priority of Object.values(JobPriority)) { result[priority] = await this.scheduledJobRepository.count({ where: { priority }, @@ -662,7 +736,10 @@ export class SchedulerService implements OnModuleInit { if (jobs.length === 0) return 0; - const totalTime = jobs.reduce((sum, job) => sum + (job.metrics?.avgExecutionTime || 0), 0); + const totalTime = jobs.reduce( + (sum, job) => sum + (job.metrics?.avgExecutionTime || 0), + 0, + ); return totalTime / jobs.length; } @@ -674,7 +751,7 @@ export class SchedulerService implements OnModuleInit { async isMarketOpen(timeZone: string = 'UTC'): Promise { const now = new Date(); - + try { const options: Intl.DateTimeFormatOptions = { timeZone, @@ -682,15 +759,18 @@ export class SchedulerService implements OnModuleInit { hour12: false, weekday: 'long', }; - + const dateTimeString = now.toLocaleString('en-US', options); const [timeString, dayString] = dateTimeString.split(', '); const currentHour = parseInt(timeString.split(':')[0]); const isWeekday = !['Saturday', 'Sunday'].includes(dayString.trim()); - + return isWeekday && currentHour >= 9 && currentHour < 17; } catch (error) { - this.logger.warn(`Error checking market hours for timezone ${timeZone}`, error); + this.logger.warn( + `Error checking market hours for timezone ${timeZone}`, + error, + ); return true; } } @@ -703,25 +783,25 @@ export class SchedulerService implements OnModuleInit { }> { const now = new Date(); const isOpen = await this.isMarketOpen(timeZone); - + let nextOpen: Date; let nextClose: Date; - + if (isOpen) { nextClose = new Date(now); nextClose.setUTCHours(17, 0, 0, 0); // 5 PM UTC - + nextOpen = new Date(now); nextOpen.setDate(nextOpen.getDate() + 1); nextOpen.setUTCHours(14, 0, 0, 0); // 9 AM EST next day } else { nextOpen = new Date(now); nextOpen.setUTCHours(14, 0, 0, 0); // 9 AM EST today - + if (nextOpen <= now) { nextOpen.setDate(nextOpen.getDate() + 1); } - + nextClose = new Date(nextOpen); nextClose.setUTCHours(17, 0, 0, 0); } diff --git a/src/scheduler/services/market-hours.service.ts b/src/scheduler/services/market-hours.service.ts index 933070d..0da91b1 100644 --- a/src/scheduler/services/market-hours.service.ts +++ b/src/scheduler/services/market-hours.service.ts @@ -30,59 +30,68 @@ export class MarketHoursService { private readonly logger = new Logger(MarketHoursService.name); private readonly marketHours: Map = new Map([ - ['US', { - open: '09:30', - close: '16:00', - timezone: 'America/New_York', - weekdays: [1, 2, 3, 4, 5], // Monday-Friday - holidays: [ - '2024-01-01', // New Year's Day - '2024-01-15', // Martin Luther King Jr. Day - '2024-02-19', // Presidents' Day - '2024-04-15', // Good Friday - '2024-05-27', // Memorial Day - '2024-07-04', // Independence Day - '2024-09-02', // Labor Day - '2024-11-28', // Thanksgiving Day - '2024-12-25', // Christmas Day - ], - }], - ['EU', { - open: '09:00', - close: '17:30', - timezone: 'Europe/London', - weekdays: [1, 2, 3, 4, 5], - holidays: [ - '2024-01-01', // New Year's Day - '2024-04-01', // Easter Monday - '2024-05-01', // Labor Day - '2024-12-25', // Christmas Day - '2024-12-26', // Boxing Day - ], - }], - ['ASIA', { - open: '09:00', - close: '15:00', - timezone: 'Asia/Tokyo', - weekdays: [1, 2, 3, 4, 5], - holidays: [ - '2024-01-01', // New Year's Day - '2024-01-02', // New Year's Holiday - '2024-02-11', // National Foundation Day - '2024-02-12', // Emperor's Birthday - '2024-03-20', // Spring Equinox - '2024-04-29', // Showa Day - '2024-05-03', // Constitution Memorial Day - '2024-05-04', // Greenery Day - '2024-05-05', // Children's Day - '2024-08-11', // Mountain Day - '2024-09-16', // Respect for the Aged Day - '2024-09-22', // Autumn Equinox - '2024-10-14', // Sports Day - '2024-11-03', // Culture Day - '2024-11-23', // Labor Thanksgiving Day - ], - }], + [ + 'US', + { + open: '09:30', + close: '16:00', + timezone: 'America/New_York', + weekdays: [1, 2, 3, 4, 5], // Monday-Friday + holidays: [ + '2024-01-01', // New Year's Day + '2024-01-15', // Martin Luther King Jr. Day + '2024-02-19', // Presidents' Day + '2024-04-15', // Good Friday + '2024-05-27', // Memorial Day + '2024-07-04', // Independence Day + '2024-09-02', // Labor Day + '2024-11-28', // Thanksgiving Day + '2024-12-25', // Christmas Day + ], + }, + ], + [ + 'EU', + { + open: '09:00', + close: '17:30', + timezone: 'Europe/London', + weekdays: [1, 2, 3, 4, 5], + holidays: [ + '2024-01-01', // New Year's Day + '2024-04-01', // Easter Monday + '2024-05-01', // Labor Day + '2024-12-25', // Christmas Day + '2024-12-26', // Boxing Day + ], + }, + ], + [ + 'ASIA', + { + open: '09:00', + close: '15:00', + timezone: 'Asia/Tokyo', + weekdays: [1, 2, 3, 4, 5], + holidays: [ + '2024-01-01', // New Year's Day + '2024-01-02', // New Year's Holiday + '2024-02-11', // National Foundation Day + '2024-02-12', // Emperor's Birthday + '2024-03-20', // Spring Equinox + '2024-04-29', // Showa Day + '2024-05-03', // Constitution Memorial Day + '2024-05-04', // Greenery Day + '2024-05-05', // Children's Day + '2024-08-11', // Mountain Day + '2024-09-16', // Respect for the Aged Day + '2024-09-22', // Autumn Equinox + '2024-10-14', // Sports Day + '2024-11-03', // Culture Day + '2024-11-23', // Labor Thanksgiving Day + ], + }, + ], ]); async getMarketStatus(market: string = 'US'): Promise { @@ -93,11 +102,11 @@ export class MarketHoursService { const now = new Date(); const marketTime = this.convertToMarketTime(now, marketConfig.timezone); - + const isOpen = this.isMarketOpen(marketTime, marketConfig); const nextOpen = this.getNextMarketOpen(marketTime, marketConfig); const nextClose = this.getNextMarketClose(marketTime, marketConfig); - + const currentSession = this.getCurrentSession(marketTime, marketConfig); const timeUntilOpen = this.getMinutesUntil(nextOpen, marketTime); const timeUntilClose = this.getMinutesUntil(nextClose, marketTime); @@ -121,7 +130,7 @@ export class MarketHoursService { const now = new Date(); const marketTime = this.convertToMarketTime(now, marketConfig.timezone); - + return this.isMarketOpen(marketTime, marketConfig); } @@ -133,7 +142,7 @@ export class MarketHoursService { const now = new Date(); const marketTime = this.convertToMarketTime(now, marketConfig.timezone); - + return this.getNextMarketOpen(marketTime, marketConfig); } @@ -145,7 +154,7 @@ export class MarketHoursService { const now = new Date(); const marketTime = this.convertToMarketTime(now, marketConfig.timezone); - + return this.getNextMarketClose(marketTime, marketConfig); } @@ -160,7 +169,7 @@ export class MarketHoursService { async getAllMarketStatuses(): Promise> { const statuses: Record = {}; - + for (const market of this.marketHours.keys()) { try { statuses[market] = await this.getMarketStatus(market); @@ -168,13 +177,13 @@ export class MarketHoursService { this.logger.error(`Error getting status for market ${market}`, error); } } - + return statuses; } async isGloballyOpen(): Promise { const statuses = await this.getAllMarketStatuses(); - return Object.values(statuses).some(status => status.isOpen); + return Object.values(statuses).some((status) => status.isOpen); } async getActiveMarkets(): Promise { @@ -184,7 +193,10 @@ export class MarketHoursService { .map(([market, _]) => market); } - async validateExecutionTime(market: string, executionTime: Date): Promise<{ + async validateExecutionTime( + market: string, + executionTime: Date, + ): Promise<{ valid: boolean; reason?: string; suggestedTime?: Date; @@ -194,8 +206,11 @@ export class MarketHoursService { return { valid: false, reason: `Market ${market} not supported` }; } - const marketTime = this.convertToMarketTime(executionTime, marketConfig.timezone); - + const marketTime = this.convertToMarketTime( + executionTime, + marketConfig.timezone, + ); + if (!this.isWeekday(marketTime, marketConfig.weekdays)) { const nextOpen = this.getNextMarketOpen(marketTime, marketConfig); return { @@ -245,9 +260,12 @@ export class MarketHoursService { return { valid: true }; } - async adjustForMarketHours(market: string, executionTime: Date): Promise { + async adjustForMarketHours( + market: string, + executionTime: Date, + ): Promise { const validation = await this.validateExecutionTime(market, executionTime); - + if (validation.valid) { return executionTime; } @@ -270,13 +288,24 @@ export class MarketHoursService { const formatter = new Intl.DateTimeFormat('en-US', options); const parts = formatter.formatToParts(date); - - const year = parseInt(parts.find(part => part.type === 'year')?.value || '0'); - const month = parseInt(parts.find(part => part.type === 'month')?.value || '0') - 1; - const day = parseInt(parts.find(part => part.type === 'day')?.value || '0'); - const hour = parseInt(parts.find(part => part.type === 'hour')?.value || '0'); - const minute = parseInt(parts.find(part => part.type === 'minute')?.value || '0'); - const second = parseInt(parts.find(part => part.type === 'second')?.value || '0'); + + const year = parseInt( + parts.find((part) => part.type === 'year')?.value || '0', + ); + const month = + parseInt(parts.find((part) => part.type === 'month')?.value || '0') - 1; + const day = parseInt( + parts.find((part) => part.type === 'day')?.value || '0', + ); + const hour = parseInt( + parts.find((part) => part.type === 'hour')?.value || '0', + ); + const minute = parseInt( + parts.find((part) => part.type === 'minute')?.value || '0', + ); + const second = parseInt( + parts.find((part) => part.type === 'second')?.value || '0', + ); return new Date(year, month, day, hour, minute, second); } catch (error) { @@ -296,7 +325,7 @@ export class MarketHoursService { const [openHour, openMinute] = config.open.split(':').map(Number); const [closeHour, closeMinute] = config.close.split(':').map(Number); - + const currentMinutes = marketTime.getHours() * 60 + marketTime.getMinutes(); const openMinutes = openHour * 60 + openMinute; const closeMinutes = closeHour * 60 + closeMinute; @@ -314,14 +343,20 @@ export class MarketHoursService { return holidays.includes(dateString); } - private getCurrentSession(marketTime: Date, config: MarketHours): 'pre_market' | 'open' | 'after_hours' | 'closed' { - if (!this.isWeekday(marketTime, config.weekdays) || this.isHoliday(marketTime, config.holidays)) { + private getCurrentSession( + marketTime: Date, + config: MarketHours, + ): 'pre_market' | 'open' | 'after_hours' | 'closed' { + if ( + !this.isWeekday(marketTime, config.weekdays) || + this.isHoliday(marketTime, config.holidays) + ) { return 'closed'; } const [openHour, openMinute] = config.open.split(':').map(Number); const [closeHour, closeMinute] = config.close.split(':').map(Number); - + const currentMinutes = marketTime.getHours() * 60 + marketTime.getMinutes(); const openMinutes = openHour * 60 + openMinute; const closeMinutes = closeHour * 60 + closeMinute; @@ -330,7 +365,10 @@ export class MarketHoursService { return 'pre_market'; } else if (currentMinutes >= openMinutes && currentMinutes < closeMinutes) { return 'open'; - } else if (currentMinutes >= closeMinutes && currentMinutes < closeMinutes + 120) { + } else if ( + currentMinutes >= closeMinutes && + currentMinutes < closeMinutes + 120 + ) { return 'after_hours'; } else { return 'closed'; @@ -338,40 +376,49 @@ export class MarketHoursService { } private getNextMarketOpen(marketTime: Date, config: MarketHours): Date { - let nextOpen = new Date(marketTime); - + const nextOpen = new Date(marketTime); + // Move to next day nextOpen.setDate(nextOpen.getDate() + 1); - + // Find next valid weekday - while (!this.isWeekday(nextOpen, config.weekdays) || this.isHoliday(nextOpen, config.holidays)) { + while ( + !this.isWeekday(nextOpen, config.weekdays) || + this.isHoliday(nextOpen, config.holidays) + ) { nextOpen.setDate(nextOpen.getDate() + 1); } - + // Set market open time const [openHour, openMinute] = config.open.split(':').map(Number); nextOpen.setHours(openHour, openMinute, 0, 0); - + return nextOpen; } private getNextMarketClose(marketTime: Date, config: MarketHours): Date { const [closeHour, closeMinute] = config.close.split(':').map(Number); - + let nextClose = new Date(marketTime); nextClose.setHours(closeHour, closeMinute, 0, 0); - + // If today's close time has passed, move to next trading day - if (nextClose <= marketTime || !this.isWeekday(nextClose, config.weekdays) || this.isHoliday(nextClose, config.holidays)) { + if ( + nextClose <= marketTime || + !this.isWeekday(nextClose, config.weekdays) || + this.isHoliday(nextClose, config.holidays) + ) { nextClose = this.getNextMarketOpen(marketTime, config); nextClose.setHours(closeHour, closeMinute, 0, 0); } - + return nextClose; } private getMinutesUntil(targetDate: Date, currentTime: Date): number { - return Math.floor((targetDate.getTime() - currentTime.getTime()) / (1000 * 60)); + return Math.floor( + (targetDate.getTime() - currentTime.getTime()) / (1000 * 60), + ); } async addHoliday(market: string, holiday: Holiday): Promise { @@ -382,7 +429,9 @@ export class MarketHoursService { if (!marketConfig.holidays.includes(holiday.date)) { marketConfig.holidays.push(holiday.date); - this.logger.log(`Added holiday ${holiday.name} (${holiday.date}) to market ${market}`); + this.logger.log( + `Added holiday ${holiday.name} (${holiday.date}) to market ${market}`, + ); } } @@ -406,13 +455,18 @@ export class MarketHoursService { } if (year) { - return marketConfig.holidays.filter(date => date.startsWith(year.toString())); + return marketConfig.holidays.filter((date) => + date.startsWith(year.toString()), + ); } return marketConfig.holidays; } - async updateMarketHours(market: string, hours: Partial): Promise { + async updateMarketHours( + market: string, + hours: Partial, + ): Promise { const marketConfig = this.marketHours.get(market); if (!marketConfig) { throw new Error(`Market ${market} not supported`); @@ -422,7 +476,10 @@ export class MarketHoursService { this.logger.log(`Updated market hours for ${market}`); } - async getTradingCalendar(market: string, year: number): Promise<{ + async getTradingCalendar( + market: string, + year: number, + ): Promise<{ holidays: Holiday[]; earlyCloses: Holiday[]; regularSchedule: MarketHours; @@ -454,9 +511,9 @@ export class MarketHoursService { private getHolidayName(date: string): string { const holidayNames: Record = { - '2024-01-01': 'New Year\'s Day', + '2024-01-01': "New Year's Day", '2024-01-15': 'Martin Luther King Jr. Day', - '2024-02-19': 'Presidents\' Day', + '2024-02-19': "Presidents' Day", '2024-04-15': 'Good Friday', '2024-05-27': 'Memorial Day', '2024-07-04': 'Independence Day', diff --git a/src/security/alerts/security-alert.service.ts b/src/security/alerts/security-alert.service.ts index 627df09..2c27a81 100644 --- a/src/security/alerts/security-alert.service.ts +++ b/src/security/alerts/security-alert.service.ts @@ -1,5 +1,8 @@ import { Injectable, Logger } from '@nestjs/common'; -import { SecurityEvent, SeverityLevel } from '../entities/security-event.entity'; +import { + SecurityEvent, + SeverityLevel, +} from '../entities/security-event.entity'; export interface AlertPayload { eventId: string; @@ -83,30 +86,38 @@ export class SecurityAlertService { } } - private async determineRecipients(event: SecurityEvent): Promise { + private async determineRecipients( + event: SecurityEvent, + ): Promise { const recipients: AlertRecipient[] = []; // Configure based on severity if (event.severity === SeverityLevel.CRITICAL) { recipients.push( - { type: 'pagerduty', address: process.env.PAGERDUTY_INTEGRATION_URL! }, - { type: 'slack', address: process.env.SLACK_CRITICAL_WEBHOOK_URL! }, + { type: 'pagerduty', address: process.env.PAGERDUTY_INTEGRATION_URL }, + { type: 'slack', address: process.env.SLACK_CRITICAL_WEBHOOK_URL }, ); } else if (event.severity === SeverityLevel.HIGH) { recipients.push( - { type: 'slack', address: process.env.SLACK_HIGH_WEBHOOK_URL! }, - { type: 'email', address: process.env.SECURITY_TEAM_EMAIL! }, + { type: 'slack', address: process.env.SLACK_HIGH_WEBHOOK_URL }, + { type: 'email', address: process.env.SECURITY_TEAM_EMAIL }, ); } else if (event.severity === SeverityLevel.MEDIUM) { - recipients.push({ type: 'email', address: process.env.SECURITY_TEAM_EMAIL! }); + recipients.push({ + type: 'email', + address: process.env.SECURITY_TEAM_EMAIL, + }); } // Add webhooks for compliance monitoring if (process.env.COMPLIANCE_WEBHOOK_URL) { - recipients.push({ type: 'webhook', address: process.env.COMPLIANCE_WEBHOOK_URL }); + recipients.push({ + type: 'webhook', + address: process.env.COMPLIANCE_WEBHOOK_URL, + }); } - return recipients.filter(r => r.address); + return recipients.filter((r) => r.address); } private async sendEmail(address: string, alert: AlertPayload): Promise { @@ -116,7 +127,7 @@ export class SecurityAlertService { private async sendWebhook(url: string, alert: AlertPayload): Promise { this.logger.log(`Sending webhook alert to ${url}`); - + const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -134,11 +145,14 @@ export class SecurityAlertService { } } - private async sendSlack(webhookUrl: string, alert: AlertPayload): Promise { + private async sendSlack( + webhookUrl: string, + alert: AlertPayload, + ): Promise { this.logger.log(`Sending Slack alert`); - + const color = this.getSeverityColor(alert.severity); - + const response = await fetch(webhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -148,10 +162,18 @@ export class SecurityAlertService { color, title: `🚨 Security Alert: ${alert.type}`, fields: [ - { title: 'Severity', value: alert.severity.toUpperCase(), short: true }, + { + title: 'Severity', + value: alert.severity.toUpperCase(), + short: true, + }, { title: 'Event ID', value: alert.eventId, short: true }, { title: 'Description', value: alert.description, short: false }, - { title: 'Time', value: alert.timestamp.toISOString(), short: true }, + { + title: 'Time', + value: alert.timestamp.toISOString(), + short: true, + }, ], footer: 'Security Monitoring System', ts: Math.floor(alert.timestamp.getTime() / 1000), @@ -167,7 +189,7 @@ export class SecurityAlertService { private async sendPagerDuty(url: string, alert: AlertPayload): Promise { this.logger.log(`Sending PagerDuty alert`); - + const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, diff --git a/src/security/detectors/anomaly.detector.ts b/src/security/detectors/anomaly.detector.ts index c95aad4..af1e606 100644 --- a/src/security/detectors/anomaly.detector.ts +++ b/src/security/detectors/anomaly.detector.ts @@ -1,5 +1,8 @@ import { Injectable, Logger } from '@nestjs/common'; -import { SecurityEvent, SeverityLevel } from '../entities/security-event.entity'; +import { + SecurityEvent, + SeverityLevel, +} from '../entities/security-event.entity'; export interface AnomalyResult { type: string; @@ -51,9 +54,11 @@ export class AnomalyDetectorService { return anomalies; } - private async detectVolumeSpike(transactionData: any): Promise { + private async detectVolumeSpike( + transactionData: any, + ): Promise { const { amount, walletAddress } = transactionData; - + // Get historical average volume for this wallet const avgVolume = await this.getHistoricalAverageVolume(walletAddress); const ratio = amount / avgVolume; @@ -61,7 +66,10 @@ export class AnomalyDetectorService { if (ratio > this.thresholds.volumeSpike) { return { type: 'VOLUME_SPIKE', - severity: ratio > this.thresholds.volumeSpike * 2 ? SeverityLevel.HIGH : SeverityLevel.MEDIUM, + severity: + ratio > this.thresholds.volumeSpike * 2 + ? SeverityLevel.HIGH + : SeverityLevel.MEDIUM, confidence: Math.min(ratio / this.thresholds.volumeSpike, 1), description: `Transaction volume ${ratio.toFixed(2)}x higher than average`, metrics: { currentAmount: amount, averageVolume: avgVolume, ratio }, @@ -71,9 +79,11 @@ export class AnomalyDetectorService { return null; } - private async detectPriceDeviation(transactionData: any): Promise { + private async detectPriceDeviation( + transactionData: any, + ): Promise { const { price, marketPrice } = transactionData; - + if (!price || !marketPrice) return null; const deviation = Math.abs(price - marketPrice) / marketPrice; @@ -81,7 +91,10 @@ export class AnomalyDetectorService { if (deviation > this.thresholds.priceDeviation) { return { type: 'PRICE_DEVIATION', - severity: deviation > this.thresholds.priceDeviation * 2 ? SeverityLevel.HIGH : SeverityLevel.MEDIUM, + severity: + deviation > this.thresholds.priceDeviation * 2 + ? SeverityLevel.HIGH + : SeverityLevel.MEDIUM, confidence: Math.min(deviation / this.thresholds.priceDeviation, 1), description: `Transaction price deviates ${deviation.toFixed(2)}% from market price`, metrics: { transactionPrice: price, marketPrice, deviation }, @@ -91,18 +104,26 @@ export class AnomalyDetectorService { return null; } - private async detectFrequencySpike(transactionData: any): Promise { + private async detectFrequencySpike( + transactionData: any, + ): Promise { const { walletAddress, timestamp } = transactionData; - + // Count transactions in last hour - const recentCount = await this.getRecentTransactionCount(walletAddress, timestamp); + const recentCount = await this.getRecentTransactionCount( + walletAddress, + timestamp, + ); const avgHourly = await this.getAverageHourlyTransactions(walletAddress); const ratio = recentCount / avgHourly; if (ratio > this.thresholds.frequencySpike) { return { type: 'FREQUENCY_SPIKE', - severity: ratio > this.thresholds.frequencySpike * 2 ? SeverityLevel.CRITICAL : SeverityLevel.HIGH, + severity: + ratio > this.thresholds.frequencySpike * 2 + ? SeverityLevel.CRITICAL + : SeverityLevel.HIGH, confidence: Math.min(ratio / this.thresholds.frequencySpike, 1), description: `Transaction frequency ${ratio.toFixed(2)}x higher than normal`, metrics: { recentCount, averageHourly: avgHourly, ratio }, @@ -112,16 +133,21 @@ export class AnomalyDetectorService { return null; } - private async detectSizeOutlier(transactionData: any): Promise { + private async detectSizeOutlier( + transactionData: any, + ): Promise { const { amount, walletAddress } = transactionData; - + const stats = await this.getTransactionSizeStats(walletAddress); const zScore = Math.abs(amount - stats.mean) / stats.stdDev; if (zScore > this.thresholds.sizeOutlier) { return { type: 'SIZE_OUTLIER', - severity: zScore > this.thresholds.sizeOutlier * 2 ? SeverityLevel.HIGH : SeverityLevel.MEDIUM, + severity: + zScore > this.thresholds.sizeOutlier * 2 + ? SeverityLevel.HIGH + : SeverityLevel.MEDIUM, confidence: Math.min(zScore / this.thresholds.sizeOutlier, 1), description: `Transaction size is ${zScore.toFixed(2)} standard deviations from mean`, metrics: { amount, mean: stats.mean, stdDev: stats.stdDev, zScore }, @@ -132,22 +158,31 @@ export class AnomalyDetectorService { } // Mock methods - in production these would query the database - private async getHistoricalAverageVolume(walletAddress: string): Promise { + private async getHistoricalAverageVolume( + walletAddress: string, + ): Promise { // Placeholder - implement actual DB query return 1000; } - private async getRecentTransactionCount(walletAddress: string, timestamp: Date): Promise { + private async getRecentTransactionCount( + walletAddress: string, + timestamp: Date, + ): Promise { // Placeholder - implement actual DB query return 10; } - private async getAverageHourlyTransactions(walletAddress: string): Promise { + private async getAverageHourlyTransactions( + walletAddress: string, + ): Promise { // Placeholder - implement actual DB query return 2; } - private async getTransactionSizeStats(walletAddress: string): Promise<{ mean: number; stdDev: number }> { + private async getTransactionSizeStats( + walletAddress: string, + ): Promise<{ mean: number; stdDev: number }> { // Placeholder - implement actual DB query return { mean: 1000, stdDev: 200 }; } diff --git a/src/security/detectors/fraud.detector.ts b/src/security/detectors/fraud.detector.ts index 7648ef4..c0dfd6c 100644 --- a/src/security/detectors/fraud.detector.ts +++ b/src/security/detectors/fraud.detector.ts @@ -1,5 +1,8 @@ import { Injectable, Logger } from '@nestjs/common'; -import { SecurityEvent, SeverityLevel } from '../entities/security-event.entity'; +import { + SecurityEvent, + SeverityLevel, +} from '../entities/security-event.entity'; export interface FraudAnalysisResult { isSuspicious: boolean; @@ -54,14 +57,15 @@ export class FraudDetectorService { } // Check for other suspicious patterns - const suspiciousPatternResult = await this.detectSuspiciousPatterns(transactionData); + const suspiciousPatternResult = + await this.detectSuspiciousPatterns(transactionData); if (suspiciousPatternResult) { patterns.push('SUSPICIOUS_PATTERN'); riskScore += this.riskWeights.suspiciousPatterns; } const severity = this.calculateSeverity(riskScore); - + return { isSuspicious: riskScore > 0.3, severity, @@ -91,7 +95,8 @@ export class FraudDetectorService { } // Check for price manipulation patterns - const priceManipulation = await this.detectPriceManipulation(transactionData); + const priceManipulation = + await this.detectPriceManipulation(transactionData); if (priceManipulation) { indicators.push('PRICE_MANIPULATION'); confidence += 0.2; @@ -114,7 +119,7 @@ export class FraudDetectorService { private async detectSelfTrading(transactionData: any): Promise { const { buyerId, sellerId, walletAddress } = transactionData; - + // Check if buyer and seller are the same entity if (buyerId === sellerId) { return true; @@ -127,7 +132,7 @@ export class FraudDetectorService { private async detectRapidReversal(transactionData: any): Promise { const { walletAddress, timestamp, amount } = transactionData; - + // Look for opposite transactions within short time window (e.g., 5 minutes) const reversalExists = await this.findOppositeTransaction( walletAddress, @@ -141,7 +146,7 @@ export class FraudDetectorService { private async detectCircularTrading(transactionData: any): Promise { const { participants } = transactionData; - + // Detect circular trading patterns (A->B->C->A) if (participants && participants.length >= 3) { const hasCircularPattern = await this.checkCircularPattern(participants); @@ -151,7 +156,9 @@ export class FraudDetectorService { return false; } - private async detectSuspiciousPatterns(transactionData: any): Promise { + private async detectSuspiciousPatterns( + transactionData: any, + ): Promise { // Check for structuring (breaking large transactions into smaller ones) const structuringDetected = await this.detectStructuring(transactionData); if (structuringDetected) return true; @@ -163,13 +170,16 @@ export class FraudDetectorService { return false; } - private async detectPriceManipulation(transactionData: any): Promise { + private async detectPriceManipulation( + transactionData: any, + ): Promise { const { price, marketPrice, recentPrices } = transactionData; - + if (!recentPrices || recentPrices.length === 0) return false; // Check for artificial price movements - const avgRecentPrice = recentPrices.reduce((a, b) => a + b, 0) / recentPrices.length; + const avgRecentPrice = + recentPrices.reduce((a, b) => a + b, 0) / recentPrices.length; const deviation = Math.abs(price - avgRecentPrice) / avgRecentPrice; return deviation > 0.2; // 20% deviation suggests manipulation @@ -177,7 +187,7 @@ export class FraudDetectorService { private async detectVolumeInflation(transactionData: any): Promise { const { amount, walletAddress } = transactionData; - + // Check for unusually high volume compared to historical data const avgVolume = await this.getHistoricalAverageVolume(walletAddress); const ratio = amount / avgVolume; @@ -193,7 +203,10 @@ export class FraudDetectorService { } // Helper methods - implement actual DB queries in production - private async checkWalletRelationship(wallet1: string, wallet2: string): Promise { + private async checkWalletRelationship( + wallet1: string, + wallet2: string, + ): Promise { // Check if wallets are related through common ownership, IP, etc. return false; // Placeholder } @@ -233,7 +246,9 @@ export class FraudDetectorService { return false; // Placeholder } - private async getHistoricalAverageVolume(walletAddress: string): Promise { + private async getHistoricalAverageVolume( + walletAddress: string, + ): Promise { return 1000; // Placeholder } } diff --git a/src/security/entities/security-event.entity.ts b/src/security/entities/security-event.entity.ts index c29e5fa..8eb91ae 100644 --- a/src/security/entities/security-event.entity.ts +++ b/src/security/entities/security-event.entity.ts @@ -1,4 +1,10 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + Index, +} from 'typeorm'; export enum SecurityEventType { ANOMALY_DETECTED = 'anomaly_detected', diff --git a/src/security/monitoring/security-monitor.service.ts b/src/security/monitoring/security-monitor.service.ts index c94d56c..568c48a 100644 --- a/src/security/monitoring/security-monitor.service.ts +++ b/src/security/monitoring/security-monitor.service.ts @@ -1,7 +1,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository, Between } from 'typeorm'; -import { SecurityEvent, SecurityEventType, SeverityLevel } from '../entities/security-event.entity'; +import { + SecurityEvent, + SecurityEventType, + SeverityLevel, +} from '../entities/security-event.entity'; import { AnomalyDetectorService } from '../detectors/anomaly.detector'; import { FraudDetectorService } from '../detectors/fraud.detector'; @@ -19,7 +23,8 @@ export class SecurityMonitorService { async monitorTransaction(transactionData: any): Promise { try { // Check for anomalies - const anomalies = await this.anomalyDetector.detectAnomalies(transactionData); + const anomalies = + await this.anomalyDetector.detectAnomalies(transactionData); if (anomalies.length > 0) { await this.createSecurityEvent({ eventType: SecurityEventType.ANOMALY_DETECTED, @@ -32,7 +37,8 @@ export class SecurityMonitorService { } // Check for fraud patterns - const fraudIndicators = await this.fraudDetector.analyzeTransaction(transactionData); + const fraudIndicators = + await this.fraudDetector.analyzeTransaction(transactionData); if (fraudIndicators.isSuspicious) { await this.createSecurityEvent({ eventType: SecurityEventType.FRAUD_SUSPECTED, @@ -45,7 +51,8 @@ export class SecurityMonitorService { } // Check for wash trading - const washTradingResult = await this.fraudDetector.detectWashTrading(transactionData); + const washTradingResult = + await this.fraudDetector.detectWashTrading(transactionData); if (washTradingResult.isWashTrading) { await this.createSecurityEvent({ eventType: SecurityEventType.WASH_TRADING, @@ -61,14 +68,20 @@ export class SecurityMonitorService { } } - async createSecurityEvent(eventData: Partial): Promise { + async createSecurityEvent( + eventData: Partial, + ): Promise { const event = this.securityEventRepo.create(eventData); const saved = await this.securityEventRepo.save(event); - - this.logger.log(`Security event created: ${eventData.eventType} - ${eventData.description}`); - + + this.logger.log( + `Security event created: ${eventData.eventType} - ${eventData.description}`, + ); + // Trigger alerts for high/critical severity - if ([SeverityLevel.HIGH, SeverityLevel.CRITICAL].includes(eventData.severity)) { + if ( + [SeverityLevel.HIGH, SeverityLevel.CRITICAL].includes(eventData.severity) + ) { await this.triggerAlert(saved); } @@ -77,7 +90,9 @@ export class SecurityMonitorService { async triggerAlert(event: SecurityEvent): Promise { // This will be handled by the SecurityAlertService - this.logger.warn(`ALERT TRIGGERED: ${event.eventType} - ${event.description}`); + this.logger.warn( + `ALERT TRIGGERED: ${event.eventType} - ${event.description}`, + ); // In production, this would send to notification systems, webhooks, etc. } @@ -95,8 +110,13 @@ export class SecurityMonitorService { }); } - async resolveEvent(eventId: string, resolvedBy: string): Promise { - const event = await this.securityEventRepo.findOne({ where: { id: eventId } }); + async resolveEvent( + eventId: string, + resolvedBy: string, + ): Promise { + const event = await this.securityEventRepo.findOne({ + where: { id: eventId }, + }); if (!event) { throw new Error('Security event not found'); } @@ -104,12 +124,14 @@ export class SecurityMonitorService { event.isResolved = true; event.resolvedAt = new Date(); event.resolvedBy = resolvedBy; - + return this.securityEventRepo.save(event); } async markAsFalsePositive(eventId: string): Promise { - const event = await this.securityEventRepo.findOne({ where: { id: eventId } }); + const event = await this.securityEventRepo.findOne({ + where: { id: eventId }, + }); if (event) { event.falsePositiveCount += 1; await this.securityEventRepo.save(event); @@ -117,14 +139,19 @@ export class SecurityMonitorService { } async markAsTruePositive(eventId: string): Promise { - const event = await this.securityEventRepo.findOne({ where: { id: eventId } }); + const event = await this.securityEventRepo.findOne({ + where: { id: eventId }, + }); if (event) { event.truePositiveCount += 1; await this.securityEventRepo.save(event); } } - async getSecurityMetrics(timeRange: { start: Date; end: Date }): Promise { + async getSecurityMetrics(timeRange: { + start: Date; + end: Date; + }): Promise { const queryBuilder = this.securityEventRepo.createQueryBuilder('event'); queryBuilder.where('event.createdAt BETWEEN :start AND :end', { start: timeRange.start, @@ -137,22 +164,30 @@ export class SecurityMonitorService { totalEvents: events.length, byType: this.groupByEventType(events), bySeverity: this.groupBySeverity(events), - unresolvedCount: events.filter(e => !e.isResolved).length, - averageConfidenceScore: events.reduce((acc, e) => acc + e.getConfidenceScore(), 0) / events.length || 0, + unresolvedCount: events.filter((e) => !e.isResolved).length, + averageConfidenceScore: + events.reduce((acc, e) => acc + e.getConfidenceScore(), 0) / + events.length || 0, }; } private groupByEventType(events: SecurityEvent[]): Record { - return events.reduce((acc, event) => { - acc[event.eventType] = (acc[event.eventType] || 0) + 1; - return acc; - }, {} as Record); + return events.reduce( + (acc, event) => { + acc[event.eventType] = (acc[event.eventType] || 0) + 1; + return acc; + }, + {} as Record, + ); } private groupBySeverity(events: SecurityEvent[]): Record { - return events.reduce((acc, event) => { - acc[event.severity] = (acc[event.severity] || 0) + 1; - return acc; - }, {} as Record); + return events.reduce( + (acc, event) => { + acc[event.severity] = (acc[event.severity] || 0) + 1; + return acc; + }, + {} as Record, + ); } } diff --git a/src/security/response/incident-response.service.ts b/src/security/response/incident-response.service.ts index b0c72a3..8138795 100644 --- a/src/security/response/incident-response.service.ts +++ b/src/security/response/incident-response.service.ts @@ -1,5 +1,9 @@ import { Injectable, Logger } from '@nestjs/common'; -import { SecurityEvent, SecurityEventType, SeverityLevel } from '../entities/security-event.entity'; +import { + SecurityEvent, + SecurityEventType, + SeverityLevel, +} from '../entities/security-event.entity'; import { SecurityMonitorService } from '../monitoring/security-monitor.service'; export interface IncidentResponse { @@ -29,7 +33,9 @@ export class IncidentResponseService { constructor(private readonly securityMonitor: SecurityMonitorService) {} - async createIncidentFromEvent(event: SecurityEvent): Promise { + async createIncidentFromEvent( + event: SecurityEvent, + ): Promise { this.logger.log(`Creating incident from security event: ${event.id}`); const response: IncidentResponse = { @@ -40,7 +46,11 @@ export class IncidentResponseService { { timestamp: new Date(), event: 'INCIDENT_CREATED', - details: { eventId: event.id, eventType: event.eventType, severity: event.severity }, + details: { + eventId: event.id, + eventType: event.eventType, + severity: event.severity, + }, }, ], }; @@ -77,7 +87,7 @@ export class IncidentResponseService { } // Update incident status - if (incident.actions.some(a => a.type === 'CONTAINMENT')) { + if (incident.actions.some((a) => a.type === 'CONTAINMENT')) { incident.status = 'contained'; } } @@ -144,7 +154,10 @@ export class IncidentResponseService { await this.generateComplianceReport(incident, event); } - private async handleFraud(incident: IncidentResponse, event: SecurityEvent): Promise { + private async handleFraud( + incident: IncidentResponse, + event: SecurityEvent, + ): Promise { this.logger.log('Handling fraud incident'); // Enhanced monitoring on related wallets @@ -166,7 +179,10 @@ export class IncidentResponseService { }); } - private async handleAnomaly(incident: IncidentResponse, event: SecurityEvent): Promise { + private async handleAnomaly( + incident: IncidentResponse, + event: SecurityEvent, + ): Promise { this.logger.log('Handling anomaly incident'); // Baseline analysis @@ -253,7 +269,9 @@ export class IncidentResponseService { return { riskScore: 0.75, factors: ['pattern_match', 'velocity'] }; } - private async analyzeDeviationFromBaseline(event: SecurityEvent): Promise { + private async analyzeDeviationFromBaseline( + event: SecurityEvent, + ): Promise { // Analyze how much current behavior deviates from baseline return { deviationScore: 2.5, baselineMetrics: {} }; } diff --git a/src/security/security.controller.ts b/src/security/security.controller.ts index 954efb7..a75c925 100644 --- a/src/security/security.controller.ts +++ b/src/security/security.controller.ts @@ -1,5 +1,18 @@ -import { Controller, Get, Post, Body, Param, Query, UseGuards } from '@nestjs/common'; -import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth } from '@nestjs/swagger'; +import { + Controller, + Get, + Post, + Body, + Param, + Query, + UseGuards, +} from '@nestjs/common'; +import { + ApiTags, + ApiOperation, + ApiResponse, + ApiBearerAuth, +} from '@nestjs/swagger'; import { SecurityMonitorService } from './monitoring/security-monitor.service'; import { IncidentResponseService } from './response/incident-response.service'; import { SecurityEvent } from './entities/security-event.entity'; @@ -15,13 +28,18 @@ export class SecurityController { @Get('events') @ApiOperation({ summary: 'Get recent security events' }) @ApiResponse({ status: 200, description: 'Returns recent security events' }) - async getRecentEvents(@Query('limit') limit: number = 50): Promise { + async getRecentEvents( + @Query('limit') limit: number = 50, + ): Promise { return this.securityMonitor.getRecentEvents(limit); } @Get('events/unresolved') @ApiOperation({ summary: 'Get unresolved security events' }) - @ApiResponse({ status: 200, description: 'Returns unresolved security events' }) + @ApiResponse({ + status: 200, + description: 'Returns unresolved security events', + }) async getUnresolvedEvents(): Promise { return this.securityMonitor.getUnresolvedEvents(); } @@ -66,7 +84,9 @@ export class SecurityController { @Post('incidents/create-from-event') @ApiOperation({ summary: 'Create incident from security event' }) @ApiResponse({ status: 200, description: 'Incident created successfully' }) - async createIncidentFromEvent(@Body('eventId') eventId: string): Promise { + async createIncidentFromEvent( + @Body('eventId') eventId: string, + ): Promise { // In production, fetch the actual event const event = new SecurityEvent(); event.id = eventId; @@ -75,7 +95,10 @@ export class SecurityController { @Post('monitor/transaction') @ApiOperation({ summary: 'Monitor a transaction for suspicious activity' }) - @ApiResponse({ status: 200, description: 'Transaction monitored successfully' }) + @ApiResponse({ + status: 200, + description: 'Transaction monitored successfully', + }) async monitorTransaction(@Body() transactionData: any): Promise { await this.securityMonitor.monitorTransaction(transactionData); } diff --git a/src/sentiment/aggregators/news-aggregator.service.ts b/src/sentiment/aggregators/news-aggregator.service.ts index 42f51cd..12c6f87 100644 --- a/src/sentiment/aggregators/news-aggregator.service.ts +++ b/src/sentiment/aggregators/news-aggregator.service.ts @@ -6,7 +6,7 @@ export class NewsAggregatorService { async aggregateNews(sources: string[]): Promise { this.logger.log('Aggregating news from sources'); - + // In production, integrate with news APIs (Reuters, Bloomberg, etc.) const articles = await this.fetchFromSources(sources); return articles; @@ -20,7 +20,8 @@ export class NewsAggregatorService { source: 'Energy Today', url: 'https://example.com/article1', publishedAt: new Date(), - content: 'The renewable energy sector is experiencing unprecedented growth...', + content: + 'The renewable energy sector is experiencing unprecedented growth...', }, ]; } diff --git a/src/sentiment/algorithms/sentiment-scorer.service.ts b/src/sentiment/algorithms/sentiment-scorer.service.ts index 01d2c3c..49b014c 100644 --- a/src/sentiment/algorithms/sentiment-scorer.service.ts +++ b/src/sentiment/algorithms/sentiment-scorer.service.ts @@ -4,19 +4,38 @@ import { Injectable, Logger } from '@nestjs/common'; export class SentimentScorerService { private readonly logger = new Logger(SentimentScorerService.name); - async calculateSentiment(text: string, processedData?: any): Promise<{ score: number; confidence: number }> { + async calculateSentiment( + text: string, + processedData?: any, + ): Promise<{ score: number; confidence: number }> { this.logger.log('Calculating sentiment score'); // In production, use NLP libraries like sentiment, natural, or transformer models - const positiveWords = ['growth', 'surge', 'profit', 'gain', 'positive', 'strong', 'bullish']; - const negativeWords = ['decline', 'loss', 'drop', 'fall', 'negative', 'weak', 'bearish']; + const positiveWords = [ + 'growth', + 'surge', + 'profit', + 'gain', + 'positive', + 'strong', + 'bullish', + ]; + const negativeWords = [ + 'decline', + 'loss', + 'drop', + 'fall', + 'negative', + 'weak', + 'bearish', + ]; const words = text.toLowerCase().split(/\W+/); - + let positiveCount = 0; let negativeCount = 0; - words.forEach(word => { + words.forEach((word) => { if (positiveWords.includes(word)) positiveCount++; if (negativeWords.includes(word)) negativeCount++; }); @@ -24,19 +43,23 @@ export class SentimentScorerService { const total = words.length; const score = (positiveCount - negativeCount) / Math.sqrt(total); const normalizedScore = Math.max(-1, Math.min(1, score)); - + const confidence = Math.min(1, (positiveCount + negativeCount) / 10); return { score: normalizedScore, confidence }; } - async calculateEngagementScore(metrics: { likes?: number; shares?: number; comments?: number }): Promise { + async calculateEngagementScore(metrics: { + likes?: number; + shares?: number; + comments?: number; + }): Promise { const weights = { likes: 1, shares: 3, comments: 2 }; - const score = + const score = (metrics.likes || 0) * weights.likes + (metrics.shares || 0) * weights.shares + (metrics.comments || 0) * weights.comments; - + return Math.min(100, score); } } diff --git a/src/sentiment/correlation/market-correlation.service.ts b/src/sentiment/correlation/market-correlation.service.ts index 038c403..72e986d 100644 --- a/src/sentiment/correlation/market-correlation.service.ts +++ b/src/sentiment/correlation/market-correlation.service.ts @@ -4,13 +4,16 @@ import { Injectable, Logger } from '@nestjs/common'; export class MarketCorrelationService { private readonly logger = new Logger(MarketCorrelationService.name); - async correlateSentimentWithMarket(sentimentData: any[], marketData: any[]): Promise { + async correlateSentimentWithMarket( + sentimentData: any[], + marketData: any[], + ): Promise { this.logger.log('Correlating sentiment with market movements'); // Calculate correlation coefficient between sentiment and price movements const correlation = this.calculatePearsonCorrelation( - sentimentData.map(s => s.sentimentScore), - marketData.map(m => m.priceChange), + sentimentData.map((s) => s.sentimentScore), + marketData.map((m) => m.priceChange), ); return { @@ -20,10 +23,16 @@ export class MarketCorrelationService { }; } - async generateTradingSignal(sentimentTrend: string, marketContext: any): Promise<'bullish' | 'bearish' | 'neutral'> { + async generateTradingSignal( + sentimentTrend: string, + marketContext: any, + ): Promise<'bullish' | 'bearish' | 'neutral'> { if (sentimentTrend === 'improving' && marketContext.volatility < 0.3) { return 'bullish'; - } else if (sentimentTrend === 'declining' && marketContext.volatility < 0.3) { + } else if ( + sentimentTrend === 'declining' && + marketContext.volatility < 0.3 + ) { return 'bearish'; } return 'neutral'; diff --git a/src/sentiment/dto/sentiment-query.dto.ts b/src/sentiment/dto/sentiment-query.dto.ts index 2a46033..71693f7 100644 --- a/src/sentiment/dto/sentiment-query.dto.ts +++ b/src/sentiment/dto/sentiment-query.dto.ts @@ -1,5 +1,11 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsOptional, IsString, IsNumber, IsEnum, IsDateString } from 'class-validator'; +import { + IsOptional, + IsString, + IsNumber, + IsEnum, + IsDateString, +} from 'class-validator'; import { SentimentType, SourceType } from '../entities/sentiment-data.entity'; export class SentimentQueryDto { @@ -18,12 +24,20 @@ export class SentimentQueryDto { @IsDateString() endDate?: string; - @ApiProperty({ description: 'Sentiment type filter', required: false, enum: SentimentType }) + @ApiProperty({ + description: 'Sentiment type filter', + required: false, + enum: SentimentType, + }) @IsOptional() @IsEnum(SentimentType) sentimentType?: SentimentType; - @ApiProperty({ description: 'Source type filter', required: false, enum: SourceType }) + @ApiProperty({ + description: 'Source type filter', + required: false, + enum: SourceType, + }) @IsOptional() @IsEnum(SourceType) sourceType?: SourceType; diff --git a/src/sentiment/entities/sentiment-data.entity.ts b/src/sentiment/entities/sentiment-data.entity.ts index 138fdf7..b0d1764 100644 --- a/src/sentiment/entities/sentiment-data.entity.ts +++ b/src/sentiment/entities/sentiment-data.entity.ts @@ -1,4 +1,10 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + Index, +} from 'typeorm'; export enum SentimentType { POSITIVE = 'positive', diff --git a/src/sentiment/monitors/social-media.service.ts b/src/sentiment/monitors/social-media.service.ts index 828b0a3..2f4b33d 100644 --- a/src/sentiment/monitors/social-media.service.ts +++ b/src/sentiment/monitors/social-media.service.ts @@ -6,14 +6,19 @@ export class SocialMediaMonitorService { async monitorPlatforms(keywords: string[]): Promise { this.logger.log('Monitoring social media platforms'); - + // In production, integrate with Twitter/X API, Reddit API, etc. const posts = await this.fetchPosts(keywords); return posts; } async fetchTrendingTopics(): Promise { - return ['renewable energy', 'solar power', 'wind energy', 'electric vehicles']; + return [ + 'renewable energy', + 'solar power', + 'wind energy', + 'electric vehicles', + ]; } private async fetchPosts(keywords: string[]): Promise { diff --git a/src/sentiment/nlp/text-processor.service.ts b/src/sentiment/nlp/text-processor.service.ts index 5e398d2..4702f4f 100644 --- a/src/sentiment/nlp/text-processor.service.ts +++ b/src/sentiment/nlp/text-processor.service.ts @@ -35,18 +35,35 @@ export class TextProcessorService { private tokenize(text: string): string[] { // Simple tokenization - in production use proper NLP libraries - return text.toLowerCase().split(/\W+/).filter(word => word.length > 2); + return text + .toLowerCase() + .split(/\W+/) + .filter((word) => word.length > 2); } private extractKeywords(tokens: string[]): string[] { // Remove stop words and extract meaningful keywords - const stopWords = ['the', 'and', 'is', 'in', 'at', 'of', 'to', 'for', 'on', 'with']; - const keywordCounts = tokens.reduce((acc, token) => { - if (!stopWords.includes(token)) { - acc[token] = (acc[token] || 0) + 1; - } - return acc; - }, {} as Record); + const stopWords = [ + 'the', + 'and', + 'is', + 'in', + 'at', + 'of', + 'to', + 'for', + 'on', + 'with', + ]; + const keywordCounts = tokens.reduce( + (acc, token) => { + if (!stopWords.includes(token)) { + acc[token] = (acc[token] || 0) + 1; + } + return acc; + }, + {} as Record, + ); return Object.entries(keywordCounts) .sort((a, b) => b[1] - a[1]) @@ -67,21 +84,36 @@ export class TextProcessorService { private checkRelevance(keywords: string[], entities: string[]): boolean { // Check if content is relevant to energy/markets - const relevantTerms = ['energy', 'power', 'electricity', 'renewable', 'solar', 'wind', - 'market', 'price', 'trading', 'grid', 'consumption']; - - const hasRelevantKeyword = keywords.some(k => relevantTerms.includes(k.toLowerCase())); - const hasRelevantEntity = entities.some(e => e.toLowerCase().includes('energy')); - + const relevantTerms = [ + 'energy', + 'power', + 'electricity', + 'renewable', + 'solar', + 'wind', + 'market', + 'price', + 'trading', + 'grid', + 'consumption', + ]; + + const hasRelevantKeyword = keywords.some((k) => + relevantTerms.includes(k.toLowerCase()), + ); + const hasRelevantEntity = entities.some((e) => + e.toLowerCase().includes('energy'), + ); + return hasRelevantKeyword || hasRelevantEntity; } async batchProcess(texts: string[]): Promise { this.logger.log(`Batch processing ${texts.length} texts`); - + // Process in parallel for performance - const results = await Promise.all(texts.map(text => this.process(text))); - - return results.filter(result => result.isRelevant); + const results = await Promise.all(texts.map((text) => this.process(text))); + + return results.filter((result) => result.isRelevant); } } diff --git a/src/sentiment/sentiment.controller.ts b/src/sentiment/sentiment.controller.ts index bb22cd6..2cc8298 100644 --- a/src/sentiment/sentiment.controller.ts +++ b/src/sentiment/sentiment.controller.ts @@ -21,12 +21,20 @@ export class SentimentController { @ApiOperation({ summary: 'Analyze sentiment of text' }) async analyzeText(@Query('text') text: string): Promise { const processed = await this.textProcessor.process(text); - const sentiment = await this.sentimentScorer.calculateSentiment(text, processed); - + const sentiment = await this.sentimentScorer.calculateSentiment( + text, + processed, + ); + return { ...processed, ...sentiment, - label: sentiment.score > 0.3 ? 'positive' : sentiment.score < -0.3 ? 'negative' : 'neutral', + label: + sentiment.score > 0.3 + ? 'positive' + : sentiment.score < -0.3 + ? 'negative' + : 'neutral', }; } @@ -47,14 +55,19 @@ export class SentimentController { async getMarketCorrelation(): Promise { const sentimentData = [{ sentimentScore: 0.6 }, { sentimentScore: 0.4 }]; const marketData = [{ priceChange: 0.05 }, { priceChange: 0.03 }]; - - return this.marketCorrelation.correlateSentimentWithMarket(sentimentData, marketData); + + return this.marketCorrelation.correlateSentimentWithMarket( + sentimentData, + marketData, + ); } @Get('trading-signal') @ApiOperation({ summary: 'Generate trading signal based on sentiment' }) async getTradingSignal(@Query('trend') trend: string): Promise { - const signal = await this.marketCorrelation.generateTradingSignal(trend, { volatility: 0.2 }); + const signal = await this.marketCorrelation.generateTradingSignal(trend, { + volatility: 0.2, + }); return { signal, generatedAt: new Date() }; } @@ -64,7 +77,10 @@ export class SentimentController { const results = []; for (const text of texts) { const processed = await this.textProcessor.process(text); - const sentiment = await this.sentimentScorer.calculateSentiment(text, processed); + const sentiment = await this.sentimentScorer.calculateSentiment( + text, + processed, + ); results.push({ text: text.substring(0, 50) + '...', ...sentiment }); } return results; diff --git a/src/settings/dto/market-setting.dto.ts b/src/settings/dto/market-setting.dto.ts new file mode 100644 index 0000000..445504e --- /dev/null +++ b/src/settings/dto/market-setting.dto.ts @@ -0,0 +1,51 @@ +import { + IsString, + IsNumber, + IsObject, + IsOptional, + Min, + Matches, +} from 'class-validator'; +import { PartialType } from '@nestjs/mapped-types'; +import { IsValidPriceRange } from '../validators/setting.validator'; + +export class CreateMarketSettingDto { + @IsString() + @IsOptional() + settingKey?: string = 'global'; + + @IsString() + @Matches(/^([01]\d|2[0-3]):([0-5]\d)$/, { + message: 'Invalid time format, use HH:mm', + }) + marketStartTime: string; + + @IsString() + @Matches(/^([01]\d|2[0-3]):([0-5]\d)$/, { + message: 'Invalid time format, use HH:mm', + }) + marketEndTime: string; + + @IsString() + timezone: string; + + @IsNumber({ maxDecimalPlaces: 2 }) + @Min(0) + minTradeAmount: number; + + @IsNumber({ maxDecimalPlaces: 2 }) + @Min(0) + maxTradeAmount: number; + + @IsObject() + @IsValidPriceRange() + defaultPriceRanges: Record; + + @IsString() + @IsOptional() + createdBy?: string; +} + +export class UpdateMarketSettingDto extends PartialType( + CreateMarketSettingDto, +) {} diff --git a/src/settings/dto/user-preference.dto.ts b/src/settings/dto/user-preference.dto.ts new file mode 100644 index 0000000..df95de2 --- /dev/null +++ b/src/settings/dto/user-preference.dto.ts @@ -0,0 +1,19 @@ +import { IsString, IsObject, IsOptional } from 'class-validator'; +import { PartialType } from '@nestjs/mapped-types'; +import { UserPreferences } from '../entities/user-preference.entity'; + +export class CreateUserPreferenceDto { + @IsString() + userId: string; + + @IsObject() + preferences: UserPreferences; + + @IsString() + @IsOptional() + createdBy?: string; +} + +export class UpdateUserPreferenceDto extends PartialType( + CreateUserPreferenceDto, +) {} diff --git a/src/settings/entities/market-setting.entity.ts b/src/settings/entities/market-setting.entity.ts new file mode 100644 index 0000000..19b8e3d --- /dev/null +++ b/src/settings/entities/market-setting.entity.ts @@ -0,0 +1,55 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, +} from 'typeorm'; + +@Entity('market_settings') +@Index(['settingKey', 'isActive']) +@Index(['version']) +export class MarketSetting { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ type: 'varchar', length: 100, default: 'global' }) + settingKey: string; + + @Column({ type: 'varchar', length: 10 }) + marketStartTime: string; // HH:mm + + @Column({ type: 'varchar', length: 10 }) + marketEndTime: string; + + @Column({ type: 'varchar', length: 50 }) + timezone: string; + + @Column({ type: 'decimal', precision: 15, scale: 2 }) + minTradeAmount: number; + + @Column({ type: 'decimal', precision: 15, scale: 2 }) + maxTradeAmount: number; + + @Column({ type: 'json' }) + defaultPriceRanges: Record; + + @Column({ type: 'int', default: 1 }) + version: number; + + @Column({ type: 'boolean', default: true }) + isActive: boolean; + + @Column({ type: 'varchar', length: 100, nullable: true }) + createdBy: string; + + @Column({ type: 'varchar', length: 100, nullable: true }) + updatedBy: string; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +} diff --git a/src/settings/entities/user-preference.entity.ts b/src/settings/entities/user-preference.entity.ts new file mode 100644 index 0000000..f01d9fc --- /dev/null +++ b/src/settings/entities/user-preference.entity.ts @@ -0,0 +1,62 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, +} from 'typeorm'; + +export interface NotificationPreferences { + email: boolean; + sms: boolean; + push: boolean; + tradeConfirmations: boolean; + priceAlerts: boolean; + marketNews: boolean; +} + +export interface InterfacePreferences { + theme: 'light' | 'dark'; + language: string; + timezone: string; + currency: string; + dashboardLayout: string[]; +} + +export interface UserPreferences { + notifications: NotificationPreferences; + interface: InterfacePreferences; +} + +@Entity('user_preferences') +@Index(['userId', 'isActive']) +@Index(['version']) +export class UserPreference { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ type: 'varchar', length: 100 }) + userId: string; + + @Column({ type: 'json' }) + preferences: UserPreferences; + + @Column({ type: 'int', default: 1 }) + version: number; + + @Column({ type: 'boolean', default: true }) + isActive: boolean; + + @Column({ type: 'varchar', length: 100, nullable: true }) + createdBy: string; + + @Column({ type: 'varchar', length: 100, nullable: true }) + updatedBy: string; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +} diff --git a/src/settings/settings.controller.ts b/src/settings/settings.controller.ts new file mode 100644 index 0000000..118267c --- /dev/null +++ b/src/settings/settings.controller.ts @@ -0,0 +1,89 @@ +import { Controller, Get, Post, Put, Body, Param, Query } from '@nestjs/common'; +import { SettingsService } from './settings.service'; +import { + CreateMarketSettingDto, + UpdateMarketSettingDto, +} from './dto/market-setting.dto'; +import { + CreateUserPreferenceDto, + UpdateUserPreferenceDto, +} from './dto/user-preference.dto'; + +@Controller('settings') +export class SettingsController { + constructor(private readonly settingsService: SettingsService) {} + + @Get('market') + async getMarketSettings(@Query('key') key = 'global') { + return this.settingsService.getActiveMarketSettings(key); + } + + @Post('market') + async createMarketSettings(@Body() dto: CreateMarketSettingDto) { + return this.settingsService.createInitialMarketSettings(dto); + } + + @Put('market') + async updateMarketSettings( + @Body() dto: UpdateMarketSettingDto, + @Query('updatedBy') updatedBy: string, + ) { + return this.settingsService.updateMarketSettings(dto, updatedBy); + } + + @Put('market/rollback/:version') + async rollbackMarketSettings( + @Param('version') version: number, + @Query('key') key = 'global', + @Query('updatedBy') updatedBy: string, + ) { + return this.settingsService.rollbackMarketSettings(version, key, updatedBy); + } + + @Get('user/:userId') + async getUserPreferences(@Param('userId') userId: string) { + return this.settingsService.getUserPreferences(userId); + } + + @Post('user') + async createUserPreferences(@Body() dto: CreateUserPreferenceDto) { + return this.settingsService.createUserPreferences(dto); + } + + @Put('user/:userId') + async updateUserPreferences( + @Param('userId') userId: string, + @Body() dto: UpdateUserPreferenceDto, + @Query('updatedBy') updatedBy: string, + ) { + return this.settingsService.updateUserPreferences(userId, dto, updatedBy); + } + + @Put('user/:userId/rollback/:version') + async rollbackUserPreferences( + @Param('userId') userId: string, + @Param('version') version: number, + @Query('updatedBy') updatedBy: string, + ) { + return this.settingsService.rollbackUserPreferences( + userId, + version, + updatedBy, + ); + } + + @Get('backup') + async backupSettings() { + const json = await this.settingsService.backupSettings(); + return { backup: json }; + } + + @Post('restore') + async restoreSettings( + @Body() body: { backup: string }, + @Query('restoredBy') restoredBy: string, + ) { + await this.settingsService.restoreSettings(body.backup, restoredBy); + return { message: 'Settings restored successfully' }; + } +} diff --git a/src/settings/settings.module.ts b/src/settings/settings.module.ts new file mode 100644 index 0000000..d6458ea --- /dev/null +++ b/src/settings/settings.module.ts @@ -0,0 +1,18 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { MarketSetting } from './entities/market-setting.entity'; +import { UserPreference } from './entities/user-preference.entity'; +import { SettingsService } from './settings.service'; +import { SettingsController } from './settings.controller'; +import { LoggingModule } from '../logging/logging.module'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([MarketSetting, UserPreference]), + LoggingModule, + ], + controllers: [SettingsController], + providers: [SettingsService], + exports: [SettingsService], +}) +export class SettingsModule {} diff --git a/src/settings/settings.service.ts b/src/settings/settings.service.ts new file mode 100644 index 0000000..40916ff --- /dev/null +++ b/src/settings/settings.service.ts @@ -0,0 +1,318 @@ +import { + Injectable, + Logger, + NotFoundException, + BadRequestException, +} from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { MarketSetting } from './entities/market-setting.entity'; +import { UserPreference } from './entities/user-preference.entity'; +import { + CreateMarketSettingDto, + UpdateMarketSettingDto, +} from './dto/market-setting.dto'; +import { + CreateUserPreferenceDto, + UpdateUserPreferenceDto, +} from './dto/user-preference.dto'; +import { LoggingService } from '../logging/logging.service'; + +@Injectable() +export class SettingsService { + private readonly logger = new Logger(SettingsService.name); + private marketSettingsCache: MarketSetting | null = null; + private userPreferencesCache = new Map(); + + constructor( + @InjectRepository(MarketSetting) + private marketSettingRepository: Repository, + @InjectRepository(UserPreference) + private userPreferenceRepository: Repository, + private loggingService: LoggingService, + ) {} + + async getActiveMarketSettings(settingKey = 'global'): Promise { + if ( + this.marketSettingsCache && + this.marketSettingsCache.settingKey === settingKey && + this.marketSettingsCache.isActive + ) { + return this.marketSettingsCache; + } + const setting = await this.marketSettingRepository.findOne({ + where: { settingKey, isActive: true }, + }); + if (!setting) { + throw new NotFoundException('Active market settings not found'); + } + this.marketSettingsCache = setting; + return setting; + } + + async updateMarketSettings( + dto: UpdateMarketSettingDto, + updatedBy: string, + ): Promise { + const current = await this.getActiveMarketSettings( + dto.settingKey || 'global', + ); + // Validate + const min = dto.minTradeAmount ?? current.minTradeAmount; + const max = dto.maxTradeAmount ?? current.maxTradeAmount; + if (min >= max) { + throw new BadRequestException( + 'minTradeAmount must be less than maxTradeAmount', + ); + } + // Deactivate current + await this.marketSettingRepository.update( + { id: current.id }, + { isActive: false, updatedBy, updatedAt: new Date() }, + ); + // Create new version + const newVersion = current.version + 1; + const newSetting = this.marketSettingRepository.create({ + ...current, + ...dto, + version: newVersion, + isActive: true, + updatedBy, + createdBy: updatedBy, + createdAt: new Date(), + updatedAt: new Date(), + }); + const saved = await this.marketSettingRepository.save(newSetting); + this.marketSettingsCache = saved; + // Log change + await this.loggingService.info('Market settings updated', { + oldVersion: current.version, + newVersion, + updatedBy, + changes: dto, + }, { + context: { component: 'settings', function: 'updateMarketSettings' }, + }); + return saved; + } + + async createInitialMarketSettings( + dto: CreateMarketSettingDto, + ): Promise { + // Check if exists + const existing = await this.marketSettingRepository.findOne({ + where: { settingKey: dto.settingKey || 'global', isActive: true }, + }); + if (existing) { + throw new BadRequestException('Active market settings already exist'); + } + if (dto.minTradeAmount >= dto.maxTradeAmount) { + throw new BadRequestException( + 'minTradeAmount must be less than maxTradeAmount', + ); + } + const setting = this.marketSettingRepository.create(dto); + const saved = await this.marketSettingRepository.save(setting); + this.marketSettingsCache = saved; + return saved; + } + + async rollbackMarketSettings( + version: number, + settingKey = 'global', + updatedBy: string, + ): Promise { + const target = await this.marketSettingRepository.findOne({ + where: { settingKey, version, isActive: false }, + }); + if (!target) { + throw new NotFoundException(`Version ${version} not found for rollback`); + } + // Deactivate current + await this.marketSettingRepository.update( + { settingKey, isActive: true }, + { isActive: false, updatedBy, updatedAt: new Date() }, + ); + // Activate target + await this.marketSettingRepository.update( + { id: target.id }, + { isActive: true, updatedBy, updatedAt: new Date() }, + ); + this.marketSettingsCache = null; // clear cache + const updated = await this.getActiveMarketSettings(settingKey); + await this.loggingService.warn('Market settings rolled back', { + rolledBackToVersion: version, + updatedBy, + }, { + context: { component: 'settings', function: 'rollbackMarketSettings' }, + }); + return updated; + } + + async getUserPreferences(userId: string): Promise { + if (this.userPreferencesCache.has(userId)) { + const cached = this.userPreferencesCache.get(userId); + if (cached.isActive) return cached; + } + const pref = await this.userPreferenceRepository.findOne({ + where: { userId, isActive: true }, + }); + if (!pref) { + throw new NotFoundException('User preferences not found'); + } + this.userPreferencesCache.set(userId, pref); + return pref; + } + + async updateUserPreferences( + userId: string, + dto: UpdateUserPreferenceDto, + updatedBy: string, + ): Promise { + const current = await this.getUserPreferences(userId); + // Deactivate current + await this.userPreferenceRepository.update( + { id: current.id }, + { isActive: false, updatedBy, updatedAt: new Date() }, + ); + // Create new version + const newVersion = current.version + 1; + const newPref = this.userPreferenceRepository.create({ + ...current, + ...dto, + version: newVersion, + isActive: true, + updatedBy, + createdBy: updatedBy, + createdAt: new Date(), + updatedAt: new Date(), + }); + const saved = await this.userPreferenceRepository.save(newPref); + this.userPreferencesCache.set(userId, saved); + await this.loggingService.info('User preferences updated', { + userId, + oldVersion: current.version, + newVersion, + updatedBy, + changes: dto, + }, { + context: { component: 'settings', function: 'updateUserPreferences' }, + }); + return saved; + } + + async createUserPreferences( + dto: CreateUserPreferenceDto, + ): Promise { + const existing = await this.userPreferenceRepository.findOne({ + where: { userId: dto.userId, isActive: true }, + }); + if (existing) { + throw new BadRequestException('Active user preferences already exist'); + } + const pref = this.userPreferenceRepository.create(dto); + const saved = await this.userPreferenceRepository.save(pref); + this.userPreferencesCache.set(dto.userId, saved); + return saved; + } + + async rollbackUserPreferences( + userId: string, + version: number, + updatedBy: string, + ): Promise { + const target = await this.userPreferenceRepository.findOne({ + where: { userId, version, isActive: false }, + }); + if (!target) { + throw new NotFoundException( + `Version ${version} not found for user ${userId}`, + ); + } + // Deactivate current + await this.userPreferenceRepository.update( + { userId, isActive: true }, + { isActive: false, updatedBy, updatedAt: new Date() }, + ); + // Activate target + await this.userPreferenceRepository.update( + { id: target.id }, + { isActive: true, updatedBy, updatedAt: new Date() }, + ); + this.userPreferencesCache.delete(userId); + const updated = await this.getUserPreferences(userId); + await this.loggingService.warn('User preferences rolled back', { + userId, + rolledBackToVersion: version, + updatedBy, + }, { + context: { component: 'settings', function: 'rollbackUserPreferences' }, + }); + return updated; + } + + async backupSettings(): Promise { + const marketSettings = await this.marketSettingRepository.find(); + const userPreferences = await this.userPreferenceRepository.find(); + const backup = { + marketSettings, + userPreferences, + timestamp: new Date().toISOString(), + }; + return JSON.stringify(backup, null, 2); + } + + async restoreSettings(backupJson: string, restoredBy: string): Promise { + try { + const backup = JSON.parse(backupJson); + // For restore, deactivate all current active + await this.marketSettingRepository.update( + {}, + { isActive: false, updatedBy: restoredBy, updatedAt: new Date() }, + ); + await this.userPreferenceRepository.update( + {}, + { isActive: false, updatedBy: restoredBy, updatedAt: new Date() }, + ); + // Insert restored as new versions + for (const setting of backup.marketSettings) { + const newSetting = { + ...setting, + id: undefined, + version: setting.version + 1000, // to distinguish restored + isActive: setting.isActive, + createdBy: restoredBy, + updatedBy: restoredBy, + createdAt: new Date(setting.createdAt), + updatedAt: new Date(), + }; + await this.marketSettingRepository.save(newSetting); + } + for (const pref of backup.userPreferences) { + const newPref = { + ...pref, + id: undefined, + version: pref.version + 1000, + isActive: pref.isActive, + createdBy: restoredBy, + updatedBy: restoredBy, + createdAt: new Date(pref.createdAt), + updatedAt: new Date(), + }; + await this.userPreferenceRepository.save(newPref); + } + // Clear caches + this.marketSettingsCache = null; + this.userPreferencesCache.clear(); + await this.loggingService.info('Settings restored from backup', { + restoredBy, + timestamp: backup.timestamp, + }, { + context: { component: 'settings', function: 'restoreSettings' }, + }); + }); + } catch (error) { + throw new BadRequestException('Invalid backup JSON'); + } + } +} diff --git a/src/settings/validators/setting.validator.ts b/src/settings/validators/setting.validator.ts new file mode 100644 index 0000000..8081fa9 --- /dev/null +++ b/src/settings/validators/setting.validator.ts @@ -0,0 +1,38 @@ +import { + registerDecorator, + ValidationOptions, + ValidationArguments, +} from 'class-validator'; + +export function IsValidPriceRange(validationOptions?: ValidationOptions) { + return function (object: object, propertyName: string) { + registerDecorator({ + name: 'isValidPriceRange', + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + validator: { + validate(value: unknown, _args: ValidationArguments) { + if (typeof value !== 'object' || value === null) return false; + const valueObj = value as Record; + for (const [_key, range] of Object.entries(valueObj)) { + if (typeof range !== 'object' || range === null) return false; + const { min, max } = range as { min: number; max: number }; + if ( + typeof min !== 'number' || + typeof max !== 'number' || + min >= max || + min < 0 || + max < 0 + ) + return false; + } + return true; + }, + defaultMessage(args: ValidationArguments) { + return 'Each price range must have valid min and max numbers with min < max and >= 0'; + }, + }, + }); + }; +} diff --git a/src/sync/entities/sync-state.entity.ts b/src/sync/entities/sync-state.entity.ts index 4afced7..4b35891 100644 --- a/src/sync/entities/sync-state.entity.ts +++ b/src/sync/entities/sync-state.entity.ts @@ -1,4 +1,11 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, +} from 'typeorm'; export enum SyncStatus { IDLE = 'idle', @@ -6,13 +13,13 @@ export enum SyncStatus { CONFLICT = 'conflict', PARTITIONED = 'partitioned', RECOVERING = 'recovering', - ERROR = 'error' + ERROR = 'error', } export enum SyncType { FULL = 'full', INCREMENTAL = 'incremental', - RECOVERY = 'recovery' + RECOVERY = 'recovery', } @Entity('sync_states') diff --git a/src/sync/handlers/partition.handler.ts b/src/sync/handlers/partition.handler.ts index 14da159..4051640 100644 --- a/src/sync/handlers/partition.handler.ts +++ b/src/sync/handlers/partition.handler.ts @@ -8,7 +8,11 @@ import { takeWhile, switchMap, catchError } from 'rxjs/operators'; import { SyncState, SyncStatus } from '../entities/sync-state.entity'; export interface PartitionEvent { - type: 'partition_detected' | 'partition_resolved' | 'recovery_started' | 'recovery_completed'; + type: + | 'partition_detected' + | 'partition_resolved' + | 'recovery_started' + | 'recovery_completed'; timestamp: Date; duration?: number; affectedEntities: string[]; @@ -113,12 +117,12 @@ export class PartitionHandler { .pipe( takeWhile(() => this.isPartitioned.value), switchMap(() => this.checkNetworkRecovery()), - catchError(error => { + catchError((error) => { this.logger.error('Error during recovery monitoring', error); return []; - }) + }), ) - .subscribe(isRecovered => { + .subscribe((isRecovered) => { if (isRecovered) { this.initiateRecovery(); } else { @@ -134,8 +138,12 @@ export class PartitionHandler { private async checkNetworkRecovery(): Promise { try { // Check if we can reach the Stellar network - const latestLedger = await this.server.ledgers().order('desc').limit(1).call(); - + const latestLedger = await this.server + .ledgers() + .order('desc') + .limit(1) + .call(); + if (!latestLedger.records || latestLedger.records.length === 0) { return false; } @@ -143,7 +151,7 @@ export class PartitionHandler { // Check if ledger progression is normal const currentLedger = latestLedger.records[0].sequence; const syncStates = await this.syncStateRepository.find(); - + let maxGap = 0; for (const syncState of syncStates) { const gap = currentLedger - syncState.lastLedgerSequence; @@ -160,7 +168,7 @@ export class PartitionHandler { private async initiateRecovery(): Promise { this.logger.log('Network recovered, initiating recovery process'); - + this.partitionEvents.next({ type: 'recovery_started', timestamp: new Date(), @@ -206,19 +214,27 @@ export class PartitionHandler { this.logger.log('Validating data integrity after partition'); const syncStates = await this.syncStateRepository.find(); - + for (const syncState of syncStates) { try { // Validate that the last synced ledger is still valid - const ledger = await this.server.ledgers().ledger(syncState.lastLedgerSequence).call(); - + const ledger = await this.server + .ledgers() + .ledger(syncState.lastLedgerSequence) + .call(); + if (!ledger) { - this.logger.warn(`Invalid ledger sequence ${syncState.lastLedgerSequence} for ${syncState.entityType}`); + this.logger.warn( + `Invalid ledger sequence ${syncState.lastLedgerSequence} for ${syncState.entityType}`, + ); syncState.lastLedgerSequence = await this.getSafeStartingPoint(); await this.syncStateRepository.save(syncState); } } catch (error) { - this.logger.error(`Error validating integrity for ${syncState.entityType}`, error); + this.logger.error( + `Error validating integrity for ${syncState.entityType}`, + error, + ); syncState.lastLedgerSequence = await this.getSafeStartingPoint(); await this.syncStateRepository.save(syncState); } @@ -245,10 +261,12 @@ export class PartitionHandler { for (const syncState of syncStates) { const missedLedgers = currentLedger - syncState.lastLedgerSequence; - + if (missedLedgers > 0) { - this.logger.log(`Catching up ${missedLedgers} missed ledgers for ${syncState.entityType}`); - + this.logger.log( + `Catching up ${missedLedgers} missed ledgers for ${syncState.entityType}`, + ); + // Update target ledger to trigger catch-up sync syncState.targetLedgerSequence = currentLedger; syncState.status = SyncStatus.RECOVERING; @@ -262,16 +280,19 @@ export class PartitionHandler { this.logger.log('Exited quarantine mode'); } - private async updateRecoveryMetrics(recoveryStartTime: number): Promise { + private async updateRecoveryMetrics( + recoveryStartTime: number, + ): Promise { const recoveryDuration = Date.now() - recoveryStartTime; const partitionDuration = recoveryStartTime - this.partitionStartTime; - + const currentMetrics = this.metrics.value; const newMetrics = { ...currentMetrics, partitionCount: currentMetrics.partitionCount + 1, totalPartitionTime: currentMetrics.totalPartitionTime + partitionDuration, - averageRecoveryTime: (currentMetrics.averageRecoveryTime + recoveryDuration) / 2, + averageRecoveryTime: + (currentMetrics.averageRecoveryTime + recoveryDuration) / 2, entitiesAffected: await this.getAffectedEntityCount(), }; @@ -280,7 +301,7 @@ export class PartitionHandler { private async handleRecoveryFailure(error: any): Promise { this.logger.error('Recovery failed, implementing fallback strategy', error); - + // Fallback strategy: reset to a known good state const safeStartingPoint = await this.getSafeStartingPoint(); const syncStates = await this.syncStateRepository.find(); @@ -293,21 +314,25 @@ export class PartitionHandler { } // If retry count is too high, mark as data loss scenario - const hasHighRetryCount = syncStates.some(state => state.retryCount > 3); + const hasHighRetryCount = syncStates.some((state) => state.retryCount > 3); if (hasHighRetryCount) { const currentMetrics = this.metrics.value; this.metrics.next({ ...currentMetrics, dataLoss: true, }); - - this.logger.error('Data loss scenario detected, manual intervention required'); + + this.logger.error( + 'Data loss scenario detected, manual intervention required', + ); } } private async escalatePartition(): Promise { - this.logger.error('Partition escalation triggered - manual intervention required'); - + this.logger.error( + 'Partition escalation triggered - manual intervention required', + ); + // Send alerts, create tickets, etc. // This would integrate with your monitoring/alerting system } @@ -324,7 +349,11 @@ export class PartitionHandler { private async getCurrentLedgerSequence(): Promise { try { - const latestLedger = await this.server.ledgers().order('desc').limit(1).call(); + const latestLedger = await this.server + .ledgers() + .order('desc') + .limit(1) + .call(); return latestLedger.records[0]?.sequence || 0; } catch (error) { this.logger.error('Failed to get current ledger sequence', error); @@ -347,15 +376,15 @@ export class PartitionHandler { const syncStates = await this.syncStateRepository.find({ where: { status: SyncStatus.PARTITIONED }, }); - - return syncStates.map(state => `${state.entityType}:${state.entityId}`); + + return syncStates.map((state) => `${state.entityType}:${state.entityId}`); } private async getAffectedEntityCount(): Promise { const syncStates = await this.syncStateRepository.find({ where: { status: SyncStatus.PARTITIONED }, }); - + return syncStates.length; } @@ -388,10 +417,10 @@ export class PartitionHandler { async testPartitionRecovery(): Promise { this.logger.log('Testing partition recovery procedures'); - + // Simulate partition detection and recovery await this.handlePartition(); - + // Wait a bit then simulate recovery setTimeout(async () => { await this.initiateRecovery(); diff --git a/src/sync/optimizers/performance.optimizer.ts b/src/sync/optimizers/performance.optimizer.ts index cf2f2af..42f25bc 100644 --- a/src/sync/optimizers/performance.optimizer.ts +++ b/src/sync/optimizers/performance.optimizer.ts @@ -82,7 +82,7 @@ export class PerformanceOptimizer { }; this.metricsHistory.push(metrics); - + // Keep only last 100 measurements if (this.metricsHistory.length > 100) { this.metricsHistory.shift(); @@ -98,23 +98,33 @@ export class PerformanceOptimizer { const issues: string[] = []; if (avgMetrics.latency > this.performanceThresholds.maxLatencyMs) { - issues.push(`High latency: ${avgMetrics.latency}ms > ${this.performanceThresholds.maxLatencyMs}ms`); + issues.push( + `High latency: ${avgMetrics.latency}ms > ${this.performanceThresholds.maxLatencyMs}ms`, + ); } if (avgMetrics.throughput < this.performanceThresholds.minThroughputTps) { - issues.push(`Low throughput: ${avgMetrics.throughput} TPS < ${this.performanceThresholds.minThroughputTps} TPS`); + issues.push( + `Low throughput: ${avgMetrics.throughput} TPS < ${this.performanceThresholds.minThroughputTps} TPS`, + ); } if (avgMetrics.memoryUsage > this.performanceThresholds.maxMemoryUsageMB) { - issues.push(`High memory usage: ${avgMetrics.memoryUsage}MB > ${this.performanceThresholds.maxMemoryUsageMB}MB`); + issues.push( + `High memory usage: ${avgMetrics.memoryUsage}MB > ${this.performanceThresholds.maxMemoryUsageMB}MB`, + ); } if (avgMetrics.cpuUsage > this.performanceThresholds.maxCpuUsagePercent) { - issues.push(`High CPU usage: ${avgMetrics.cpuUsage}% > ${this.performanceThresholds.maxCpuUsagePercent}%`); + issues.push( + `High CPU usage: ${avgMetrics.cpuUsage}% > ${this.performanceThresholds.maxCpuUsagePercent}%`, + ); } if (avgMetrics.errorRate > this.performanceThresholds.maxErrorRatePercent) { - issues.push(`High error rate: ${avgMetrics.errorRate}% > ${this.performanceThresholds.maxErrorRatePercent}%`); + issues.push( + `High error rate: ${avgMetrics.errorRate}% > ${this.performanceThresholds.maxErrorRatePercent}%`, + ); } if (issues.length > 0) { @@ -134,45 +144,83 @@ export class PerformanceOptimizer { // Optimize batch size based on latency and throughput if (avgMetrics.latency > this.performanceThresholds.maxLatencyMs) { if (this.currentStrategy.batchSize > 10) { - this.currentStrategy.batchSize = Math.max(10, Math.floor(this.currentStrategy.batchSize * 0.8)); + this.currentStrategy.batchSize = Math.max( + 10, + Math.floor(this.currentStrategy.batchSize * 0.8), + ); strategyChanged = true; - this.logger.log(`Reduced batch size to ${this.currentStrategy.batchSize} due to high latency`); + this.logger.log( + `Reduced batch size to ${this.currentStrategy.batchSize} due to high latency`, + ); } - } else if (avgMetrics.throughput < this.performanceThresholds.minThroughputTps) { + } else if ( + avgMetrics.throughput < this.performanceThresholds.minThroughputTps + ) { if (this.currentStrategy.batchSize < 500) { - this.currentStrategy.batchSize = Math.min(500, Math.floor(this.currentStrategy.batchSize * 1.2)); + this.currentStrategy.batchSize = Math.min( + 500, + Math.floor(this.currentStrategy.batchSize * 1.2), + ); strategyChanged = true; - this.logger.log(`Increased batch size to ${this.currentStrategy.batchSize} to improve throughput`); + this.logger.log( + `Increased batch size to ${this.currentStrategy.batchSize} to improve throughput`, + ); } } // Optimize parallelism based on CPU usage if (avgMetrics.cpuUsage > this.performanceThresholds.maxCpuUsagePercent) { if (this.currentStrategy.parallelism > 1) { - this.currentStrategy.parallelism = Math.max(1, this.currentStrategy.parallelism - 1); + this.currentStrategy.parallelism = Math.max( + 1, + this.currentStrategy.parallelism - 1, + ); strategyChanged = true; - this.logger.log(`Reduced parallelism to ${this.currentStrategy.parallelism} due to high CPU usage`); + this.logger.log( + `Reduced parallelism to ${this.currentStrategy.parallelism} due to high CPU usage`, + ); } - } else if (avgMetrics.cpuUsage < 50 && avgMetrics.throughput < this.performanceThresholds.minThroughputTps) { + } else if ( + avgMetrics.cpuUsage < 50 && + avgMetrics.throughput < this.performanceThresholds.minThroughputTps + ) { if (this.currentStrategy.parallelism < 8) { - this.currentStrategy.parallelism = Math.min(8, this.currentStrategy.parallelism + 1); + this.currentStrategy.parallelism = Math.min( + 8, + this.currentStrategy.parallelism + 1, + ); strategyChanged = true; - this.logger.log(`Increased parallelism to ${this.currentStrategy.parallelism} to improve throughput`); + this.logger.log( + `Increased parallelism to ${this.currentStrategy.parallelism} to improve throughput`, + ); } } // Optimize cache size based on memory usage if (avgMetrics.memoryUsage > this.performanceThresholds.maxMemoryUsageMB) { if (this.currentStrategy.cacheSize > 100) { - this.currentStrategy.cacheSize = Math.max(100, Math.floor(this.currentStrategy.cacheSize * 0.8)); + this.currentStrategy.cacheSize = Math.max( + 100, + Math.floor(this.currentStrategy.cacheSize * 0.8), + ); this.trimCache(); strategyChanged = true; - this.logger.log(`Reduced cache size to ${this.currentStrategy.cacheSize} due to high memory usage`); + this.logger.log( + `Reduced cache size to ${this.currentStrategy.cacheSize} due to high memory usage`, + ); } - } else if (avgMetrics.memoryUsage < 512 && this.currentStrategy.cacheSize < 5000) { - this.currentStrategy.cacheSize = Math.min(5000, Math.floor(this.currentStrategy.cacheSize * 1.2)); + } else if ( + avgMetrics.memoryUsage < 512 && + this.currentStrategy.cacheSize < 5000 + ) { + this.currentStrategy.cacheSize = Math.min( + 5000, + Math.floor(this.currentStrategy.cacheSize * 1.2), + ); strategyChanged = true; - this.logger.log(`Increased cache size to ${this.currentStrategy.cacheSize} to improve performance`); + this.logger.log( + `Increased cache size to ${this.currentStrategy.cacheSize} to improve performance`, + ); } if (strategyChanged) { @@ -182,33 +230,36 @@ export class PerformanceOptimizer { calculateOptimalBatchSize(ledgerCount: number): number { const baseBatchSize = this.currentStrategy.batchSize; - + // Adjust based on ledger count if (ledgerCount < 50) { return Math.min(ledgerCount, baseBatchSize); } else if (ledgerCount > 1000) { return Math.min(baseBatchSize * 2, 500); } - + return baseBatchSize; } async optimizeBatchProcessing(transactions: any[]): Promise { const startTime = Date.now(); - + try { // Apply caching const cachedTransactions = await this.applyCaching(transactions); - + // Apply parallel processing - const processedTransactions = await this.processInParallel(cachedTransactions); - + const processedTransactions = + await this.processInParallel(cachedTransactions); + // Apply deduplication - const deduplicatedTransactions = this.deduplicateTransactions(processedTransactions); - + const deduplicatedTransactions = this.deduplicateTransactions( + processedTransactions, + ); + const processingTime = Date.now() - startTime; this.updateBatchProcessingMetrics(processingTime, transactions.length); - + return deduplicatedTransactions; } catch (error) { this.logger.error('Error in batch processing optimization', error); @@ -222,7 +273,7 @@ export class PerformanceOptimizer { for (const tx of transactions) { const cacheKey = this.generateCacheKey(tx); - + if (this.cache.has(cacheKey)) { cachedResults.push(this.cache.get(cacheKey)); } else { @@ -231,14 +282,15 @@ export class PerformanceOptimizer { } // Process uncached transactions - const processedUncached = await this.processTransactions(uncachedTransactions); - + const processedUncached = + await this.processTransactions(uncachedTransactions); + // Cache results for (let i = 0; i < uncachedTransactions.length; i++) { const tx = uncachedTransactions[i]; const result = processedUncached[i]; const cacheKey = this.generateCacheKey(tx); - + this.cache.set(cacheKey, result); } @@ -246,22 +298,24 @@ export class PerformanceOptimizer { } private async processInParallel(transactions: any[]): Promise { - const chunkSize = Math.ceil(transactions.length / this.currentStrategy.parallelism); + const chunkSize = Math.ceil( + transactions.length / this.currentStrategy.parallelism, + ); const chunks = []; - + for (let i = 0; i < transactions.length; i += chunkSize) { chunks.push(transactions.slice(i, i + chunkSize)); } - const promises = chunks.map(chunk => this.processTransactions(chunk)); + const promises = chunks.map((chunk) => this.processTransactions(chunk)); const results = await Promise.all(promises); - + return results.flat(); } private async processTransactions(transactions: any[]): Promise { // Placeholder for actual transaction processing - return transactions.map(tx => ({ + return transactions.map((tx) => ({ ...tx, processed: true, timestamp: new Date(), @@ -270,7 +324,7 @@ export class PerformanceOptimizer { private deduplicateTransactions(transactions: any[]): any[] { const seen = new Set(); - return transactions.filter(tx => { + return transactions.filter((tx) => { const key = tx.id || tx.hash; if (seen.has(key)) { return false; @@ -291,14 +345,20 @@ export class PerformanceOptimizer { // Remove oldest entries (simple LRU) const entries = Array.from(this.cache.entries()); - const toRemove = entries.slice(0, entries.length - this.currentStrategy.cacheSize); - + const toRemove = entries.slice( + 0, + entries.length - this.currentStrategy.cacheSize, + ); + for (const [key] of toRemove) { this.cache.delete(key); } } - private updateBatchProcessingMetrics(processingTime: number, transactionCount: number): void { + private updateBatchProcessingMetrics( + processingTime: number, + transactionCount: number, + ): void { // Update metrics for performance tracking const metrics: PerformanceMetrics = { batchProcessingTime: processingTime, @@ -313,24 +373,31 @@ export class PerformanceOptimizer { this.metricsHistory.push(metrics); } - private calculateAverageMetrics(metrics: PerformanceMetrics[]): PerformanceMetrics { - const sum = metrics.reduce((acc, metric) => ({ - batchProcessingTime: acc.batchProcessingTime + metric.batchProcessingTime, - transactionProcessingTime: acc.transactionProcessingTime + metric.transactionProcessingTime, - memoryUsage: acc.memoryUsage + metric.memoryUsage, - cpuUsage: acc.cpuUsage + metric.cpuUsage, - throughput: acc.throughput + metric.throughput, - latency: acc.latency + metric.latency, - errorRate: acc.errorRate + metric.errorRate, - }), { - batchProcessingTime: 0, - transactionProcessingTime: 0, - memoryUsage: 0, - cpuUsage: 0, - throughput: 0, - latency: 0, - errorRate: 0, - }); + private calculateAverageMetrics( + metrics: PerformanceMetrics[], + ): PerformanceMetrics { + const sum = metrics.reduce( + (acc, metric) => ({ + batchProcessingTime: + acc.batchProcessingTime + metric.batchProcessingTime, + transactionProcessingTime: + acc.transactionProcessingTime + metric.transactionProcessingTime, + memoryUsage: acc.memoryUsage + metric.memoryUsage, + cpuUsage: acc.cpuUsage + metric.cpuUsage, + throughput: acc.throughput + metric.throughput, + latency: acc.latency + metric.latency, + errorRate: acc.errorRate + metric.errorRate, + }), + { + batchProcessingTime: 0, + transactionProcessingTime: 0, + memoryUsage: 0, + cpuUsage: 0, + throughput: 0, + latency: 0, + errorRate: 0, + }, + ); const count = metrics.length; return { @@ -358,23 +425,29 @@ export class PerformanceOptimizer { private generateRecommendations(issues: string[]): string[] { const recommendations: string[] = []; - if (issues.some(issue => issue.includes('latency'))) { - recommendations.push('Consider reducing batch size or increasing parallelism'); + if (issues.some((issue) => issue.includes('latency'))) { + recommendations.push( + 'Consider reducing batch size or increasing parallelism', + ); } - if (issues.some(issue => issue.includes('throughput'))) { + if (issues.some((issue) => issue.includes('throughput'))) { recommendations.push('Consider increasing batch size or parallelism'); } - if (issues.some(issue => issue.includes('memory'))) { - recommendations.push('Consider reducing cache size or implementing memory-efficient algorithms'); + if (issues.some((issue) => issue.includes('memory'))) { + recommendations.push( + 'Consider reducing cache size or implementing memory-efficient algorithms', + ); } - if (issues.some(issue => issue.includes('CPU'))) { - recommendations.push('Consider reducing parallelism or optimizing CPU-intensive operations'); + if (issues.some((issue) => issue.includes('CPU'))) { + recommendations.push( + 'Consider reducing parallelism or optimizing CPU-intensive operations', + ); } - if (issues.some(issue => issue.includes('error rate'))) { + if (issues.some((issue) => issue.includes('error rate'))) { recommendations.push('Review error handling and increase retry attempts'); } @@ -385,13 +458,18 @@ export class PerformanceOptimizer { private getAverageBatchProcessingTime(): number { if (this.metricsHistory.length === 0) return 0; const recent = this.metricsHistory.slice(-10); - return recent.reduce((sum, m) => sum + m.batchProcessingTime, 0) / recent.length; + return ( + recent.reduce((sum, m) => sum + m.batchProcessingTime, 0) / recent.length + ); } private getAverageTransactionProcessingTime(): number { if (this.metricsHistory.length === 0) return 0; const recent = this.metricsHistory.slice(-10); - return recent.reduce((sum, m) => sum + m.transactionProcessingTime, 0) / recent.length; + return ( + recent.reduce((sum, m) => sum + m.transactionProcessingTime, 0) / + recent.length + ); } private getMemoryUsage(): number { @@ -428,15 +506,17 @@ export class PerformanceOptimizer { } getPerformanceMetrics(): PerformanceMetrics { - return this.metricsHistory[this.metricsHistory.length - 1] || { - batchProcessingTime: 0, - transactionProcessingTime: 0, - memoryUsage: 0, - cpuUsage: 0, - throughput: 0, - latency: 0, - errorRate: 0, - }; + return ( + this.metricsHistory[this.metricsHistory.length - 1] || { + batchProcessingTime: 0, + transactionProcessingTime: 0, + memoryUsage: 0, + cpuUsage: 0, + throughput: 0, + latency: 0, + errorRate: 0, + } + ); } updateStrategy(newStrategy: Partial): void { diff --git a/src/sync/recovery/recovery.service.ts b/src/sync/recovery/recovery.service.ts index 79d2e40..9560668 100644 --- a/src/sync/recovery/recovery.service.ts +++ b/src/sync/recovery/recovery.service.ts @@ -8,7 +8,11 @@ import { takeWhile, switchMap, catchError } from 'rxjs/operators'; import { SyncState, SyncStatus, SyncType } from '../entities/sync-state.entity'; export interface RecoveryEvent { - type: 'recovery_started' | 'recovery_progress' | 'recovery_completed' | 'recovery_failed'; + type: + | 'recovery_started' + | 'recovery_progress' + | 'recovery_completed' + | 'recovery_failed'; timestamp: Date; entityType: string; entityId: string; @@ -27,7 +31,11 @@ export interface RecoveryMetrics { } export interface RecoveryStrategy { - type: 'full_sync' | 'incremental_sync' | 'checkpoint_restore' | 'manual_intervention'; + type: + | 'full_sync' + | 'incremental_sync' + | 'checkpoint_restore' + | 'manual_intervention'; priority: 'low' | 'medium' | 'high' | 'critical'; estimatedDuration: number; dataLossRisk: 'none' | 'low' | 'medium' | 'high'; @@ -60,7 +68,7 @@ export class RecoveryService { async initiateRecovery(syncState: SyncState | null): Promise { this.logger.log('Initiating recovery process'); - + const recoveryStartTime = Date.now(); this.isRecovering.next(true); @@ -74,11 +82,13 @@ export class RecoveryService { const recoveryDuration = Date.now() - recoveryStartTime; await this.updateRecoveryMetrics(true, recoveryDuration); - this.logger.log(`Recovery completed successfully in ${recoveryDuration}ms`); + this.logger.log( + `Recovery completed successfully in ${recoveryDuration}ms`, + ); } catch (error) { const recoveryDuration = Date.now() - recoveryStartTime; await this.updateRecoveryMetrics(false, recoveryDuration); - + this.logger.error('Recovery failed', error); throw error; } finally { @@ -101,16 +111,19 @@ export class RecoveryService { try { await this.recoverSingleEntity(syncState); } catch (error) { - this.logger.error(`Failed to recover ${syncState.entityType}:${syncState.entityId}`, error); + this.logger.error( + `Failed to recover ${syncState.entityType}:${syncState.entityId}`, + error, + ); } } } private async recoverSingleEntity(syncState: SyncState): Promise { const recoveryId = `${syncState.entityType}:${syncState.entityId}`; - + this.logger.log(`Starting recovery for ${recoveryId}`); - + this.recoveryEvents.next({ type: 'recovery_started', timestamp: new Date(), @@ -155,7 +168,6 @@ export class RecoveryService { }); this.activeRecoveries.delete(recoveryId); - } catch (error) { syncState.status = SyncStatus.ERROR; syncState.errorMessage = error.message; @@ -174,10 +186,12 @@ export class RecoveryService { } } - private async determineRecoveryStrategy(syncState: SyncState): Promise { + private async determineRecoveryStrategy( + syncState: SyncState, + ): Promise { const currentLedger = await this.getCurrentLedgerSequence(); const ledgerGap = currentLedger - syncState.lastLedgerSequence; - const timeSinceLastSync = syncState.lastSuccessfulSyncAt + const timeSinceLastSync = syncState.lastSuccessfulSyncAt ? Date.now() - syncState.lastSuccessfulSyncAt.getTime() : Infinity; @@ -200,7 +214,8 @@ export class RecoveryService { }; } - if (ledgerGap > 1000 || timeSinceLastSync > 3600000) { // 1 hour + if (ledgerGap > 1000 || timeSinceLastSync > 3600000) { + // 1 hour return { type: 'full_sync', priority: 'medium', @@ -218,14 +233,16 @@ export class RecoveryService { } private async performFullSync(syncState: SyncState): Promise { - this.logger.log(`Performing full sync for ${syncState.entityType}:${syncState.entityId}`); + this.logger.log( + `Performing full sync for ${syncState.entityType}:${syncState.entityId}`, + ); syncState.status = SyncStatus.RECOVERING; syncState.syncType = SyncType.FULL; await this.syncStateRepository.save(syncState); const currentLedger = await this.getCurrentLedgerSequence(); - + // Reset to a safe starting point syncState.lastLedgerSequence = Math.max(0, currentLedger - 1000); syncState.targetLedgerSequence = currentLedger; @@ -233,17 +250,24 @@ export class RecoveryService { // Process in batches const batchSize = 100; - for (let sequence = syncState.lastLedgerSequence; sequence <= currentLedger; sequence += batchSize) { + for ( + let sequence = syncState.lastLedgerSequence; + sequence <= currentLedger; + sequence += batchSize + ) { const endSequence = Math.min(sequence + batchSize - 1, currentLedger); - + try { await this.processLedgerBatch(syncState, sequence, endSequence); - + syncState.lastLedgerSequence = endSequence; await this.syncStateRepository.save(syncState); // Report progress - const progress = ((endSequence - syncState.lastLedgerSequence + 1000) / (currentLedger - 1000 + 1)) * 100; + const progress = + ((endSequence - syncState.lastLedgerSequence + 1000) / + (currentLedger - 1000 + 1)) * + 100; this.recoveryEvents.next({ type: 'recovery_progress', timestamp: new Date(), @@ -251,16 +275,20 @@ export class RecoveryService { entityId: syncState.entityId, progress: Math.round(progress), }); - } catch (error) { - this.logger.error(`Failed to process batch ${sequence}-${endSequence}`, error); + this.logger.error( + `Failed to process batch ${sequence}-${endSequence}`, + error, + ); throw error; } } } private async performIncrementalSync(syncState: SyncState): Promise { - this.logger.log(`Performing incremental sync for ${syncState.entityType}:${syncState.entityId}`); + this.logger.log( + `Performing incremental sync for ${syncState.entityType}:${syncState.entityId}`, + ); syncState.status = SyncStatus.RECOVERING; syncState.syncType = SyncType.INCREMENTAL; @@ -268,20 +296,22 @@ export class RecoveryService { const currentLedger = await this.getCurrentLedgerSequence(); const startSequence = syncState.lastLedgerSequence + 1; - + // Process missed ledgers await this.processLedgerBatch(syncState, startSequence, currentLedger); - + syncState.lastLedgerSequence = currentLedger; await this.syncStateRepository.save(syncState); } private async performCheckpointRestore(syncState: SyncState): Promise { - this.logger.log(`Performing checkpoint restore for ${syncState.entityType}:${syncState.entityId}`); + this.logger.log( + `Performing checkpoint restore for ${syncState.entityType}:${syncState.entityId}`, + ); // Find the last known good checkpoint const checkpoint = await this.findLastGoodCheckpoint(syncState); - + if (!checkpoint) { throw new Error('No valid checkpoint found for restore'); } @@ -297,25 +327,32 @@ export class RecoveryService { } private async requestManualIntervention(syncState: SyncState): Promise { - this.logger.error(`Manual intervention required for ${syncState.entityType}:${syncState.entityId}`); - + this.logger.error( + `Manual intervention required for ${syncState.entityType}:${syncState.entityId}`, + ); + // Create incident ticket await this.createIncidentTicket(syncState); - + // Send alert await this.sendAlert(syncState); - + // Mark as awaiting manual intervention syncState.status = SyncStatus.ERROR; syncState.errorMessage = 'Manual intervention required'; await this.syncStateRepository.save(syncState); } - private async processLedgerBatch(syncState: SyncState, startSequence: number, endSequence: number): Promise { + private async processLedgerBatch( + syncState: SyncState, + startSequence: number, + endSequence: number, + ): Promise { for (let sequence = startSequence; sequence <= endSequence; sequence++) { try { const ledger = await this.server.ledgers().ledger(sequence).call(); - const transactions = await this.server.transactions() + const transactions = await this.server + .transactions() .forLedger(sequence) .order('asc') .limit(100) @@ -325,7 +362,6 @@ export class RecoveryService { for (const tx of transactions.records) { await this.processTransactionForRecovery(tx, syncState); } - } catch (error) { this.logger.error(`Failed to process ledger ${sequence}`, error); throw error; @@ -333,20 +369,25 @@ export class RecoveryService { } } - private async processTransactionForRecovery(tx: any, syncState: SyncState): Promise { + private async processTransactionForRecovery( + tx: any, + syncState: SyncState, + ): Promise { // Implement transaction processing logic for recovery // This would be similar to the normal sync processing but with additional validation try { // Validate transaction await this.validateTransaction(tx); - + // Apply transaction await this.applyTransactionForRecovery(tx); - + syncState.transactionsProcessed++; - } catch (error) { - this.logger.error(`Failed to process transaction ${tx.id} during recovery`, error); + this.logger.error( + `Failed to process transaction ${tx.id} during recovery`, + error, + ); throw error; } } @@ -356,7 +397,7 @@ export class RecoveryService { if (!tx.id || !tx.hash) { throw new Error('Invalid transaction structure'); } - + // Additional validation logic here } @@ -365,12 +406,14 @@ export class RecoveryService { // This would update your database based on the transaction } - private async findLastGoodCheckpoint(syncState: SyncState): Promise<{ ledgerSequence: number; timestamp: Date } | null> { + private async findLastGoodCheckpoint( + syncState: SyncState, + ): Promise<{ ledgerSequence: number; timestamp: Date } | null> { // This would query your checkpoints table for the last known good state // For now, return a simple checkpoint based on time const oneHourAgo = new Date(Date.now() - 3600000); const currentLedger = await this.getCurrentLedgerSequence(); - + return { ledgerSequence: Math.max(0, currentLedger - 3600), // Approximate 1 hour of ledgers timestamp: oneHourAgo, @@ -379,17 +422,25 @@ export class RecoveryService { private async createIncidentTicket(syncState: SyncState): Promise { // Create incident in your incident management system - this.logger.error(`Incident created for ${syncState.entityType}:${syncState.entityId}`); + this.logger.error( + `Incident created for ${syncState.entityType}:${syncState.entityId}`, + ); } private async sendAlert(syncState: SyncState): Promise { // Send alert to monitoring system - this.logger.error(`Alert sent for ${syncState.entityType}:${syncState.entityId}`); + this.logger.error( + `Alert sent for ${syncState.entityType}:${syncState.entityId}`, + ); } private async getCurrentLedgerSequence(): Promise { try { - const latestLedger = await this.server.ledgers().order('desc').limit(1).call(); + const latestLedger = await this.server + .ledgers() + .order('desc') + .limit(1) + .call(); return latestLedger.records[0]?.sequence || 0; } catch (error) { this.logger.error('Failed to get current ledger sequence', error); @@ -397,13 +448,20 @@ export class RecoveryService { } } - private async updateRecoveryMetrics(success: boolean, duration: number): Promise { + private async updateRecoveryMetrics( + success: boolean, + duration: number, + ): Promise { const currentMetrics = this.metrics.value; const newMetrics = { ...currentMetrics, totalRecoveries: currentMetrics.totalRecoveries + 1, - successfulRecoveries: success ? currentMetrics.successfulRecoveries + 1 : currentMetrics.successfulRecoveries, - failedRecoveries: !success ? currentMetrics.failedRecoveries + 1 : currentMetrics.failedRecoveries, + successfulRecoveries: success + ? currentMetrics.successfulRecoveries + 1 + : currentMetrics.successfulRecoveries, + failedRecoveries: !success + ? currentMetrics.failedRecoveries + 1 + : currentMetrics.failedRecoveries, averageRecoveryTime: (currentMetrics.averageRecoveryTime + duration) / 2, lastRecoveryTime: new Date(), }; @@ -430,20 +488,20 @@ export class RecoveryService { async cancelRecovery(entityType: string, entityId: string): Promise { const recoveryId = `${entityType}:${entityId}`; - + if (this.activeRecoveries.has(recoveryId)) { this.activeRecoveries.delete(recoveryId); - + const syncState = await this.syncStateRepository.findOne({ where: { entityType, entityId }, }); - + if (syncState) { syncState.status = SyncStatus.ERROR; syncState.errorMessage = 'Recovery cancelled'; await this.syncStateRepository.save(syncState); } - + this.logger.log(`Recovery cancelled for ${recoveryId}`); } } @@ -453,7 +511,7 @@ export class RecoveryService { const syncState = await this.syncStateRepository.findOne({ where: { entityType, entityId }, }); - + if (syncState) { await this.initiateRecovery(syncState); } @@ -468,12 +526,12 @@ export class RecoveryService { async testRecoveryProcedures(): Promise { this.logger.log('Testing recovery procedures'); - + // Create a test sync state with error status const testSyncState = await this.syncStateRepository.findOne({ where: { entityType: 'test', entityId: 'recovery_test' }, }); - + if (!testSyncState) { // Create test state if it doesn't exist const newState = this.syncStateRepository.create({ @@ -485,7 +543,7 @@ export class RecoveryService { errorMessage: 'Test error for recovery', }); await this.syncStateRepository.save(newState); - + await this.initiateRecovery(newState); } } diff --git a/src/sync/resolvers/conflict.resolver.ts b/src/sync/resolvers/conflict.resolver.ts index 37149de..8a6c6c4 100644 --- a/src/sync/resolvers/conflict.resolver.ts +++ b/src/sync/resolvers/conflict.resolver.ts @@ -5,7 +5,11 @@ import { Horizon } from '@stellar/stellar-sdk'; import { SyncState, SyncStatus } from '../entities/sync-state.entity'; export interface Conflict { - type: 'double_spend' | 'state_mismatch' | 'sequence_conflict' | 'balance_mismatch'; + type: + | 'double_spend' + | 'state_mismatch' + | 'sequence_conflict' + | 'balance_mismatch'; severity: 'low' | 'medium' | 'high' | 'critical'; description: string; onChainData: any; @@ -28,7 +32,7 @@ export enum ConflictResolutionStrategy { MERGE = 'merge', MANUAL_REVIEW = 'manual_review', ROLLBACK = 'rollback', - IGNORE = 'ignore' + IGNORE = 'ignore', } @Injectable() @@ -43,10 +47,12 @@ export class ConflictResolver { private dataSource: DataSource, ) {} - async detectConflict(transaction: Horizon.BaseResponse): Promise { + async detectConflict( + transaction: Horizon.BaseResponse, + ): Promise { try { const txHash = transaction.hash; - + // Check cache first if (this.conflictCache.has(txHash)) { return this.conflictCache.get(txHash); @@ -60,8 +66,8 @@ export class ConflictResolver { this.detectBalanceMismatch(transaction), ]); - const conflict = conflicts.find(c => c !== null); - + const conflict = conflicts.find((c) => c !== null); + if (conflict) { this.conflictCache.set(txHash, conflict); await this.logConflict(conflict); @@ -69,29 +75,40 @@ export class ConflictResolver { return conflict; } catch (error) { - this.logger.error(`Error detecting conflict for transaction ${transaction.hash}`, error); + this.logger.error( + `Error detecting conflict for transaction ${transaction.hash}`, + error, + ); return null; } } - private async detectDoubleSpend(transaction: Horizon.BaseResponse): Promise { + private async detectDoubleSpend( + transaction: Horizon.BaseResponse, + ): Promise { const operations = transaction.operations; - + for (const op of operations) { if (op.type === 'payment' || op.type === 'path_payment') { const sourceAccount = op.source || transaction.source_account; - + // Check if this account has other unconfirmed transactions const pendingTxs = await this.findPendingTransactions(sourceAccount); - + for (const pendingTx of pendingTxs) { if (this.hasOverlappingOperations(op, pendingTx.operations)) { return { type: 'double_spend', severity: 'critical', description: `Double spend detected between transactions ${transaction.hash} and ${pendingTx.hash}`, - onChainData: { hash: transaction.hash, operations: operations.length }, - offChainData: { hash: pendingTx.hash, operations: pendingTx.operations.length }, + onChainData: { + hash: transaction.hash, + operations: operations.length, + }, + offChainData: { + hash: pendingTx.hash, + operations: pendingTx.operations.length, + }, affectedAccounts: [sourceAccount], resolutionStrategy: ConflictResolutionStrategy.PREFER_ON_CHAIN, }; @@ -103,26 +120,36 @@ export class ConflictResolver { return null; } - private async detectStateMismatch(transaction: Horizon.BaseResponse): Promise { + private async detectStateMismatch( + transaction: Horizon.BaseResponse, + ): Promise { try { // Check if the on-chain state matches our off-chain state const sourceAccount = transaction.source_account; - + const onChainAccount = await this.getOnChainAccount(sourceAccount); const offChainAccount = await this.getOffChainAccount(sourceAccount); if (onChainAccount && offChainAccount) { - const balanceMismatch = Math.abs( - parseFloat(onChainAccount.balance) - parseFloat(offChainAccount.balance) - ) > 0.0000001; // Account for Stellar precision + const balanceMismatch = + Math.abs( + parseFloat(onChainAccount.balance) - + parseFloat(offChainAccount.balance), + ) > 0.0000001; // Account for Stellar precision if (balanceMismatch) { return { type: 'state_mismatch', severity: 'high', description: `Balance mismatch for account ${sourceAccount}: on-chain=${onChainAccount.balance}, off-chain=${offChainAccount.balance}`, - onChainData: { balance: onChainAccount.balance, sequence: onChainAccount.sequence }, - offChainData: { balance: offChainAccount.balance, sequence: offChainAccount.sequence }, + onChainData: { + balance: onChainAccount.balance, + sequence: onChainAccount.sequence, + }, + offChainData: { + balance: offChainAccount.balance, + sequence: offChainAccount.sequence, + }, affectedAccounts: [sourceAccount], resolutionStrategy: ConflictResolutionStrategy.PREFER_ON_CHAIN, }; @@ -135,7 +162,9 @@ export class ConflictResolver { return null; } - private async detectSequenceConflict(transaction: Horizon.BaseResponse): Promise { + private async detectSequenceConflict( + transaction: Horizon.BaseResponse, + ): Promise { try { const sourceAccount = transaction.source_account; const txSequence = transaction.source_account_sequence; @@ -167,26 +196,35 @@ export class ConflictResolver { return null; } - private async detectBalanceMismatch(transaction: Horizon.BaseResponse): Promise { + private async detectBalanceMismatch( + transaction: Horizon.BaseResponse, + ): Promise { try { const operations = transaction.operations; - + for (const op of operations) { if (op.type === 'payment') { const destination = op.destination; const amount = parseFloat(op.amount); // Verify the payment can be processed - const onChainAccount = await this.getOnChainAccount(transaction.source_account); + const onChainAccount = await this.getOnChainAccount( + transaction.source_account, + ); if (onChainAccount) { - const availableBalance = parseFloat(onChainAccount.balance) - parseFloat(onChainAccount.selling_liabilities); - + const availableBalance = + parseFloat(onChainAccount.balance) - + parseFloat(onChainAccount.selling_liabilities); + if (availableBalance < amount) { return { type: 'balance_mismatch', severity: 'high', description: `Insufficient balance for payment: available=${availableBalance}, required=${amount}`, - onChainData: { balance: onChainAccount.balance, liabilities: onChainAccount.selling_liabilities }, + onChainData: { + balance: onChainAccount.balance, + liabilities: onChainAccount.selling_liabilities, + }, offChainData: { payment_amount: amount }, affectedAccounts: [transaction.source_account, destination], resolutionStrategy: ConflictResolutionStrategy.IGNORE, @@ -202,9 +240,12 @@ export class ConflictResolver { return null; } - async resolveConflict(transaction: Horizon.BaseResponse, conflict: Conflict): Promise { + async resolveConflict( + transaction: Horizon.BaseResponse, + conflict: Conflict, + ): Promise { const resolutionId = `${transaction.hash}_${Date.now()}`; - + try { let resolution: any; let resolvedBy: 'automatic' | 'manual' = 'automatic'; @@ -236,12 +277,14 @@ export class ConflictResolver { break; default: - throw new Error(`Unknown resolution strategy: ${conflict.resolutionStrategy}`); + throw new Error( + `Unknown resolution strategy: ${conflict.resolutionStrategy}`, + ); } const conflictResolution: ConflictResolution = { conflictId: resolutionId, - strategy: conflict.resolutionStrategy!, + strategy: conflict.resolutionStrategy, resolution, timestamp: new Date(), resolvedBy, @@ -255,12 +298,18 @@ export class ConflictResolver { return resolution; } catch (error) { - this.logger.error(`Error resolving conflict for transaction ${transaction.hash}`, error); + this.logger.error( + `Error resolving conflict for transaction ${transaction.hash}`, + error, + ); throw error; } } - private async resolvePreferOnChain(transaction: Horizon.BaseResponse, conflict: Conflict): Promise { + private async resolvePreferOnChain( + transaction: Horizon.BaseResponse, + conflict: Conflict, + ): Promise { // Update off-chain state to match on-chain state for (const account of conflict.affectedAccounts) { const onChainAccount = await this.getOnChainAccount(account); @@ -279,7 +328,10 @@ export class ConflictResolver { }; } - private async resolvePreferOffChain(transaction: Horizon.BaseResponse, conflict: Conflict): Promise { + private async resolvePreferOffChain( + transaction: Horizon.BaseResponse, + conflict: Conflict, + ): Promise { // In this case, we might need to create a corrective transaction // For now, we'll just log and continue with off-chain state return { @@ -289,10 +341,13 @@ export class ConflictResolver { }; } - private async resolveMerge(transaction: Horizon.BaseResponse, conflict: Conflict): Promise { + private async resolveMerge( + transaction: Horizon.BaseResponse, + conflict: Conflict, + ): Promise { // Attempt to merge states by applying only non-conflicting operations const validOperations = []; - + for (const op of transaction.operations) { if (await this.isOperationValid(op, conflict)) { validOperations.push(op); @@ -307,7 +362,10 @@ export class ConflictResolver { }; } - private async resolveRollback(transaction: Horizon.BaseResponse, conflict: Conflict): Promise { + private async resolveRollback( + transaction: Horizon.BaseResponse, + conflict: Conflict, + ): Promise { // Rollback any changes made by this transaction return { action: 'rolled_back', @@ -316,7 +374,10 @@ export class ConflictResolver { }; } - private async resolveIgnore(transaction: Horizon.BaseResponse, conflict: Conflict): Promise { + private async resolveIgnore( + transaction: Horizon.BaseResponse, + conflict: Conflict, + ): Promise { // Simply ignore the conflict and continue return { action: 'ignored', @@ -325,10 +386,13 @@ export class ConflictResolver { }; } - private async resolveManualReview(transaction: Horizon.BaseResponse, conflict: Conflict): Promise { + private async resolveManualReview( + transaction: Horizon.BaseResponse, + conflict: Conflict, + ): Promise { // Flag for manual review await this.flagForManualReview(transaction, conflict); - + return { action: 'flagged_for_manual_review', transaction: transaction.hash, @@ -337,12 +401,15 @@ export class ConflictResolver { }; } - private async isOperationValid(operation: any, conflict: Conflict): Promise { + private async isOperationValid( + operation: any, + conflict: Conflict, + ): Promise { // Check if operation doesn't conflict with current state if (conflict.type === 'balance_mismatch' && operation.type === 'payment') { return false; } - + return true; } @@ -355,7 +422,10 @@ export class ConflictResolver { private hasOverlappingOperations(op1: any, ops2: any[]): boolean { // Check if operations overlap (e.g., same source account) for (const op2 of ops2) { - if ((op1.source || op1.source_account) === (op2.source || op2.source_account)) { + if ( + (op1.source || op1.source_account) === + (op2.source || op2.source_account) + ) { return true; } } @@ -380,22 +450,32 @@ export class ConflictResolver { } } - private async updateOffChainAccount(accountId: string, updates: any): Promise { + private async updateOffChainAccount( + accountId: string, + updates: any, + ): Promise { // Update account in your database // Implementation depends on your schema } private async logConflict(conflict: Conflict): Promise { // Log conflict for monitoring and analysis - this.logger.warn(`Conflict detected: ${conflict.type} - ${conflict.description}`); + this.logger.warn( + `Conflict detected: ${conflict.type} - ${conflict.description}`, + ); } private async logResolution(resolution: ConflictResolution): Promise { // Log resolution for monitoring and analysis - this.logger.log(`Conflict resolved: ${resolution.conflictId} using ${resolution.strategy}`); + this.logger.log( + `Conflict resolved: ${resolution.conflictId} using ${resolution.strategy}`, + ); } - private async flagForManualReview(transaction: Horizon.BaseResponse, conflict: Conflict): Promise { + private async flagForManualReview( + transaction: Horizon.BaseResponse, + conflict: Conflict, + ): Promise { // Flag transaction for manual review // This could create a ticket, send notification, etc. } diff --git a/src/sync/sync.module.ts b/src/sync/sync.module.ts index 8082a56..57b8314 100644 --- a/src/sync/sync.module.ts +++ b/src/sync/sync.module.ts @@ -9,10 +9,7 @@ import { PerformanceOptimizer } from './optimizers/performance.optimizer'; import { RecoveryService } from './recovery/recovery.service'; @Module({ - imports: [ - TypeOrmModule.forFeature([SyncState]), - ScheduleModule.forRoot(), - ], + imports: [TypeOrmModule.forFeature([SyncState]), ScheduleModule.forRoot()], providers: [ SyncService, ConflictResolver, diff --git a/src/sync/sync.service.ts b/src/sync/sync.service.ts index 21ee844..6373f94 100644 --- a/src/sync/sync.service.ts +++ b/src/sync/sync.service.ts @@ -5,7 +5,13 @@ import { Repository, DataSource, LessThan, MoreThan } from 'typeorm'; import { Cron, CronExpression } from '@nestjs/schedule'; import { StellarSdk, Server, Horizon } from '@stellar/stellar-sdk'; import { Subject, BehaviorSubject, interval, from, lastValueFrom } from 'rxjs'; -import { switchMap, takeWhile, catchError, retry, debounceTime } from 'rxjs/operators'; +import { + switchMap, + takeWhile, + catchError, + retry, + debounceTime, +} from 'rxjs/operators'; import { SyncState, SyncStatus, SyncType } from '../entities/sync-state.entity'; import { ConflictResolver } from '../resolvers/conflict.resolver'; import { PartitionHandler } from '../handlers/partition.handler'; @@ -57,10 +63,10 @@ export class SyncService implements OnModuleInit { async onModuleInit() { const stellarConfig = this.configService.get('stellar'); this.server = new Server(stellarConfig.horizonUrl); - + await this.initializeSyncStates(); await this.startRealTimeSync(); - + this.logger.log('Sync service initialized'); } @@ -92,7 +98,11 @@ export class SyncService implements OnModuleInit { private async getCurrentLedgerSequence(): Promise { try { - const latestLedger = await this.server.ledgers().order('desc').limit(1).call(); + const latestLedger = await this.server + .ledgers() + .order('desc') + .limit(1) + .call(); return latestLedger.records[0]?.sequence || 0; } catch (error) { this.logger.error('Failed to get current ledger sequence', error); @@ -102,15 +112,15 @@ export class SyncService implements OnModuleInit { async startRealTimeSync() { this.logger.log('Starting real-time synchronization'); - + interval(5000) // Poll every 5 seconds for sub-5s latency .pipe( switchMap(() => from(this.syncLedger())), retry(3), - catchError(error => { + catchError((error) => { this.logger.error('Sync error, initiating recovery', error); return from(this.handleSyncError(error)); - }) + }), ) .subscribe(); @@ -118,9 +128,9 @@ export class SyncService implements OnModuleInit { interval(30000) // Check every 30 seconds .pipe( switchMap(() => from(this.detectNetworkPartition())), - debounceTime(5000) + debounceTime(5000), ) - .subscribe(isPartitioned => { + .subscribe((isPartitioned) => { if (isPartitioned) { this.handleNetworkPartition(); } @@ -143,13 +153,16 @@ export class SyncService implements OnModuleInit { for (const syncState of syncStates) { if (syncState.lastLedgerSequence < currentLedger) { - await this.processLedgerRange(syncState, syncState.lastLedgerSequence + 1, currentLedger); + await this.processLedgerRange( + syncState, + syncState.lastLedgerSequence + 1, + currentLedger, + ); } } const latency = Date.now() - startTime; this.updateMetrics(latency); - } catch (error) { this.logger.error('Ledger sync failed', error); throw error; @@ -158,18 +171,27 @@ export class SyncService implements OnModuleInit { } } - private async processLedgerRange(syncState: SyncState, startSequence: number, endSequence: number) { + private async processLedgerRange( + syncState: SyncState, + startSequence: number, + endSequence: number, + ) { syncState.status = SyncStatus.SYNCING; - syncState.syncType = startSequence === syncState.lastLedgerSequence + 1 ? SyncType.INCREMENTAL : SyncType.FULL; + syncState.syncType = + startSequence === syncState.lastLedgerSequence + 1 + ? SyncType.INCREMENTAL + : SyncType.FULL; await this.syncStateRepository.save(syncState); - const batchSize = this.performanceOptimizer.calculateOptimalBatchSize(endSequence - startSequence); + const batchSize = this.performanceOptimizer.calculateOptimalBatchSize( + endSequence - startSequence, + ); const batches = this.createBatches(startSequence, endSequence, batchSize); for (const batch of batches) { try { await this.processBatch(syncState, batch.start, batch.end); - + syncState.lastLedgerSequence = batch.end; syncState.lastSyncAt = new Date(); syncState.transactionsProcessed += batch.end - batch.start + 1; @@ -181,7 +203,6 @@ export class SyncService implements OnModuleInit { timestamp: new Date(), ledgerSequence: batch.end, }); - } catch (error) { await this.handleBatchError(syncState, error, batch); } @@ -203,13 +224,18 @@ export class SyncService implements OnModuleInit { return batches; } - private async processBatch(syncState: SyncState, startSequence: number, endSequence: number) { + private async processBatch( + syncState: SyncState, + startSequence: number, + endSequence: number, + ) { const transactions = []; - + for (let sequence = startSequence; sequence <= endSequence; sequence++) { try { const ledger = await this.server.ledgers().ledger(sequence).call(); - const txs = await this.server.transactions() + const txs = await this.server + .transactions() .forLedger(sequence) .order('asc') .limit(100) @@ -231,14 +257,17 @@ export class SyncService implements OnModuleInit { await this.performanceOptimizer.optimizeBatchProcessing(transactions); } - private async processTransaction(tx: Horizon.BaseResponse, syncState: SyncState) { + private async processTransaction( + tx: Horizon.BaseResponse, + syncState: SyncState, + ) { try { // Check for conflicts const conflict = await this.conflictResolver.detectConflict(tx); if (conflict) { syncState.conflictCount++; await this.syncStateRepository.save(syncState); - + this.syncEvents.next({ type: 'conflict', data: { transaction: tx.id, conflict }, @@ -250,7 +279,7 @@ export class SyncService implements OnModuleInit { // Process the transaction based on its type const processedTx = await this.applyTransaction(tx); - + this.syncEvents.next({ type: 'transaction', data: processedTx, @@ -266,7 +295,9 @@ export class SyncService implements OnModuleInit { } } - private async applyTransaction(tx: Horizon.BaseResponse) { + private async applyTransaction( + tx: Horizon.BaseResponse, + ) { // Implementation would depend on specific business logic // This is a placeholder for transaction processing return { @@ -277,7 +308,11 @@ export class SyncService implements OnModuleInit { }; } - private async handleBatchError(syncState: SyncState, error: any, batch: { start: number; end: number }) { + private async handleBatchError( + syncState: SyncState, + error: any, + batch: { start: number; end: number }, + ) { syncState.status = SyncStatus.ERROR; syncState.errorMessage = error.message; syncState.retryCount++; @@ -299,14 +334,15 @@ export class SyncService implements OnModuleInit { try { const currentLedger = await this.getCurrentLedgerSequence(); const syncStates = await this.syncStateRepository.find(); - + for (const syncState of syncStates) { const ledgerGap = currentLedger - syncState.lastLedgerSequence; - if (ledgerGap > 100) { // Consider partitioned if gap > 100 ledgers + if (ledgerGap > 100) { + // Consider partitioned if gap > 100 ledgers return true; } } - + return false; } catch (error) { this.logger.error('Failed to detect network partition', error); @@ -316,7 +352,7 @@ export class SyncService implements OnModuleInit { private async handleNetworkPartition() { this.logger.warn('Network partition detected'); - + const syncStates = await this.syncStateRepository.find(); for (const syncState of syncStates) { syncState.status = SyncStatus.PARTITIONED; @@ -337,9 +373,10 @@ export class SyncService implements OnModuleInit { const newMetrics = { ...currentMetrics, averageLatency: (currentMetrics.averageLatency + latency) / 2, - throughput: currentMetrics.processedTransactions > 0 - ? (currentMetrics.processedTransactions * 1000) / latency - : 0, + throughput: + currentMetrics.processedTransactions > 0 + ? (currentMetrics.processedTransactions * 1000) / latency + : 0, }; this.metrics.next(newMetrics); } @@ -364,12 +401,12 @@ export class SyncService implements OnModuleInit { } async triggerFullSync(entityType?: string, entityId?: string) { - const whereClause = entityType && entityId - ? { entityType, entityId } - : {}; + const whereClause = entityType && entityId ? { entityType, entityId } : {}; + + const syncStates = await this.syncStateRepository.find({ + where: whereClause, + }); - const syncStates = await this.syncStateRepository.find({ where: whereClause }); - for (const syncState of syncStates) { syncState.status = SyncStatus.IDLE; syncState.lastLedgerSequence = 0; // Force full sync diff --git a/src/webhooks/auth/hmac.auth.ts b/src/webhooks/auth/hmac.auth.ts index 598dfbd..6ac00b8 100644 --- a/src/webhooks/auth/hmac.auth.ts +++ b/src/webhooks/auth/hmac.auth.ts @@ -14,7 +14,7 @@ export class HmacAuthService { const expectedSignature = this.generateSignature(payload, secret); return crypto.timingSafeEqual( Buffer.from(signature, 'hex'), - Buffer.from(expectedSignature, 'hex') + Buffer.from(expectedSignature, 'hex'), ); } @@ -27,15 +27,18 @@ export class HmacAuthService { return timestamp > now - maxAgeSeconds && timestamp <= now; } - signWebhook(payload: any, secret: string): { signature: string; timestamp: number } { + signWebhook( + payload: any, + secret: string, + ): { signature: string; timestamp: number } { const payloadString = JSON.stringify(payload); const timestamp = this.generateTimestamp(); const signedPayload = `${payloadString}.${timestamp}`; const signature = this.generateSignature(signedPayload, secret); - + return { signature, - timestamp + timestamp, }; } } diff --git a/src/webhooks/dto/webhook.dto.ts b/src/webhooks/dto/webhook.dto.ts index c929464..01bfa3a 100644 --- a/src/webhooks/dto/webhook.dto.ts +++ b/src/webhooks/dto/webhook.dto.ts @@ -1,4 +1,14 @@ -import { IsString, IsArray, IsOptional, IsBoolean, IsNumber, IsObject, IsUrl, Min, Max } from 'class-validator'; +import { + IsString, + IsArray, + IsOptional, + IsBoolean, + IsNumber, + IsObject, + IsUrl, + Min, + Max, +} from 'class-validator'; import { Type } from 'class-transformer'; export class CreateWebhookDto { diff --git a/src/webhooks/entities/webhook-delivery.entity.ts b/src/webhooks/entities/webhook-delivery.entity.ts index 677ce4f..defdf44 100644 --- a/src/webhooks/entities/webhook-delivery.entity.ts +++ b/src/webhooks/entities/webhook-delivery.entity.ts @@ -1,11 +1,18 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + ManyToOne, + JoinColumn, +} from 'typeorm'; import { Webhook } from './webhook.entity'; export enum DeliveryStatus { PENDING = 'pending', SUCCESS = 'success', FAILED = 'failed', - RETRYING = 'retrying' + RETRYING = 'retrying', } @Entity('webhook_deliveries') @@ -13,7 +20,7 @@ export class WebhookDelivery { @PrimaryGeneratedColumn('uuid') id: string; - @ManyToOne(() => Webhook, webhook => webhook.deliveries) + @ManyToOne(() => Webhook, (webhook) => webhook.deliveries) @JoinColumn({ name: 'webhook_id' }) webhook: Webhook; @@ -29,7 +36,7 @@ export class WebhookDelivery { @Column({ type: 'enum', enum: DeliveryStatus, - default: DeliveryStatus.PENDING + default: DeliveryStatus.PENDING, }) status: DeliveryStatus; diff --git a/src/webhooks/entities/webhook.entity.ts b/src/webhooks/entities/webhook.entity.ts index 17b0c73..e19b778 100644 --- a/src/webhooks/entities/webhook.entity.ts +++ b/src/webhooks/entities/webhook.entity.ts @@ -1,4 +1,11 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + OneToMany, +} from 'typeorm'; import { WebhookDelivery } from './webhook-delivery.entity'; @Entity('webhooks') @@ -39,6 +46,6 @@ export class Webhook { @UpdateDateColumn() updatedAt: Date; - @OneToMany(() => WebhookDelivery, delivery => delivery.webhook) + @OneToMany(() => WebhookDelivery, (delivery) => delivery.webhook) deliveries: WebhookDelivery[]; } diff --git a/src/webhooks/filters/event.filter.ts b/src/webhooks/filters/event.filter.ts index 719bb5f..d3c8074 100644 --- a/src/webhooks/filters/event.filter.ts +++ b/src/webhooks/filters/event.filter.ts @@ -43,7 +43,8 @@ export class EventFilterService { if (key === '$in' && !value.includes(eventValue)) return false; if (key === '$nin' && !Array.isArray(value)) return false; if (key === '$nin' && value.includes(eventValue)) return false; - if (key === '$exists' && (value ? !eventValue : !!eventValue)) return false; + if (key === '$exists' && (value ? !eventValue : !!eventValue)) + return false; if (key === '$regex' && typeof eventValue === 'string') { const regex = new RegExp(value); if (!regex.test(eventValue)) return false; @@ -54,16 +55,27 @@ export class EventFilterService { } filterByEventType(events: string[], eventTypes: string[]): boolean { - return eventTypes.length === 0 || events.some(event => eventTypes.includes(event)); + return ( + eventTypes.length === 0 || + events.some((event) => eventTypes.includes(event)) + ); } - filterByTimeRange(timestamp: number, startTime?: number, endTime?: number): boolean { + filterByTimeRange( + timestamp: number, + startTime?: number, + endTime?: number, + ): boolean { if (startTime && timestamp < startTime) return false; if (endTime && timestamp > endTime) return false; return true; } - filterByAmount(amount: number, minAmount?: number, maxAmount?: number): boolean { + filterByAmount( + amount: number, + minAmount?: number, + maxAmount?: number, + ): boolean { if (minAmount !== undefined && amount < minAmount) return false; if (maxAmount !== undefined && amount > maxAmount) return false; return true; diff --git a/src/webhooks/webhook.controller.ts b/src/webhooks/webhook.controller.ts index 0ec3656..c6eae58 100644 --- a/src/webhooks/webhook.controller.ts +++ b/src/webhooks/webhook.controller.ts @@ -1,7 +1,30 @@ -import { Controller, Get, Post, Body, Patch, Param, Delete, Query, HttpStatus, HttpCode } from '@nestjs/common'; -import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiQuery } from '@nestjs/swagger'; +import { + Controller, + Get, + Post, + Body, + Patch, + Param, + Delete, + Query, + HttpStatus, + HttpCode, +} from '@nestjs/common'; +import { + ApiTags, + ApiOperation, + ApiResponse, + ApiParam, + ApiQuery, +} from '@nestjs/swagger'; import { WebhookService } from './webhook.service'; -import { CreateWebhookDto, UpdateWebhookDto, WebhookQueryDto, WebhookDeliveryQueryDto, TriggerWebhookDto } from './dto/webhook.dto'; +import { + CreateWebhookDto, + UpdateWebhookDto, + WebhookQueryDto, + WebhookDeliveryQueryDto, + TriggerWebhookDto, +} from './dto/webhook.dto'; import { Webhook } from './entities/webhook.entity'; import { WebhookDelivery } from './entities/webhook-delivery.entity'; @@ -12,7 +35,11 @@ export class WebhookController { @Post() @ApiOperation({ summary: 'Create a new webhook' }) - @ApiResponse({ status: 201, description: 'Webhook created successfully', type: Webhook }) + @ApiResponse({ + status: 201, + description: 'Webhook created successfully', + type: Webhook, + }) @ApiResponse({ status: 400, description: 'Bad request' }) async create(@Body() createWebhookDto: CreateWebhookDto): Promise { return this.webhookService.create(createWebhookDto); @@ -29,7 +56,11 @@ export class WebhookController { @Get(':id') @ApiOperation({ summary: 'Get webhook by ID' }) - @ApiResponse({ status: 200, description: 'Webhook retrieved successfully', type: Webhook }) + @ApiResponse({ + status: 200, + description: 'Webhook retrieved successfully', + type: Webhook, + }) @ApiResponse({ status: 404, description: 'Webhook not found' }) @ApiParam({ name: 'id', description: 'Webhook ID' }) async findOne(@Param('id') id: string): Promise { @@ -38,10 +69,17 @@ export class WebhookController { @Patch(':id') @ApiOperation({ summary: 'Update webhook' }) - @ApiResponse({ status: 200, description: 'Webhook updated successfully', type: Webhook }) + @ApiResponse({ + status: 200, + description: 'Webhook updated successfully', + type: Webhook, + }) @ApiResponse({ status: 404, description: 'Webhook not found' }) @ApiParam({ name: 'id', description: 'Webhook ID' }) - async update(@Param('id') id: string, @Body() updateWebhookDto: UpdateWebhookDto): Promise { + async update( + @Param('id') id: string, + @Body() updateWebhookDto: UpdateWebhookDto, + ): Promise { return this.webhookService.update(id, updateWebhookDto); } @@ -58,37 +96,68 @@ export class WebhookController { @Post('trigger') @HttpCode(HttpStatus.ACCEPTED) @ApiOperation({ summary: 'Trigger webhook event' }) - @ApiResponse({ status: 202, description: 'Webhook event triggered successfully' }) + @ApiResponse({ + status: 202, + description: 'Webhook event triggered successfully', + }) async trigger(@Body() triggerDto: TriggerWebhookDto): Promise { return this.webhookService.triggerWebhook(triggerDto); } @Get(':id/deliveries') @ApiOperation({ summary: 'Get webhook delivery history' }) - @ApiResponse({ status: 200, description: 'Delivery history retrieved successfully' }) + @ApiResponse({ + status: 200, + description: 'Delivery history retrieved successfully', + }) @ApiParam({ name: 'id', description: 'Webhook ID' }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) - async getDeliveries(@Param('id') id: string, @Query() query: WebhookDeliveryQueryDto) { + async getDeliveries( + @Param('id') id: string, + @Query() query: WebhookDeliveryQueryDto, + ) { return this.webhookService.getDeliveries(query.page, query.limit, id); } @Get('stats/delivery') @ApiOperation({ summary: 'Get delivery statistics' }) - @ApiResponse({ status: 200, description: 'Delivery statistics retrieved successfully' }) - @ApiQuery({ name: 'webhookId', required: false, description: 'Optional webhook ID to filter stats' }) + @ApiResponse({ + status: 200, + description: 'Delivery statistics retrieved successfully', + }) + @ApiQuery({ + name: 'webhookId', + required: false, + description: 'Optional webhook ID to filter stats', + }) async getDeliveryStats(@Query('webhookId') webhookId?: string) { return this.webhookService.getDeliveryStats(webhookId); } @Get('deliveries/all') @ApiOperation({ summary: 'Get all webhook deliveries' }) - @ApiResponse({ status: 200, description: 'All deliveries retrieved successfully' }) + @ApiResponse({ + status: 200, + description: 'All deliveries retrieved successfully', + }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) - @ApiQuery({ name: 'webhookId', required: false, description: 'Filter by webhook ID' }) - @ApiQuery({ name: 'status', required: false, description: 'Filter by status' }) + @ApiQuery({ + name: 'webhookId', + required: false, + description: 'Filter by webhook ID', + }) + @ApiQuery({ + name: 'status', + required: false, + description: 'Filter by status', + }) async getAllDeliveries(@Query() query: WebhookDeliveryQueryDto) { - return this.webhookService.getDeliveries(query.page, query.limit, query.webhookId); + return this.webhookService.getDeliveries( + query.page, + query.limit, + query.webhookId, + ); } } diff --git a/src/webhooks/webhook.service.spec.ts b/src/webhooks/webhook.service.spec.ts index 70a7af9..db61c94 100644 --- a/src/webhooks/webhook.service.spec.ts +++ b/src/webhooks/webhook.service.spec.ts @@ -5,7 +5,10 @@ import { ScheduleModule } from '@nestjs/schedule'; import { Repository } from 'typeorm'; import { WebhookService } from './webhook.service'; import { Webhook } from './entities/webhook.entity'; -import { WebhookDelivery, DeliveryStatus } from './entities/webhook-delivery.entity'; +import { + WebhookDelivery, + DeliveryStatus, +} from './entities/webhook-delivery.entity'; import { HmacAuthService } from './auth/hmac.auth'; import { EventFilterService } from './filters/event.filter'; import { CreateWebhookDto, TriggerWebhookDto } from './dto/webhook.dto'; @@ -77,8 +80,12 @@ describe('WebhookService', () => { .compile(); service = module.get(WebhookService); - webhookRepository = module.get>(getRepositoryToken(Webhook)); - deliveryRepository = module.get>(getRepositoryToken(WebhookDelivery)); + webhookRepository = module.get>( + getRepositoryToken(Webhook), + ); + deliveryRepository = module.get>( + getRepositoryToken(WebhookDelivery), + ); hmacAuthService = module.get(HmacAuthService); eventFilterService = module.get(EventFilterService); }); @@ -105,7 +112,9 @@ describe('WebhookService', () => { const result = await service.create(createWebhookDto); - expect(mockWebhookRepository.create).toHaveBeenCalledWith(createWebhookDto); + expect(mockWebhookRepository.create).toHaveBeenCalledWith( + createWebhookDto, + ); expect(mockWebhookRepository.save).toHaveBeenCalledWith(expectedWebhook); expect(result).toEqual(expectedWebhook); }); @@ -143,7 +152,9 @@ describe('WebhookService', () => { await service.triggerWebhook(triggerDto); - expect(mockWebhookRepository.find).toHaveBeenCalledWith({ where: { active: true } }); + expect(mockWebhookRepository.find).toHaveBeenCalledWith({ + where: { active: true }, + }); expect(mockEventFilterService.matchesFilters).toHaveBeenCalledTimes(1); expect(mockDeliveryRepository.create).toHaveBeenCalledTimes(1); expect(mockDeliveryRepository.save).toHaveBeenCalledTimes(1); diff --git a/src/webhooks/webhook.service.ts b/src/webhooks/webhook.service.ts index 7626228..df54716 100644 --- a/src/webhooks/webhook.service.ts +++ b/src/webhooks/webhook.service.ts @@ -4,10 +4,17 @@ import { Repository, LessThan } from 'typeorm'; import { Cron, CronExpression } from '@nestjs/schedule'; import { HttpService } from '@nestjs/axios'; import { Webhook } from './entities/webhook.entity'; -import { WebhookDelivery, DeliveryStatus } from './entities/webhook-delivery.entity'; +import { + WebhookDelivery, + DeliveryStatus, +} from './entities/webhook-delivery.entity'; import { HmacAuthService } from './auth/hmac.auth'; import { EventFilterService } from './filters/event.filter'; -import { CreateWebhookDto, UpdateWebhookDto, TriggerWebhookDto } from './dto/webhook.dto'; +import { + CreateWebhookDto, + UpdateWebhookDto, + TriggerWebhookDto, +} from './dto/webhook.dto'; import { firstValueFrom } from 'rxjs'; @Injectable() @@ -29,7 +36,10 @@ export class WebhookService { return this.webhookRepository.save(webhook); } - async findAll(page = 1, limit = 10): Promise<{ webhooks: Webhook[]; total: number }> { + async findAll( + page = 1, + limit = 10, + ): Promise<{ webhooks: Webhook[]; total: number }> { const [webhooks, total] = await this.webhookRepository.findAndCount({ skip: (page - 1) * limit, take: limit, @@ -45,7 +55,10 @@ export class WebhookService { }); } - async update(id: string, updateWebhookDto: UpdateWebhookDto): Promise { + async update( + id: string, + updateWebhookDto: UpdateWebhookDto, + ): Promise { await this.webhookRepository.update(id, updateWebhookDto); return this.findOne(id); } @@ -66,15 +79,24 @@ export class WebhookService { } } - private shouldTriggerWebhook(webhook: Webhook, triggerDto: TriggerWebhookDto): boolean { + private shouldTriggerWebhook( + webhook: Webhook, + triggerDto: TriggerWebhookDto, + ): boolean { if (!webhook.events.includes(triggerDto.eventType)) { return false; } - return this.eventFilterService.matchesFilters(triggerDto.data, webhook.filters || {}); + return this.eventFilterService.matchesFilters( + triggerDto.data, + webhook.filters || {}, + ); } - private async queueWebhookDelivery(webhook: Webhook, triggerDto: TriggerWebhookDto): Promise { + private async queueWebhookDelivery( + webhook: Webhook, + triggerDto: TriggerWebhookDto, + ): Promise { const delivery = this.deliveryRepository.create({ webhookId: webhook.id, webhook, @@ -85,7 +107,7 @@ export class WebhookService { }); await this.deliveryRepository.save(delivery); - + setImmediate(() => this.processWebhookDelivery(delivery.id)); } @@ -101,11 +123,11 @@ export class WebhookService { } const startTime = Date.now(); - + try { const { signature, timestamp } = this.hmacAuthService.signWebhook( delivery.payload, - delivery.webhook.secret + delivery.webhook.secret, ); const payload = { @@ -124,7 +146,7 @@ export class WebhookService { 'User-Agent': 'CurrentDao-Webhook/1.0', }, timeout: delivery.webhook.timeoutMs, - }) + }), ); const duration = Date.now() - startTime; @@ -137,17 +159,26 @@ export class WebhookService { deliveredAt: new Date(), }); - await this.webhookRepository.increment({ id: delivery.webhookId }, 'deliveryCount', 1); - - this.logger.log(`Webhook delivered successfully: ${deliveryId} to ${delivery.webhook.url}`); + await this.webhookRepository.increment( + { id: delivery.webhookId }, + 'deliveryCount', + 1, + ); + this.logger.log( + `Webhook delivered successfully: ${deliveryId} to ${delivery.webhook.url}`, + ); } catch (error) { const duration = Date.now() - startTime; await this.handleFailedDelivery(delivery, error, duration); } } - private async handleFailedDelivery(delivery: WebhookDelivery, error: any, duration: number): Promise { + private async handleFailedDelivery( + delivery: WebhookDelivery, + error: any, + duration: number, + ): Promise { const attemptNumber = delivery.attemptNumber + 1; const maxRetries = delivery.webhook.maxRetries; @@ -159,13 +190,22 @@ export class WebhookService { duration, }); - await this.webhookRepository.increment({ id: delivery.webhookId }, 'failureCount', 1); + await this.webhookRepository.increment( + { id: delivery.webhookId }, + 'failureCount', + 1, + ); - this.logger.error(`Webhook delivery failed permanently: ${delivery.id}`, error); + this.logger.error( + `Webhook delivery failed permanently: ${delivery.id}`, + error, + ); return; } - const nextRetryAt = new Date(Date.now() + this.calculateBackoffDelay(attemptNumber)); + const nextRetryAt = new Date( + Date.now() + this.calculateBackoffDelay(attemptNumber), + ); await this.deliveryRepository.update(delivery.id, { status: DeliveryStatus.RETRYING, @@ -175,7 +215,9 @@ export class WebhookService { duration, }); - this.logger.warn(`Webhook delivery failed, scheduling retry: ${delivery.id} in ${this.calculateBackoffDelay(attemptNumber)}ms`); + this.logger.warn( + `Webhook delivery failed, scheduling retry: ${delivery.id} in ${this.calculateBackoffDelay(attemptNumber)}ms`, + ); } private calculateBackoffDelay(attemptNumber: number): number { @@ -209,12 +251,18 @@ export class WebhookService { successRate: number; }> { const whereClause = webhookId ? { webhookId } : {}; - + const [total, success, failed, pending] = await Promise.all([ this.deliveryRepository.count({ where: whereClause }), - this.deliveryRepository.count({ where: { ...whereClause, status: DeliveryStatus.SUCCESS } }), - this.deliveryRepository.count({ where: { ...whereClause, status: DeliveryStatus.FAILED } }), - this.deliveryRepository.count({ where: { ...whereClause, status: DeliveryStatus.PENDING } }), + this.deliveryRepository.count({ + where: { ...whereClause, status: DeliveryStatus.SUCCESS }, + }), + this.deliveryRepository.count({ + where: { ...whereClause, status: DeliveryStatus.FAILED }, + }), + this.deliveryRepository.count({ + where: { ...whereClause, status: DeliveryStatus.PENDING }, + }), ]); const successRate = total > 0 ? (success / total) * 100 : 0; @@ -222,9 +270,13 @@ export class WebhookService { return { total, success, failed, pending, successRate }; } - async getDeliveries(page = 1, limit = 10, webhookId?: string): Promise<{ deliveries: WebhookDelivery[]; total: number }> { + async getDeliveries( + page = 1, + limit = 10, + webhookId?: string, + ): Promise<{ deliveries: WebhookDelivery[]; total: number }> { const whereClause = webhookId ? { webhookId } : {}; - + const [deliveries, total] = await this.deliveryRepository.findAndCount({ where: whereClause, relations: ['webhook'],